我在Tensorflow中有一个自动编码器模型,大致可以编写为(这是不切实际的简化示例):
x = tf.placeholder(tf.float32, input_shape, name='x')
# encoder part:
W = tf.Variable(tf.random_uniform(shape, -1, 1))
z = relu(tf.nn.conv2d(x, W, strides=[1, 2, 2, 1], padding='SAME'))
# decoder part:
y = relu(tf.nn.conv2d_transpose(z, W, shape_tr,
strides=[1, 2, 2, 1], padding='SAME'), b))
cost = tf.reduce_sum(tf.square(y - x))
所以我输入了占位符x
,中间代表z
,权重矩阵W
和输出y
。
然后我像这样训练我的模型:
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.run(optimizer, feed_dict={x: some_train_data})
现在给出一些测试数据,我可以检查模型的输出:
recon = sess.run(y, feed_dict={x: some_test_data})
我也可以获得该数据的中间表示
latent = sess.run(z, feed_dict={x: some_test_data})
我想要的是能够改变我的中间表示(z
)并获得解码结果y
。像这样:
recon = sess.run(y, feed_dict={z: some_fake_z})
当然,它不起作用,因为z
不是占位符,我有像You must feed a value for placeholder tensor 'x'
这样的错误。如果我提供x
,则结果将完全不依赖于z
(这也是我们可以预期的结果)。
所以我的问题是:如何运行一个将y
计算为z
的函数的子图,并将其与我自己的值z
一起提供?
答案 0 :(得分:2)
使用相同的变量创建另一个子图。
fake_z = tf.placeholder(z.dtype, z.name)
fake_y = relu(tf.nn.conv2d_transpose(fake_z, W, shape_tr,
strides=[1, 2, 2, 1], padding='SAME'), b))
现在你可以sess.run(fake_y, {fake_z: my_values})
。
如果您使用tf.layers
,则还应使用variable_scope
确保图层权重相同。
这是静态图库的限制之一。你必须提前计划你需要计算的所有东西。