因此,我正在尝试实现有关暹罗神经网络的this论文:Sumit Chopra,Raia Hadsell和Yann LeCun(2005)区别对待地学习相似性度量,并将其应用于面部验证。我使用的是CIFAR10 dataset,但有10个类。

为方便起见,复制了其中一只脚的规范。表示法: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

  • 我尝试过的内容
    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中没有“暹罗”核心层)。我知道还有implementations in Theano,如果我不能在keras中做到这一点,我会牢记这一点。

    谢谢!

    最佳答案

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

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

    这两个示例应该可以帮助您构建暹罗网络。

    关于conv-neural-network - 在Keras实现暹罗NN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38584268/

    10-12 19:55