TensorFlow中的暹罗神经网络
deep-learning
lstm
neural-network
tensorflow
4
0

我正在尝试在TensorFlow中实现一个暹罗神经网络,但实际上我在Internet上找不到任何有效的示例(请参阅Yann LeCun论文 )。

在此处输入图片说明

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

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

谢谢 :)

编辑 :我实现了一个连体网络的简单工作示例这里上MNIST。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

tf.layers更新

如果使用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() 。 (请参阅教程

使用具有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的距离),以及梯度将通过两个网络backpropagate,更新共享变量与梯度之和

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号