Keras的卷积二维暹罗网络

Ben*_*bey 6 deep-learning conv-neural-network keras

我正在尝试将Keras的Siamese图层与共享Convolution2D图层结合使用.我不需要输入在图层之前穿过任何其他图层,SiameseSiamese图层要求指定输入图层.我无法弄清楚如何创建输入层以匹配转换层的输入.Siamese我能找到的层的唯一具体例子是在测试中,Dense层(带矢量输入)用作输入.基本上,我想要一个输入层,允许我将图像尺寸指定为输入,以便将它们传递给共享的转换层.

在代码中我有类似以下内容:

img_rows = 28
img_cols = 28
img_input_shape = (1, img_rows, img_cols)

shared = Sequential()

shared.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                        border_mode='valid',
                        input_shape=img_input_shape))
shared.add(Activation('relu'))
# .... more layers, etc.

right_input_layer = SomeInputLayer(input_shape=img_input_shape) # what should SomeInputLayer be?
left_input_layer = SomeInputLayer(input_shape=img_input_shape)
siamese = Siamese(shared, [left_input_layer, right_input_layer], merge_mode='concat')

model = Sequential()
model.add(siamese)
# ...
model.compile(loss=contrastive_loss, optimizer='rmsprop')
Run Code Online (Sandbox Code Playgroud)

应该SomeInputLayer是什么?或者我的appraoch一般是不正确的?

Ben*_*bey 3

好吧,我明白了。“抽象”Layer类基本上是一个传递层,这正是我所需要的。我还犯了一个错误,我认为Siamese可以采用整个模型(即多个层),但实际上只需要一个层。为了减少创建这些暹罗层的痛苦,有一个add_shared_layer辅助函数。

我还应该指出这个拉取请求,它将允许模型中第一层的共享层,这正是我想要做的。

  • 我认为在处理暹罗网络时,“Graph” API 更容易使用。我已将这样的网络添加到 Keras 示例中[此处](https://github.com/fchollet/keras/blob/52f48e1f462090db19b03ae11dce2991487f70c9/examples/mnist_siamese_graph.py)。 (2认同)