运行子图并提供中间变量

时间:2017-12-17 00:50:31

标签: python tensorflow

我在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一起提供?

1 个答案:

答案 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确保图层权重相同。

这是静态图库的限制之一。你必须提前计划你需要计算的所有东西。