运行TensorFlow Wide&Deep线性回归脚本时遇AttributeError问题求助
解决TensorFlow Wide & Deep脚本中'list'对象无'model_dir'等属性的错误
嘿,我来帮你搞定这个头疼的问题!你遇到的AttributeError: 'list' object has no attribute 'model_dir'以及后续的data_dir同类错误,本质原因很明确:脚本里的参数解析环节出了问题——原本应该是一个带属性的参数对象,结果变成了列表,自然找不到model_dir这类属性啦。
下面给你一步步的解决方案:
1. 先试试用正确的命令行参数运行脚本
wide_deep.py原本就是设计成通过命令行传递参数的,直接裸跑脚本肯定会出问题。你需要在运行时指定必要的参数,比如:
python wide_deep.py --model_dir ./my_model_save_path --data_dir ./my_data_path
如果是在IDE里运行(比如PyCharm),记得去运行配置里添加这些命令行参数,不要直接点运行按钮哦。
2. 检查脚本里的参数解析代码
打开wide_deep.py,找到参数定义的部分,正常应该是类似这样的:
tf.flags.DEFINE_string("model_dir", "", "Directory for saving models.") tf.flags.DEFINE_string("data_dir", "", "Directory for storing data.") # 其他参数定义... FLAGS = tf.flags.FLAGS # 关键是这一行,要确保FLAGS是解析后的对象,不是列表
如果你不小心把FLAGS = tf.flags.FLAGS写成了FLAGS = [tf.flags.FLAGS](加了个中括号),那FLAGS就变成列表了,自然会触发属性找不到的错误。赶紧检查修复这部分。
3. 硬编码参数的正确姿势
如果你不想用命令行参数,非要硬编码的话,不能只改一处!要把代码里所有用到FLAGS.model_dir、FLAGS.data_dir的地方都替换成实际的路径字符串。比如:
- 把
estimator = tf.estimator.LinearClassifier(model_dir=FLAGS.model_dir, ...)改成estimator = tf.estimator.LinearClassifier(model_dir="./my_model_dir", ...) - 把
input_fn = lambda: input_fn_maker("train", FLAGS.data_dir, ...)改成input_fn = lambda: input_fn_maker("train", "./my_data_dir", ...)
只改某一处的话,其他地方调用FLAGS的属性还是会报错,这就是你之前硬编码后还出问题的原因。
按照上面的步骤调整后,再运行脚本应该就能正常跑起来啦!
内容的提问来源于stack exchange,提问作者BK54
相关产品推荐
相关产品推荐

