Сиамская нейронная сеть в 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 между двумя сиамскими сетями), и градиенты будут возвращаться через оба сети, обновление общих переменных с помощью сумма градиентов.