所以我正在尝试实施关于暹罗神经网络的this论文:与Sumit Chopra,Raia Hadsell和Yann LeCun一起区分性地学习相似性度量,并应用于面部验证 (2005年)。不过,我正在使用CIFAR10 dataset代替10个班级。
为方便起见,复制了其中一条腿的规格。符号:C_x是卷积层,S_x是子采样层,F_x是完全连接的层;使用共享索引x:
我尝试过什么
model = Sequential()
#C1
model.add(Convolution2D(15, 7, 7,
activation='relu',
border_mode='same',
input_shape=input_img_shape))
print("C1 shape: ", model.output_shape)
#S2
model.add(MaxPooling2D((2,2), border_mode='same'))
print("S2 shape: ", model.output_shape)
#...
#C5
model.add(Convolution2D(250, 5, 5,
activation='relu',
border_mode='same'))
print("C5 shape: ", model.output_shape)
#F6
model.add(Dense(50))
这会抛出一条长错误信息,我认为这是一个重塑错误。错误的片段:
Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
我知道问题在最终的Dense层中是孤立的,因为如果我将其注释掉,代码会顺利进行。但我不确定我应该如何塑造/指定我的最终完全连接层,以便它与先前的卷积层兼容?
我看过的一些地方
This是一个相关的问题,虽然实现略有不同(似乎在撰写本文时keras中没有'Siamese'核心层)。我知道还有implementations in Theano,如果我不能在keras中做到,我会记住这一点。
谢谢!
答案 0 :(得分:4)
如Matias Valdenegro所述,Keras已经有Siamese network的例子。但是,该示例仅使用密集层。
您的问题是,您需要在卷积图层和密集图层之间添加Flatten
图层以获得正确的形状,请参阅this Keras CNN example
这两个例子可以帮助你建立你的暹罗网络。
答案 1 :(得分:2)
您不需要Siamese Layer,只需使用Keras functional API创建一个具有两个输入和一个输出的模型。
似乎Keras示例already contain的模型与您正在实施的模型非常相似。