TensorFlow 1.14中tf.gradients结果转Tensor报错求助
解决tf.gradients返回列表转Tensor时报错的问题
首先咱们得揪出报错的核心原因:你看到的Failed to convert object of type to Tensor. Contents: [None],本质是tf.gradients(op[:,0], x)返回了**[None]**——这说明张量op[:,0]和x之间完全没有计算依赖关系!TensorFlow没法计算一个和自变量毫无关联的张量的梯度,自然就返回了None,你拿着包含None的列表去转张量,不报错才怪。
问题出在哪?
看你的代码,op是个独立的占位符,和x、y没有任何运算关联。也就是说op的值不是由x或y计算出来的,对x/y求导的结果必然是None,这是梯度计算的正常逻辑,不是TensorFlow的bug。
怎么解决?
你得让op成为x和y的计算产物,这样TensorFlow才能追踪它们的依赖链,算出有效的梯度。比如咱们把op改成基于x、y的运算,比如简单的线性组合:
import tensorflow as tf import numpy as np def testtf4(): x = tf.placeholder(tf.float32, shape=[None]) y = tf.placeholder(tf.float32, shape=[None]) # 修改op:让它由x和y计算得到,这里构造一个3列的张量,第一列是x+y op_col0 = x + y op_col1 = x * 2 op_col2 = y * 3 op = tf.stack([op_col0, op_col1, op_col2], axis=1) print("\nshape of x,y", x.shape, y.shape) arr = np.genfromtxt("C:\\Data\\Training_and_codes\\ML\\TF Samples\\Data.csv", delimiter=","); # 现在op[:,0]和x、y有依赖,梯度不再是None # 注意:tf.gradients返回的是长度为1的列表,要取出里面的张量 gradmulx_op = tf.gradients(op[:,0], x)[0] gradmuly_op = tf.gradients(op[:,0], y)[0] # 这里其实gradmulx_op已经是张量了,转不转都可以 tgradmulx_op = tf.convert_to_tensor(gradmulx_op) tgradmuly_op = tf.convert_to_tensor(gradmuly_op) print("\nshape of gradmul tensors", tgradmulx_op.shape, tgradmuly_op.shape) with tf.Session() as sess: print("started session......\n") input_feed = { x: arr[:,0], y: arr[:,1] } # 现在不需要喂op了,因为op是由x和y计算出来的 gradx, grady = sess.run([tgradmulx_op, tgradmuly_op], feed_dict=input_feed) print("x gradient", gradx) print("y gradient", grady)
额外提醒
tf.gradients的返回值永远是列表,哪怕只对一个自变量求导,它也会返回长度为1的列表。所以正确做法是用[0]取出里面的张量,而不是直接把整个列表传给tf.convert_to_tensor。- 如果你的业务逻辑里
op必须是占位符(比如是外部输入的),那对x/y求导本来就没有意义——它们之间没有依赖关系,这时候你得重新审视模型设计,确认是否真的需要计算这个梯度。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

