Как проверить, является ли объект определенным оптимизатором PyTorch?

#python #pytorch

#python #pytorch

Вопрос:

Я хочу проверить класс таких объектов:

 from torch.optim import Adam, SGD, AdamW

adam_range = (0.8, 1.0)
adamw_range = (0.6, 0.7)
sgd_range = (0.0, 0.5)

targets = []
for cfg in configs:
    if isinstance(cfg["optimizer"], Adam):
        sample = np.random.uniform(low=adam_range[0], high=adam_range[1], size=1)
    elif isinstance(cfg["optimizer"], AdamW):
        sample = np.random.uniform(low=adamw_range[0], high=adamw_range[1], size=1)
    elif isinstance(cfg["optimizer"], SGD):
        sample = np.random.uniform(low=sgd_range[0], high=sgd_range[1], size=1)
  

где configs находится список dicts и cfg["optimizer"] являются неинициализированными ссылками from torch.optim import Adam, SGD, AdamW . Однако ни один из операторов if / elif не вычисляет True .

Как мне правильно проверить тип этих ссылок? Есть ли лучший способ, чем проверка cfg["optimizer"].__name__ ? Последнее кажется неэлегантным.

Спасибо.

Комментарии:

1. Не уверен, что cfg['optimizer'] в вашем скрипте optimizer=torch.optim.Adam(model.parameters(), lr=0.01);isinstance(optimizer,torch.optim.Adam) верно в моем случае.

2. Извините, это (неинициализированные) ссылки from torch.optim import Adam

Ответ №1:

Your cfg["optimizer"] — это не экземпляр какого-либо оптимизатора, а сам тип.
поэтому вы должны протестировать его следующим образом:

 for cfg in configs:
    if cfg["optimizer"] is Adam:
        sample = np.random.uniform(low=adam_range[0], high=adam_range[1], size=1)
    elif cfg["optimizer"] is AdamW:
        sample = np.random.uniform(low=adamw_range[0], high=adamw_range[1], size=1)
    elif cfg["optimizer"] is SGD:
        sample = np.random.uniform(low=sgd_range[0], high=sgd_range[1], size=1)
  

Чтобы подчеркнуть разницу между экземпляром Adam и типом Adam , попробуйте следующее:

 opt = Adam(model.parameters(), lr=0.1)  # make an _instance_ of Adam

isinstance(opt, Adam)  # True  - opt is an instance of Adam optimizer

isinstance(Adam, Adam) # False - Adam is a type, not an instance of Adam

isinstnace(Adam, type) # True  - "Adam" is a type not an instance of Adam

type(opt) is Adam      # True  - the type of opt is Adam

type(opt) == Adam      # True
  

Я нахожу, что эта страница достаточно хорошо суммирует это различие.