这来自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()
的初始方法时运行正常,但是当我自己构建它时不起作用,给出了这个错误:
属性错误:&#39; dict&#39;对象没有属性&#39;路径&#39;
这到底出了什么问题?
答案 0 :(得分:1)
您正在使用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?
我建议阅读文档,阅读图书馆的代码并创建自己的小项目,而不是试图打破旨在协同工作的部分,但是由你决定如何最好地学习。< / p>