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

Split a trained neural network to 2 parts and use the latter part

我有一个简单的自动编码器 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) 重建相同的输入图像。

请注意,此自动编码器的objective不是进行分割,而是将(64x64)图像表示为具有最小损失的(1,1,100)形状的唯一张量。

可以看到,conv4张量的形状是(None,1,1,100),这就是我想要的。

训练后,此自动编码器可以很好地用于测试图像。

然而,我有兴趣将训练好的DNN拆分为卷积和反卷积部分,取反卷积部分,将我自己的(None,1,1,100)张量输入到dconv1层并观察输出dconv4.

如何将我自己的输入提供给神经网络 (conv4) 中间的张量?

你可以考虑更换

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