Сиамская нейронная сеть в TensorFlow
Я пытаюсь реализовать сиамскую нейронную сеть в TensorFlow (пример сиамской сети), но я не могу найти ни одного рабочего примера в Интернете (см. бумага Янна Лекуна).
архитектура, которую я пытаюсь построить, будет состоять из двух lstms, разделяющих веса и подключенных только в конце сети.
мой вопрос: Как построить две разные нейронные сети, разделяющие их веса (связанные веса) в TensorFlow и как соединить их в конце?
спасибо :)
редактировать: я реализовал простой и рабочий пример сиамской сети здесь на MNIST.
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()
. (См. учебник)
реализовать первую сеть, используя переменную область с 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 между двумя сиамскими сетями), и градиенты будут возвращаться через оба сети, обновление общих переменных с помощью сумма градиентов.