【问题标题】:Converting tf.gradients to tensor type将 tf.gradients 转换为张量类型
【发布时间】:2020-06-19 21:31:26
【问题描述】:

我使用的是 tensorflow 1.14.0。我想知道如何将强制转换列表输入张量。尝试使用 tf.convert_to_tensor() 时出现此错误。感谢任何帮助

无法将类型对象转换为张量。内容:[无]。考虑将元素转换为支持的类型。

这是我的代码

def testtf4():
    x = tf.placeholder(tf.float32, shape=[None])
    y = tf.placeholder(tf.float32, shape=[None])
    op = tf.placeholder(tf.float32, shape=[None,3])

    print("\nshape of x,y", x.shape, y.shape)
    arr = np.genfromtxt("C:\\Data\\Training_and_codes\\ML\\TF Samples\\Data.csv", delimiter=",");
    gradmulx_op = tf.gradients(op[:,0],x)
    gradmuly_op = tf.gradients(op[:,0],y)
    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={}
        input_feed[x]=arr[:,0]
        input_feed[y]=arr[:,1]
        input_feed[op]=arr[:,2:4]
        [gradx, grady] = sess.run([tgradmulx_op, tgradmuly_op],input_feed)
        print("x gradient",gradx) 
        print("y gradient",grady) 

【问题讨论】:

  • 这里有多个问题,不需要将梯度转换为张量,它们已经是张量了。 tf.gradients 返回 None 因为在两个不相关的占位符之间没有要计算的梯度。
  • 感谢您的回复。我认为在 1.14 tf.gradients 返回列表 (github.com/tensorflow/docs/blob/r1.14/site/en/api_docs/python/…)。这只是一个示例代码,用于重现我在使用 tf.gradients 构建损失函数的较大项目中遇到的错误。我想将 tf.gradients 的 return 用于与其他张量的一些矩阵运算。如果我按原样使用它,则会弹出无法将类型为 的对象转换为张量的错误。内容:[无,无,无]。考虑将元素转换为支持的类型。
  • 当然,它返回张量列表,所以我看不到问题所在。你真的需要描述真正的问题,因为我现在不明白问题是什么,因为你已经掩盖了它。

标签: python tensorflow


【解决方案1】:

您的问题与tf.convert_to_tensor 无关,而是您尝试计算一些不存在的梯度这一事实。你有这两个占位符:

x = tf.placeholder(tf.float32, shape=[None])
op = tf.placeholder(tf.float32, shape=[None, 3])

然后您尝试获得以下渐变:

gradmulx_op = tf.gradients(op[:, 0], x)
gradmuly_op = tf.gradients(op[:, 0], y)

要使这些梯度存在(即不是None),op[:, 0] 的值必须是使用xy 进行的一项或多项可微运算的结果。例如,如果 op 被定义为:

op = tf.stack([2 * x + 3 * y, x - 1, 2 * y + 2], axis=1)

然后它会起作用,因为op[:, 0] 将根据xy(可能还有其他值)计算,所以张量之间存在梯度。或者,换一种说法,更改xy 会更改op[:, 0] 的值。 TensorFlow 会跟踪用于计算每个值的操作,并使用该信息自动计算梯度。

但是op不是从xy计算出来的,实际上它不是从任何东西计算出来的,因为它是一个占位符,它只是一个给定的值。 xy 的更改不会导致 op 的更改。所以这些张量之间没有梯度。我不确定你想用你的代码实现什么,但你可能需要重新考虑你想要计算的结果到底是什么。

【讨论】:

  • 谢谢。示例代码现在可以工作了。此外,导致我编写此示例的原始模型在网络图中缺少特征
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多