#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
Я нахожу, что эта страница достаточно хорошо суммирует это различие.