我需要一些帮助来为带有images和label-text-file的普通目录中的暹罗CNN创建一个CaffeDB。最好的方法是做到这一点
问题不是遍历目录并制作图像对。我的问题更多的是用这些对来制作CaffeDB
到目前为止,我只使用convert_imageset
从图像目录中创建了一个CaffeDB
谢谢你的帮助!
答案 0 :(得分:6)
为什么不用简单的旧convert_imagest
制作两个数据集?
layer {
name: "data_a"
top: "data_a"
top: "label_a"
type: "Data"
data_param { source: "/path/to/first/data_lmdb" }
...
}
layer {
name: "data_b"
top: "data_b"
top: "label_b"
type: "Data"
data_param { source: "/path/to/second/data_lmdb" }
...
}
至于损失,因为每个示例都有一个类标签,您需要将label_a
和label_b
转换为same_not_same_label
。我建议你这样做"在飞行中"使用python层。在prototxt
添加对python层的调用:
layer {
name: "a_b_to_same_not_same_label"
type: "Python"
bottom: "label_a"
bottom: "label_b"
top: "same_not_same_label"
python_param {
# the module name -- usually the filename -- that needs to be in $PYTHONPATH
module: "siamese"
# the layer name -- the class name in the module
layer: "SiameseLabels"
}
propagate_down: false
}
创建siamese.py
(确保它在您的$PYTHONPATH
中)。在siamese.py
中,您应该拥有图层类:
import sys, os
sys.path.insert(0,os.environ['CAFFE_ROOT'] + '/python')
import caffe
class SiameseLabels(caffe.Layer):
def setup(self, bottom, top):
if len(bottom) != 2:
raise Exception('must have exactly two inputs')
if len(top) != 1:
raise Exception('must have exactly one output')
def reshape(self,bottom,top):
top[0].reshape( *bottom[0].shape )
def forward(self,bottom,top):
top[0].data[...] = (bottom[0].data == bottom[1].data).astype('f4')
def backward(self,top,propagate_down,bottom):
# no back prop
pass
确保以不同的方式对两组中的示例进行随机播放,这样您就可以得到非平凡的对。此外,如果您使用不同数量的示例构造第一个和第二个数据集,那么您将在每个时期看到不同的对;)
确保构建网络以共享重复图层的权重,有关详细信息,请参阅this tutorial。