TensorFlow 中的连体神经网络

Siamese Neural Network in TensorFlow

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

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

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

谢谢:)

编辑:我在 MNIST 上实现了一个简单且有效的孪生网络示例 here

更新 tf.layers

如果你使用tf.layers模块构建你的网络,你可以简单地使用参数reuse=True作为Siamese网络的第二部分:

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() 来获取第一个网络中使用的相同变量。这样,变量将 shared.

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