Разделите обученную нейронную сеть на 2 части и используйте последнюю часть - PullRequest
0 голосов
/ 23 октября 2018

У меня есть простой автоэнкодер DNN с 4 слоями свертки, за которыми следуют 4 слоя деконволюции.

import tensorflow.contrib.layers as lays

conv1 = lays.conv2d(inputs, 64, [5, 5], stride=2, padding='SAME')
conv2 = lays.conv2d(conv1, 32, [5, 5], stride=2, padding='SAME')
conv3 = lays.conv2d(conv2, 16, [5, 5], stride=4, padding='SAME')
conv4 = lays.conv2d(conv3, 100, [5, 5], stride=4, padding='SAME')  #shape (None,1,1,100)

dconv1 = lays.conv2d_transpose(conv4, 16, [5, 5], stride=4, padding='SAME')
dconv2 = lays.conv2d_transpose(dconv1, 32, [5, 5], stride=4, padding='SAME')
dconv3 = lays.conv2d_transpose(dconv2, 64, [5, 5], stride=2, padding='SAME')
dconv4 = lays.conv2d_transpose(dconv3, 1, [5, 5], stride=2, padding='SAME', activation_fn=tf.nn.tanh) #shape (64,64,1)

Здесь входные данные представляют собой (64,64) изображения в оттенках серого, и автоэнкодер восстанавливает то же входное изображение ввыходной слой (dconv4).

Обратите внимание, что целью этого автоэнкодера является не сегментирование, а представление изображения (64x64) в виде уникального тензора в форме (1,1100) с минимальными потерями.

КакВы можете видеть, что тензор conv4 имеет вид (Нет, 1,1 100), что мне и нужно.

После обучения этот автоэнкодер отлично работает для тестовых изображений.

Однако,Я заинтересован в том, чтобы разделить обученное DNN на части свертки и деконволюции, взять часть деконволюции, ввести свой собственный (None, 1,1100) тензор в слой dconv1 и наблюдать результат на dconv4.

Как мнепередать свой собственный вклад в тензор в середине нейронной сети (conv4)?

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете рассмотреть возможность замены

dconv1 = lays.conv2d_transpose(conv4, 16, [5, 5], stride=4, padding='SAME')

на placeholder_with_default следующим образом:

latent_ph = tf.placeholder_with_default(conv4, [None, 1, 1, 100], name="latent_ph")
dconv1 = lays.conv2d_transpose(latent_ph, 16, [5, 5], stride=4, padding='SAME')

Таким образом, вы будете автоматически использовать conv4, но вы можете переключитьсякогда вы хотите передать другой диктофон в вызов session.run, когда вам нужно что-то другое:

with tf.Session() as sess:
    my_latent = np.random.random((10, 1, 1, 100))
    result = sess.run(dconv4, feed_dict={latent_ph: my_latent})

Если вы не хотите переучиваться, вам нужно загрузитьвеса с вашей контрольной точки и назначить их на новый график с заполнителем.Нечто подобное сделано здесь

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