TensorFlow 中的连体神经网络

Posted

技术标签:

【中文标题】TensorFlow 中的连体神经网络【英文标题】:Siamese Neural Network in TensorFlow 【发布时间】:2016-08-19 02:24:04 【问题描述】:

我正在尝试在 TensorFlow 中实现连体神经网络,但我在 Internet 上找不到任何工作示例(请参阅 Yann LeCun paper)。

我正在尝试构建的架构将由两个共享权重的 LSTM 组成,并且仅在网络末端连接。

我的问题是:如何在 TensorFlow 中构建两个不同的神经网络共享它们的权重(绑定权重),以及最后如何将它们连接起来?

谢谢:)

编辑:我在 MNIST 上实现了一个简单有效的连体网络 here 示例。

【问题讨论】:

【参考方案1】:

更新为tf.layers

如果您使用tf.layers 模块来构建您的网络,您可以简单地将参数reuse=True 用于连体网络的第二部分:

x = tf.ones((1, 3))
y1 = tf.layers.dense(x, 4, name='h1')
y2 = tf.layers.dense(x, 4, name='h1', reuse=True)

# y1 and y2 will evaluate to the same values
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(y1))
print(sess.run(y2))  # both prints will return the same values

tf.get_variable 的旧答案

您可以尝试使用函数tf.get_variable()。 (见tutorial)

使用reuse=False 的变量范围实现第一个网络:

with tf.variable_scope('Inference', reuse=False):
    weights_1 = tf.get_variable('weights', shape=[1, 1],
                              initializer=...)
    output_1 = weights_1 * input_1

然后用相同的代码实现第二个,除了使用reuse=True

with tf.variable_scope('Inference', reuse=True):
    weights_2 = tf.get_variable('weights')
    output_2 = weights_2 * input_2

第一个实现将创建并初始化 LSTM 的每个变量,而第二个实现将使用tf.get_variable() 来获取第一个网络中使用的相同变量。这样,变量将被共享

然后你只需要使用你想要的任何损失(例如,你可以使用两个孪生网络之间的 L2 距离),梯度将通过两个网络反向传播,用梯度的 总和更新共享变量

【讨论】:

您也可以定义一次所有变量,例如weights = tf.Variable(...),然后在每次推理中使用这些变量output_1 = weights * input_1output_2 = weights * input_2。与共享变量一样,这里的变量weights 将接收两个梯度和两个梯度更新。 我有一个疑问,是否有必要使用 tf.get_variable()?我们可以直接使用 tf.conv2d() 而不使用 tf.get_variable() 创建变量吗? @kunal18 : 我用tf.layers添加了一个例子 感谢您的更新!你能在这里看看我的问题吗:***.com/questions/48266886/…

以上是关于TensorFlow 中的连体神经网络的主要内容,如果未能解决你的问题,请参考以下文章

找出两个卷积神经网络(CNN)的输出之间的距离,即连体网络

如何在 Keras 中使用预训练的 CNN 实现连体网络?

TensorFlow 在忽略范围名称或进入新范围名称时恢复

用于 Keras 中句子相似性的具有 LSTM 的连体网络定期给出相同的结果

初始化模型时 GPU 内存不足

TensorFlow 中的卷积网络