Keras中的卷积Siamese网络

6
我正在尝试将Keras的连体层与共享的Convolution2D层结合使用。在Siamese层之前,我不需要输入通过任何其他层,但是Siamese层要求指定输入层。我无法想出如何创建与卷积层输入匹配的输入层。我能找到的唯一一个具体的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')

“SomeInputLayer”应该是什么?或者说我的方法一般来说是错误的吗?

1个回答

3

好的,我明白了。"抽象" Layer 类基本上是一个传递层,这正是我所需要的。我还犯了一个错误,认为 Siamese 可以接受整个模型(即多个层),但实际上它只接受单个层。为了让创建这些 Siamese 层更加容易,有一个 add_shared_layer 辅助函数。

我还应该指出这个pull request,它允许共享层成为模型中的第一层,这正是我想要做的。


2
我认为在处理孪生网络时,Graph API 更加直观易用。我已经将这样一个网络添加到了 Keras 的示例中此处 - Mikael Rousson
感谢@MikaelRousson!图形API似乎更适合这个问题。我刚刚实现了你添加到Keras的相同MNIST示例(但使用了卷积神经网络),我同意图形版本读起来更好。 - Ben Mabey
@MikaelRousson 是否有一种简单的方法可以在您的代码中添加三元组?如果是这样,它将需要在 add_node 部分输出2个输出(2个成对距离)。 - entropiece
@entropiece 是的,这应该相对简单:网络需要一个额外的输入和一个新的距离函数,它需要三个输入。如果你成功了,请告诉我。 - Mikael Rousson
1
我猜现在应该使用函数式API而不是Graph,因为在Keras文档中似乎再也没有提到Graph了。 - Plankalkül
1
没错,新的函数式 API 取代了图形 API,在我看来更易于使用。您可以在 Keras 存储库中找到使用函数式 API 创建孪生网络的示例。 - Ben Mabey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接