运行C3D-tensorflow的train_c3d_ucf101.py出现TypeError报错求助
解决TypeError: unsupported operand type(s) for +: 'dict_values' and 'dict_values'问题
这个问题我之前维护Python3下的老TensorFlow项目时也碰到过,本质是Python2和Python3在字典方法返回值上的差异导致的,给你一步步拆解解决:
错误原因
在Python2中,dict.values()会直接返回一个列表,所以可以用+运算符直接合并两个列表;但到了Python3(包括你用的3.5版本),dict.values()返回的是一个dict_values视图对象——它是一个动态反映字典变化的迭代器,并不支持+这种列表拼接操作,所以执行weights.values() + biases.values()就会触发类型错误。
两种可行的修复方案
方案1:将视图对象转为列表后再拼接
直接把weights.values()和biases.values()都转换成列表,再用+合并,这是最直观的修改方式,适合小数据量的场景:
修改第165行的代码:
varlist1 = list( set(list(weights.values()) + list(biases.values())) - set(varlist2) )
方案2:用itertools.chain合并迭代器(更高效)
如果你的模型参数较多,推荐用itertools.chain来合并两个迭代器,避免额外的列表内存开销,修改步骤如下:
- 先在文件顶部导入
chain:
from itertools import chain
- 然后修改第165行代码:
varlist1 = list( set(chain(weights.values(), biases.values())) - set(varlist2) )
验证说明
这两种方案都能适配你当前的Python3.5 + TensorFlow1.4环境,修改后重新运行train_c3d_ucf101.py应该就能绕过这个类型错误了。
内容的提问来源于stack exchange,提问作者lixun
相关产品推荐
相关产品推荐

