Tensorflow:嵌套map_fn的GPU渐变

时间:2017-09-15 17:33:42

标签: tensorflow gpu gradients

当我使用CPU作为设备时,下面的代码工作正常,但是在使用GPU时失败了。这是我得到的错误:

  

InvalidArgumentError(请参阅上面的回溯):无法分配设备   对于操作' Adam / update_Variable / Cast_5':无法满足   显式设备规范' /设备:GPU:0'因为没有支持   可以使用GPU设备的内核。

基于此,我假设嵌套的map_fn调用没有GPU渐变,是这样吗?如果是真的,我有没有办法实现同一段代码,所以它可以在GPU上工作,同时保留两个嵌套函数?

感谢。

import numpy as np
import tensorflow as tf


def loop_inner(x):
    return tf.reduce_sum(tf.square(x))


def loop_outer(x):
    return tf.map_fn(lambda x: loop_inner(x), x)

np.random.seed(10)
io, d, k, m = 2, 4, 3, 2
A = np.random.random((io, d, k, m))

with tf.device('/cpu:0'):

    sess = tf.Session()
    A = tf.Variable(A)
    B = tf.map_fn(lambda x: loop_outer(x), A)

    L = tf.reduce_sum(B)
    optim = tf.train.AdamOptimizer(learning_rate=0.1).minimize(L)

sess.run(tf.global_variables_initializer())

for i in range(1000):
    sess.run(optim)
    print(sess.run(L))

1 个答案:

答案 0 :(得分:0)

我认为这与嵌套的map_fn 无关,因为简单的非嵌套map_fn会导致该错误:

import numpy as np
import tensorflow as tf


def my_fn(x, y):
    return x * y

with tf.device('/gpu:0'):
    a = np.array([[1, 2, 3], [2, 4, 1], [5, 1, 7]])
    b = np.array([[1, -1, -1], [1, 1, 1], [-1, 1, -1]])
    elems = (a, b)

    sess = tf.Session()
    B = tf.map_fn(lambda x: my_fn(x[0], x[1]), elems, dtype=tf.int32)

sess.run(tf.global_variables_initializer())

print(sess.run(B))

错误是这样的:

  

InvalidArgumentError(请参阅上面的回溯):无法分配设备   对于'map / TensorArray_2'的操作:无法满足显式设备   规范''因为节点与一组节点共存   需要不兼容的设备'/设备:GPU:0'共置调试   信息:主机托管组具有以下类型和设备:Mul:CPU   TensorArrayGatherV3:GPU CPU范围:GPU CPU TensorArrayWriteV3:CPU   TensorArraySizeV3:GPU CPU输入:GPU CPU TensorArrayV3:CPU Const:   中央处理器            [[节点:map / TensorArray_2 = TensorArrayV3clear_after_read = true,dtype = DT_INT32,   dynamic_size = false,element_shape =,   tensor_array_name = “”]]

如果将gpu更改为cpu,则一切正常。