首页 文章

在Keras实施暹罗NN

提问于
浏览
9

因此,我正在努力实施关于暹罗神经网络的论文: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 回答

  • 4

    如Matias Valdenegro所述,Keras已经有一个Siamese network的例子 . 但是,该示例仅使用密集层 .

    您的问题是您需要在卷积图层和密集图层之间添加 Flatten 图层以获得正确的形状,请参阅this Keras CNN example

    这两个示例应该可以帮助您构建Siamese网络 .

  • 2

    您不需要Siamese Layer,只需使用Keras functional API创建具有两个输入和一个输出的模型 .

    似乎Keras示例already contain一个与您正在实施的模型非常相似的模型 .

相关问题