如何在CPU张量流

时间:2017-01-22 21:30:22

标签: python tensorflow

我在tensorflow中运行CNN。我使用tf.device(/ gpu:0)将所有变量放在gpu中,但似乎其中一些仍然在cpu中。当我运行我的代码时,我正在查看我的gpu utils,它上升到100%,然后下降到0%。

我知道如果我使用config.log_device_placement = True,我可以看到哪个变量被分配给哪个设备。但是因为我的代码中变量的数量很多,所以我找不到cpu中的哪一个。

那么,有什么方法可以让我看到哪些变量被固定到cpu? 或者,你知道为什么我的一些变量应该固定到cpu而我使用tf.device将它们分配给gpu?

顺便说一句,在我通过以下代码更改upsampler(简单插补器tf.image.resize_images)之后,这个问题发生了:

def unravel_argmax(argmax, shape):
    with tf.device(gpu_n):
        argmax_shape = argmax.get_shape()
        new_1dim_shape = tf.shape(tf.constant(0, shape=[tf.Dimension(4), argmax_shape[0]*argmax_shape[1]*argmax_shape[2]*argmax_shape[3]]))
        batch_shape = tf.constant(0, dtype=tf.int64, shape=[argmax_shape[0], 1, 1, 1]).get_shape()
        b = tf.multiply(tf.ones_like(argmax), tf.reshape(tf.range(shape[0]), batch_shape))
        y = argmax // (shape[2] * shape[3])
        x = argmax % (shape[2] * shape[3]) // shape[3]
        c = tf.ones_like(argmax) * tf.range(shape[3])
        pack = tf.stack([b, y, x, c])
        pack = tf.reshape(pack, new_1dim_shape)
        pack = tf.transpose(pack)
        return pack


def unpool_layer2x2_batch(updates, mask, ksize=[1, 2, 2, 1]):
    with tf.device(gpu_n):
        input_shape = updates.get_shape()
        new_dim_y = input_shape[1] * ksize[1]
        new_dim_x = input_shape[2] * ksize[2]
        output_shape = tf.to_int64((tf.constant(0, dtype=tf.int64, shape=[input_shape[0], new_dim_y, new_dim_x, input_shape[3]]).get_shape()))
        indices = unravel_argmax(mask, output_shape)
        new_1dim_shape = tf.shape(tf.constant(0, shape=[input_shape[0] * input_shape[1] * input_shape[2] * input_shape[3]]))
        values = tf.reshape(updates, new_1dim_shape)
        ret = tf.scatter_nd(indices, values, output_shape)
        return ret

我从here获取此代码用于解放。

1 个答案:

答案 0 :(得分:0)

您可以通过配置会话记录设备放置。设定:

  sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))