【问题标题】:Convolutional2D Siamese Network in KerasKeras 中的 Convolutional2D 连体网络
【发布时间】:2016-02-05 00:26:05
【问题描述】:

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

在代码中我有如下内容:

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 应该是什么?还是我的方法总体上不正确?

【问题讨论】:

    标签: deep-learning conv-neural-network keras


    【解决方案1】:

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

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

    【讨论】:

    • 我认为Graph API 在处理连体网络时更易于使用。我已经在 Keras 示例中添加了这样一个网络here
    • 谢谢@MikaelRousson! Graph API 看起来确实更适合这个。我刚刚实现了您添加到 Keras 的相同 MNIST 示例(但使用了一个 conv 网络),我同意图形版本读起来更好。
    • @MikaelRousson 有没有一种简单的方法可以用三元组扩展您的代码?在这种情况下,add_node 部分需要 2 个输出(2 个成对距离)
    • 我是否正确假设现在应该使用 功能 API 而不是 Graph? Keras 文档中似乎根本没有提到 Graph。
    • 没错,新的函数式 API 取代了图形 API,使用 IMO 更容易。您可以在 Keras 存储库中找到如何使用功能 API 创建连体网络的示例。
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多