TensorFlowにシャムニューラルネットワークを実装しようとしていますが、インターネット上で実際に動作する例は見つかりません( Yann LeCunの論文 を参照)。
私が構築しようとしているアーキテクチャは、重みを共有する2つのLSTMで構成され、ネットワークの終端でのみ接続されます。
私の質問は、TensorFlowで重み(結合重み)を共有する2つの異なるニューラルネットワークを構築する方法と、それらを最後に接続する方法ですか?
ありがとう:)
編集:シャムネットワークのシンプルで実用的な例 ここ をMNISTに実装しました。
tf.layers
_で更新_tf.layers
_モジュールを使用してネットワークを構築する場合は、シャムネットワークの2番目の部分に引数_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
_を使用する以外は同じコードで2番目を実装します
_with tf.variable_scope('Inference', reuse=True):
weights_2 = tf.get_variable('weights')
output_2 = weights_2 * input_2
_
最初の実装はLSTMのすべての変数を作成して初期化しますが、2番目の実装はtf.get_variable()
を使用して、最初のネットワークで使用されているのと同じ変数を取得します。そうすれば、変数はsharedになります。
次に、必要な損失をすべて使用する必要があります(たとえば、2つのシャムネットワーク間のL2距離を使用できます)。勾配は両方のネットワークを逆伝搬し、共有変数を合計で更新します勾配の。