web-dev-qa-db-ja.com

TensorFlowのシャムニューラルネットワーク

TensorFlowにシャムニューラルネットワークを実装しようとしていますが、インターネット上で実際に動作する例は見つかりません( Yann LeCunの論文 を参照)。

enter image description here

私が構築しようとしているアーキテクチャは、重みを共有する2つのLSTMで構成され、ネットワークの終端でのみ接続されます。

私の質問は、TensorFlowで重み(結合重み)を共有する2つの異なるニューラルネットワークを構築する方法と、それらを最後に接続する方法ですか?

ありがとう:)

編集:シャムネットワークのシンプルで実用的な例 ここ をMNISTに実装しました。

21
BiBi

_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距離を使用できます)。勾配は両方のネットワークを逆伝搬し、共有変数を合計で更新します勾配の

13