在Keras实施暹罗NN

And*_*Ito 9 conv-neural-network keras

因此,我正在尝试实施这篇关于Siamese神经网络的论文:Sumit Chopra,Raia Hadsell和Yann LeCun(2005),通过应用于面部验证来区分相似性度量.不过,我正在使用CIFAR10数据集,有10个类.

为方便起见,再现了一条腿的规格.符号:C_x是卷积层,S_x是子采样层,F_x是完全连接的层; 使用共享索引x:

  1. C1:特征映射:15,内核大小=(7,7)
  2. S2:特征图:15,视野=(2,2)
  3. C3:特征映射:45,内核大小=(6,6)
  4. S4:特征图:45,视野=(4,3)
  5. C5:特征映射:250,内核大小=(5,5)
  6. F6(完全连接层):没有.单位= 50

我试过的

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))
Run Code Online (Sandbox Code Playgroud)

这会抛出一条长错误信息,我认为这是一个重塑错误.错误的片段:

Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
Run Code Online (Sandbox Code Playgroud)

我知道问题是在最后的Dense层中被隔离的,因为如果我将它注释掉,代码会顺利进行.但我不确定我应该如何塑造/指定我的最终完全连接层,以便它与先前的卷积层兼容?

我看过的一些地方

是一个相关的问题,虽然实现略有不同(似乎在撰写本文时keras中没有'Siamese'核心层).我知道Theano中也有实现,如果我不能在keras中执行它,我会牢记这一点.

谢谢!

syt*_*rus 4

正如 Matias Valdenegro 提到的,Keras 已经有了Siamese 网络的示例。不过,该示例仅使用密集层。

你的问题是你需要Flatten在卷积层和密集层之间添加一个层以获得正确的形状,请参阅此 Keras CNN 示例

这两个例子应该可以帮助你建立你的连体网络。