Разница между диктом и атрибутами - PullRequest
0 голосов
/ 01 июня 2018

Это из библиотеки 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'

Что именно здесь не так?

1 Ответ

0 голосов
/ 01 июня 2018

Вы конвертируете класс в словарь, используя var (md), но md является экземпляром класса, а не словаря.Классы могут получить доступ к своим атрибутам с помощью точечной нотации (например, md.path), а словари - нет.

Если вы посмотрите на класс Learner (от которого наследуется 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/

или

Преобразовать вложенный диктон Python в объект?

Я бы порекомендовал прочитать документы.читая код библиотеки и создавая собственные небольшие проекты, вместо того, чтобы пытаться разбить что-то, предназначенное для совместной работы, на части, однако вам решать, как лучше всего учиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...