Как поделиться весами с помощью tf.layers.conv2d - PullRequest
0 голосов
/ 25 апреля 2018

Я построил авто-кодер, используя слои tf.layers.conv2d, и хотел бы обучить его поэтапно.То есть тренировать сначала внешние слои, затем средние, а затем внутренние.Я понимаю, что это возможно с помощью tf.nn.conv2d, потому что веса объявляются с помощью tf.get_variable, но я думаю, что это также возможно с использованием tf.layers.conv2d.

Если я введу новую переменную scope, другуюиз исходного графика, чтобы изменить входные данные для сверточных слоев (т.е. пропустить внутренние слои во время фазы 1), я не могу повторно использовать веса.Если я не введу новую переменную область действия, я не смогу зафиксировать веса, которые я не хочу тренировать на этом этапе.

В основном я пытаюсь использовать метод обучения от Аурелиана Жерона здесь https://github.com/ageron/handson-ml/blob/master/15_autoencoders.ipynb

За исключением того, что я хотел бы использовать cnn вместо плотных слоев.Как это сделать?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Нет необходимости создавать переменные вручную. Это работает так же хорошо:

import tensorflow as tf

inputs_1 = tf.placeholder(tf.float32, (None, 512, 512, 3), name='inputs_1')
inputs_2 = tf.placeholder(tf.float32, (None, 512, 512, 3), name='inputs_2')

with tf.variable_scope('conv'):
    out_1 = tf.layers.conv2d(inputs_1, 32, [3, 3], name='conv_1')

with tf.variable_scope('conv', reuse=True):
    out_2 = tf.layers.conv2d(inputs_2, 32, [3, 3], name='conv_1')

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(tf.trainable_variables())

Если вы дадите tf.layers.conv2d то же имя, он будет использовать те же веса (при условии reuse=True, в противном случае будет ValueError).

0 голосов
/ 25 апреля 2018

Я бы рекомендовал настроить его немного по-другому.Вместо того чтобы использовать tf.layers.conv2d, я бы явно делал весовые коэффициенты, используя вызовы tf.get_variable (), а затем использовал эти весовые коэффициенты для вызовов tf.nn.conv2d ().Таким образом, вы не заносите переменные в черный ящик и можете легко ссылаться на них.Это также хороший способ точно узнать, что происходит в вашей сети, поскольку вы написали фигуры для каждого набора весов вручную!

Пример (непроверенный) кода:

inputs = tf.placeholder(tf.float32, (batch_size, 512, 512, 3), name='inputs')
weights = tf.get_variable(name='weights', shape=[5, 5, 3, 16], dtype=tf.float32)

with tf.variable_scope("convs"):
    hidden_layer_1 = tf.nn.conv2d(input=inputs, filter=weights, stride=[1, 1, 1, 1], padding="SAME")
with tf.variable_scope("convs", reuse=True):
    hidden_layer_2 = tf.nn.conv2d(input=hidden_layer_1, filter=weights,stride=[1, 1, 1, 1], padding="SAME"

Этосоздает сверточные веса и применяет их дважды к вашему входу.Я не проверял этот код, поэтому могут быть ошибки, но он о том, как он должен выглядеть.Ссылки здесь для совместного использования переменных и здесь для tf.nn.conv2d .

Надеюсь, это поможет!Я был бы более тщательным, но я понятия не имею, как выглядит ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...