运行GitHub下载的CNN训练代码报AttributeError: 'list'对象无'value'属性
错误原因
tf.compat.v1.summary.FileWriter的add_summary方法要求传入单个序列化的Summary proto对象,你的代码中存在两处问题触发报错:
- 类初始化时
self.summaries被定义为存储多个summary op的列表 - 训练步执行
sess.run后step_data['summaries']是多个Summary对象组成的列表,直接传入add_summary时方法尝试访问列表的value属性失败,触发类型错误。
修复方案
方案1(推荐):合并所有summary为单个对象
在所有summary op添加到self.summaries列表之后,新增一行合并操作:
# 放在__init__方法中self._setup_prediction()调用之后即可 self.merged_summaries = tf.compat.v1.summary.merge(self.summaries)
修改_train_step方法中tofetch的配置:
tofetch['summaries'] = self.merged_summaries
该方案会把所有summary合并为一个对象写入日志,是TensorFlow summary的标准使用方式。
方案2:遍历列表逐个写入
如果需要单独处理每个summary,直接修改写入summary的代码段:
# 把原来的单行add_summary调用替换为下面的遍历逻辑 for summary_item in step_data['summaries']: self.summary_writer.add_summary(summary_item, global_step=step)
其他说明
日志中的GPU库缺失、旧接口弃用警告均为TensorFlow版本兼容性问题,不影响核心训练逻辑,你使用的是TensorFlow 1.x风格的代码运行在2.x环境中,若要消除警告可按照日志提示将旧的队列式数据接口替换为tf.data系列接口即可。
内容的提问来源于stack exchange,提问作者B_King
相关产品推荐
相关产品推荐

