这是fastai库中的代码。所以这个函数调用:
md = ColumnarModelData(PATH, ColumnarDataset.from_data_frame(trn_df, cat_flds=cat_vars, y=trn_y),
ColumnarDataset.from_data_frame(val_df, cat_flds=cat_vars, y=val_y), bs=128, test_ds=test_ds)
vars(md)结果如下:
{'path': 'data/rossmann/',
'test_dl': <fastai.dataloader.DataLoader at 0x112c93d68>,
'trn_dl': <fastai.dataloader.DataLoader at 0x112c93e80>,
'val_dl': <fastai.dataloader.DataLoader at 0x112c93a20>}但我可以通过执行以下操作来构建相同的结果:
md = {'path':PATH,
'test_dl':DataLoader(test_ds, batch_size=128, shuffle=False, num_workers=1),
'trn_dl':DataLoader(trn_df, batch_size=128, shuffle=False, num_workers=1),
'val_dl':DataLoader(val_df, batch_size=128*2, shuffle=False, num_workers=1)}
md这就给出了:
{'path': 'data/rossmann/',
'test_dl': <fastai.dataloader.DataLoader at 0x1c20e9cc88>,
'trn_dl': <fastai.dataloader.DataLoader at 0x1c20d5f8d0>,
'val_dl': <fastai.dataloader.DataLoader at 0x1c20d5f320>}然而,当尝试在其他函数中使用它们时,它们的行为非常不同。如下所示:
m = StructuredLearner(md, StructuredModel(to_gpu(model)), opt_fn=optim.Adam)当我使用md = ColumnarModelData()的初始方法时,它运行得很好,但当我自己构建它时,它就不起作用了,给出了这个错误:
AttributeError:'dict‘对象没有'path’属性
这里到底出了什么问题?
发布于 2018-06-02 03:02:21
您正在使用var( md )将类转换为字典,但md是类的实例,而不是字典。类可以使用点表示法(例如md.path)访问它们的属性,但是字典不能。
如果您查看Learner class ( StructuredLearner继承它),您将看到以下两行:
self.data_,self.models,self.metrics = data,models,metrics
self.models_path = models_name if os.path.isabs(models_name) else os.path.join(self.data.path, models_name)其中的关键部分是:
self.data = data和
self.data.path因此,您可以看到它正在尝试使用点符号访问数据(md)。
如果你真的想把你的字典转换成一个类,你可以这样做:https://codeyarns.com/2017/02/27/how-to-convert-python-dict-to-class-object-with-fields/
或
Convert nested Python dict to object?
我建议阅读文档,阅读库中的代码并创建自己的小项目,而不是试图将设计为协同工作的东西分成几个部分,但如何学习最好由您自己决定。
https://stackoverflow.com/questions/50648853
复制相似问题