在Keras实施暹罗NN

时间:2016-07-26 08:03:34

标签: conv-neural-network keras

所以我正在尝试实施关于暹罗神经网络的this论文:与Sumit Chopra,Raia Hadsell和Yann LeCun一起区分性地学习相似性度量,并应用于面部验证 (2005年)。不过,我正在使用CIFAR10 dataset代替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
  7. 我尝试过什么

    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中做到,我会记住这一点。

    谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

这两个例子可以帮助你建立你的暹罗网络。

答案 1 :(得分:2)

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

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