我的caffe学习之路

        今天说了下前几天的那篇图卷积的文章,还是用不了这么难的东西。所以路线回到原来的方案。

        我的任务还是改fcn,今天准备弄弄数据层,想先随便弄几个数据生成一个lmdb数据库

       

        写的时候遇到了一个问题弄了几个小时:我们的特征是float类型的,caffe输入的图像是8位的像素值,存储方式不一样,在将数据写入lmdb时遇到了一些麻烦。

        解决:caffe中定义了datum用来写lmdb,看他的proto可以发现是可以存float类型的数据的,代码如下:

message Datum {
  optional int32 channels = 1;
  optional int32 height = 2;
  optional int32 width = 3;
  // the actual image data, in bytes
  optional bytes data = 4;
  optional int32 label = 5;
  // Optionally, the datum could also hold float data.
  repeated float float_data = 6;
  // If true data contains an encoded image that need to be decoded
  optional bool encoded = 7 [default = false];
}

       可以看到有个repeated类型的float变量float_data需要解决的是如何存入这个变量,这个在io.py中其实有写如何将一个3维数组存入datum,代码如下:

def array_to_datum(arr, label=None): 
     """Converts a 3-dimensional array to datum. If the array has dtype uint8, 
     the output data will be encoded as a string. Otherwise, the output data 
     will be stored in float format. 
     """ 
     if arr.ndim != 3: 
         raise ValueError('Incorrect array shape.') 
     datum = caffe_pb2.Datum() 
     datum.channels, datum.height, datum.width = arr.shape 
     if arr.dtype == np.uint8: 
         datum.data = arr.tostring() 
     else: 
         datum.float_data.extend(arr.flat) 
     if label is not None: 
         datum.label = label 
     return datum 

       

利用datum.float_data.extend(arr.flat)就可以了,但这样可能报一个错(我就遇到了):TypeError: 1.0 has type , but expected one of:(, ,    )

        这算是caffe的一个bug,github上有人提出了这个bug:caffe.io.array_to_datum fails with some dtypes(需要科学上网)

        下面也给出了解决办法,即:arr.flat改为arr.astype(float).flat

        不知道后面是不是还有其他坑,先这样改着吧,反正到这篇博客发出的时候,caffe还没有修正这个问题。这样lmdb的生成问题就解决了,下一步看看怎么改lmdb的读入。

       

        数据层的参数有一个transform_param,里面定义了一些mean_value。查阅可知:caffe的Data层可以对数据进行预处理,减去平均值,镜像等等,其中平均值需要定义,即mean_value,可以设置一个,所有通道都减去同一个均值,或者设置和通道数相同的数目,对应相减,再caffe的src/caffe/proto/caffe.proto文件中有注释。暂时不想考虑,故删去。

        然而这个均值是有用的,这篇博客说:图片减去均值后,再进行训练和测试,会提高速度和精度。

        以后再加吧。run了下,并不能跑......明天debug+看看代码,卷积层改动不大但还是要看看中间过程,输出下,池化层需要大改。。。       

       
 

       

       



你可能感兴趣的:(caffe)