因此,我正在努力实施关于暹罗神经网络的论文:Sumit Chopra,Raia Hadsell和Yann LeCun(2005),通过面部验证的应用来区分相似性度量 . 不过,我正在使用CIFAR10 dataset,有10个 class .
为方便起见,再现了一条腿的规格 . 符号:C_x是卷积层,S_x是子采样层,F_x是完全连接的层;使用共享索引x:
-
C1:要素图:15,内核大小=(7,7)
-
S2:要素图:15,视野=(2,2)
-
C3:要素图:45,内核大小=(6,6)
-
S4:要素图:45,视野=(4,3)
-
C5:要素图:250,内核大小=(5,5)
-
F6(完全连接层):没有 . 单位= 50
What I've Tried
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层中被隔离的,因为如果我将它注释掉,代码会顺利进行 . 但我不确定我应该如何塑造/指定我的最终完全连接层,以便它与先前的卷积层兼容?
Some Places I've Looked
This是一个相关的问题,虽然实现略有不同(似乎没有't a ' Siamese ' core layer in keras at the time of this writing). I' m意识到还有implementations in Theano,我只能在keras中无法做到这一点 .
谢谢!
2 回答
如Matias Valdenegro所述,Keras已经有一个Siamese network的例子 . 但是,该示例仅使用密集层 .
您的问题是您需要在卷积图层和密集图层之间添加
Flatten
图层以获得正确的形状,请参阅this Keras CNN example这两个示例应该可以帮助您构建Siamese网络 .
您不需要Siamese Layer,只需使用Keras functional API创建具有两个输入和一个输出的模型 .
似乎Keras示例already contain一个与您正在实施的模型非常相似的模型 .