Can not convert a list into a Tensor or Operation 的错误

Posted

技术标签:

【中文标题】Can not convert a list into a Tensor or Operation 的错误【英文标题】:the error of Can not convert a list into a Tensor or Operation 【发布时间】:2017-02-08 13:18:26 【问题描述】:

在运行tensorflow program时,我一直有以下错误消息,其中主要部分类似于TypeError: Fetch argument[....]has invalid type <class 'list'>, must be a string or Tensor. (Can not convert a list into a Tensor or Operation.)直接导致此错误的相关代码段是_, loss, lr, gradients = sess.run((self.optimizer, self.net.cost, self.learning_rate_node, self.net.gradients_node), feed_dict=self.net.x: batch_x,self.net.y: util.crop_to_shape(batch_y,pred_shape), self.net.keep_prob: dropout)

我只是对导致这个错误信息的原因感到困惑,因为它可以被作者成功运行,如github帖子所示。

总的错误信息如下:

`Traceback(最近一次调用最后一次): _process_fetches 中的文件“/develop/tfw/lib/python3.4/site-packages/tensorflow/python/client/session.py”,第 480 行 允许操作=真) 文件“/develop/tfw/lib/python3.4/site-packages/tensorflow/python/framework/ops.py”,第 2301 行,在 as_graph_element % (type(obj).name, types_str)) TypeError:无法将列表转换为张量或操作。

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次): 文件“test.py”,第 30 行,在 路径 = trainer.train(生成器,“./unet_trained”,training_iters=20,epochs=100,display_step=2) 文件“/home/user/test/u-net/ver3/unet.py”,第 364 行,在火车中 self.net.keep_prob: 辍学) 运行中的文件“/develop/tfw/lib/python3.4/site-packages/tensorflow/python/client/session.py”,第 340 行 run_metadata_ptr) _run 中的文件“/develop/tfw/lib/python3.4/site-packages/tensorflow/python/client/session.py”,第 523 行 processes_fetches = self._process_fetches(fetches) _process_fetches 中的文件“/develop/tfw/lib/python3.4/site-packages/tensorflow/python/client/session.py”,第 493 行 % (subfetch, fetch, type(subfetch), str(e))) TypeError: Fetch argument [, , , , , , , , , , , , , , , , , , , ] of [, , , , , , , , , , , , , , , , , , ] 的类型无效,必须是字符串或张量。 (不能将列表转换为张量或操作。) `

【问题讨论】:

【参考方案1】:

如果您使用 Tensorflow 版本 r0.9 或之前的版本,Session.run 不会在 fetches 参数中接受任意嵌套的列表或元组。所以元组中的 self.net.gradients_node (张量列表)会导致您的 TypeError。这段代码应该在 TensorFlow r0.10 中工作。 如果您更喜欢留在 r0.9,请修改以下行:

_, loss, lr, gradients = sess.run((self.optimizer, self.net.cost, self.learning_rate_node, self.net.gradients_node), feed_dict=self.net.x: batch_x,self.net.y: util.crop_to_shape(batch_y,pred_shape), self.net.keep_prob: dropout)

list_of_outputs = sess.run([self.optimizer, self.net.cost, self.learning_rate_node]+ self.net.gradients_node, feed_dict=self.net.x: batch_x,self.net.y: util.crop_to_shape(batch_y,pred_shape), self.net.keep_prob: dropout)
loss = list_of_outputs[1]
lr = list_of_outputs[2]
gradients = list_of_outputs[2:]

或(使用 Python 3.*)

_,loss,lr,*gradients = sess.run([self.optimizer, self.net.cost, self.learning_rate_node]+ self.net.gradients_node, feed_dict=self.net.x: batch_x,self.net.y: util.crop_to_shape(batch_y,pred_shape), self.net.keep_prob: dropout)

这应该可以工作

【讨论】:

非常感谢。我会试一试。我们当前的版本是 0.8.0。 嗨,Corentin,请原谅我因为休假而迟到了回复。我按照您的建议尝试了,看起来它有效。但是,它为修改后的错误消息提供了另一条错误消息。 _,loss,lr,gradients = sess.run([self.optimizer, self.net.cost, self.learning_rate_node]+self.net.gradients_node,feed_dict=self.net.x: batch_x,self.net.y : util.crop_to_shape(batch_y, pred_shape),self.net.keep_prob: dropout) ValueError: too many values to unpack (expected 4) 没问题 user288609 ;)。好的,对于 ValueError,我忘记了一些事情: Session.run 函数返回一个具有相同提取大小的列表,因此 3+len(self.net.gradients_node) 在您的情况下。前 3 个值是 None、损失和学习率。并且列表的末尾都是模型的梯度。所以我修改了我的答案以手动解压缩这些变量。 非常感谢。这是一个非常简洁的答案。以前,我google了很多,我是这样修改代码的。 _,loss,lr,*gradients = sess.run([self.optimizer, self.net.cost, self.learning_rate_node]+self.net.gradients_node,feed_dict=‌​self.net.x: batch_x,self. net.y: util.crop_to_shape(batch_y, pred_shape),self.net.keep_prob: dropout) 具体来说,我在渐变之前添加了 *。看起来它有效,但坦率地说,我不太确定我真的明白为什么。我的猜测是渐变意味着很多嵌套的元组而不知道它们的确切数量。我只是使用 * 来捕获它们。 太好了,我不知道这个符号。但它似乎只适用于 python 3。对于渐变形状,它是一个列表,请参见 tf.gradients 规范。

以上是关于Can not convert a list into a Tensor or Operation 的错误的主要内容,如果未能解决你的问题,请参考以下文章

bug记录yolov7 AssertionError: train: No labels in ...train_list.cache. Can not train without

解决Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

解决Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

1290. Convert Binary Number in a Linked List to Integer

python类型错误:can only concatenate list (not "str") to list

Python3中出现UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in ra