我有一个简单的自动编码器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)中间的张量?
答案 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
完成了类似的操作