2016-02-05 29 views
4

我试图将Keras的Siamese图层与共享的Convolution2D图层一起使用。 我不需要输入在Siamese图层前通过任何其他图层,但Siamese图层需要指定输入图层。我无法弄清楚如何创建输入图层来匹配conv层的输入。我能找到的Siamese图层的唯一具体示例是tests,其中Dense图层(具有矢量输入)用作输入。基本上,我想要一个输入图层,允许我将图像尺寸指定为输入,以便它们可以传递到共享的conv层。Keras的Convolutional2D Siamese网络

在代码中,我有类似如下:

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') 

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

回答

3

好的,我想通了。 “抽象”类基本上是一个穿透层,这正是我所需要的。我还犯了一个错误,我认为Siamese可以采用整个模型(即多个图层),但实际上只采用单一图层。为了使这些连体层的创建变得不那么痛苦,有一个帮助函数add_shared_layer

我也应该指出这个pull request,这将允许共享层到模型的第一层,正是我想要做的。

+1

我认为'Graph' API在处理连体网络时更直接。我已经添加了这样一个网络Keras的例子[这里](https://github.com/fchollet/keras/blob/52f48e1f462090db19b03ae11dce2991487f70c9/examples/mnist_siamese_graph.py)。 –

+0

谢谢@MikaelRousson! Graph API似乎更适合于此。我刚刚实现了你添加到Keras中的MNIST示例(但是带有一个conv网络),我同意图形版本更好。 –

+0

@MikaelRousson有没有一种简单的方法来用三元组来扩展你的代码?在这种情况下,在add_node部分需要2个输出(2个成对距离) – entropiece