将训练有素的神经网络分成两部分,并使用后一部分

时间:2018-10-23 14:08:09

标签: python tensorflow deep-learning autoencoder

我有一个简单的自动编码器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,1,100)形状的唯一张量,且损失最小。

如您所见,conv4张量的形状是(None,1,1,100),这正是我想要的。

经过训练后,此自动编码器可以很好地处理测试图像。

但是,我感兴趣的是将经过训练的DNN分为卷积和反卷积部分,采用反卷积部分,将自己的(None,1,1,100)张量输入到dconv1层,并观察dconv4的输出。

如何将自己的输入馈送到神经网络(conv4)中间的张量?

1 个答案:

答案 0 :(得分:0)

您可以考虑更换

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,但是如果需要,可以通过将feed dict传递给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})

如果不想重新训练,则必须从检查点加载权重,并使用占位符将其分配给新图形。 here

完成了类似的操作