回归caffe的测试标签,不允许浮动?

时间:2015-08-02 18:05:21

标签: neural-network regression deep-learning caffe

我正在使用caffe进行回归,我的test.txttrain.txt文件是这样的:

/home/foo/caffe/data/finetune/flickr/3860781056.jpg 2.0  
/home/foo/caffe/data/finetune/flickr/4559004485.jpg 3.6  
/home/foo/caffe/data/finetune/flickr/3208038920.jpg 3.2  
/home/foo/caffe/data/finetune/flickr/6170430622.jpg 4.0  
/home/foo/caffe/data/finetune/flickr/7508671542.jpg 2.7272

我的问题是,当我在阅读时使用浮动标签时,似乎caffe不允许像2.0这样的浮动标签,例如仅'test.txt'文件caffe 认可

  

共1张图片

这是错误的。

但是当我例如在文件中将2.0更改为2并且以下行相同时,caffe现在给出了

  

共2张图片

暗示浮动标签是造成问题的原因。

任何人都可以帮助我,解决这个问题,我肯定需要使用浮动标签进行回归,所以有人知道解决方案或解决方案吗?提前谢谢。

修改的 对于遇到类似问题的任何人use caffe to train Lenet with CSV data可能会有所帮助。感谢@Shai。

4 个答案:

答案 0 :(得分:23)

使用图像数据集输入图层(带有lmdbleveldb后端)时,每个输入图像只支持一个整数标签。

如果要进行回归并使用浮点标签,则应尝试使用HDF5数据层。请参阅示例this question

在python中,您可以使用h5py包来创建hdf5文件。

import h5py, os
import caffe
import numpy as np

SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
y = np.zeros( (len(lines),1), dtype='f4' )
for i,l in enumerate(lines):
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
    # you may apply other input transformations here...
    # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
    # for example
    # transposed_img = img.transpose((2,0,1))[::-1,:,:] # RGB->BGR
    X[i] = transposed_img
    y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
    H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
    H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
    L.write( 'train.h5' ) # list all h5 files you are going to use

一旦您拥有所有h5个文件以及列出它们的相应测试文件,您就可以向train_val.prototxt添加HDF5输入图层:

 layer {
   type: "HDF5Data"
   top: "X" # same name as given in create_dataset!
   top: "y"
   hdf5_data_param {
     source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
     batch_size: 32
   }
   include { phase:TRAIN }
 }

<强>澄清
当我说“caffe每个输入图像只支持一个整数标签”时,我并不是说leveldb / lmdb容器是有限的,我的意思是caffe的工具,特别是convert_imageset工具。
仔细观察,似乎caffe在leveldb / lmdb中存储类型Datum的数据,并且此类型的“label”属性被定义为整数(请参阅caffe.proto),因此当使用caffe接口到leveldb / lmdb每个图像限制为一个int32标签。

答案 1 :(得分:3)

Shai's answer已涵盖将浮动标签保存为HDF5格式。如果需要/首选LMDB,这里有一个关于如何从浮点数据创建LMDB的片段(改编自this github评论):

import lmdb
import caffe
def scalars_to_lmdb(scalars, path_dst):

    db = lmdb.open(path_dst, map_size=int(1e12))

    with db.begin(write=True) as in_txn:    
        for idx, x in enumerate(scalars):            
            content_field = np.array([x])
            # get shape (1,1,1)
            content_field = np.expand_dims(content_field, axis=0)
            content_field = np.expand_dims(content_field, axis=0)
            content_field = content_field.astype(float)

            dat = caffe.io.array_to_datum(content_field)
            in_txn.put('{:0>10d}'.format(idx) dat.SerializeToString())
    db.close()

答案 2 :(得分:2)

我最终调换,切换频道顺序,并使用无符号整数而不是浮点数来获得结果。我建议您从HDF5文件中读取图像,以确保其正确显示。

首先将图像读取为无符号整数:

img = np.array(Image.open('images/' + image_name))

然后将频道顺序从RGB更改为BGR:

img = img[:, :, ::-1]

最后,从高度x宽度x通道切换到通道x高度x宽度:

img = img.transpose((2, 0, 1))

仅仅改变形状会扰乱你的形象并破坏你的数据!

要回读图像:

with h5py.File(h5_filename, 'r') as hf:
    images_test = hf.get('images')
    targets_test = hf.get('targets')
    for i, img in enumerate(images_test):
        print(targets_test[i])
        from skimage.viewer import ImageViewer
        viewer = ImageViewer(img.reshape(SIZE, SIZE, 3))
        viewer.show()

这是我编写的一个脚本,用于处理自动驾驶汽车任务的两个标签(转向和速度):enter image description here

答案 3 :(得分:1)

除了@Shai's answer之外,我还写了一个支持float类型标签的 MultiTaskData 图层。

其主要想法是将标签存储在float_data的{​​{1}}字段中,Datum将根据{{1}的值将它们解析为任意数量任务的标签在MultiTaskDataLayer中设置{}}和task_num。相关文件包括:label_dimensionnet.prototxtcaffe.proto

您可以轻松地将此图层添加到您自己的caffe中并像这样使用它(这是面部表情标签分发学习任务的示例,其中&#34; exp_label&#34;可以是浮点型矢量,例如[0.1 ,0.1,0.5,0.2,0.1]表示面部表情(5级)的概率分布。):

multitask_data_layer.hpp/cpp