«ValueError: оптимизация параметра, который не требует градиентов», не понимает ошибку - PullRequest
0 голосов
/ 27 апреля 2020

как часть курса python онлайн, я разрабатываю программу искусственного интеллекта, которая может идентифицировать цветы. После моего первого представления мне сказали, что я забыл заморозить параметры после загрузки модели, чтобы они не изменялись во время backprop. Чтобы решить эту проблему, в блоке, в который я загружаю свою модель, я сделал это:


device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = models.vgg16(pretrained = True)    
model
for param in model.parameters():
    param.requires_grad = False

Затем, при запуске блока, в котором я определяю новую прямую связь (кодовый блок ниже, я получаю ошибку 'ValueError: оптимизация параметр, который не требует градиентов '

features = list(model.classifier.children())[:-1]

num_filters = model.classifier[len(features)].in_features
features.extend([
    nn.Linear(25088, 2048),
    nn.ReLU(True),
    nn.Linear(2048, 512),
    nn.ReLU(True),
    nn.Linear(512, 102),
    nn.LogSoftmax(dim=1)
])

model.classifier = nn.Sequential(*features)
criterion = nn.NLLLoss()
model = model.to('cuda')
optimizer = optim.Adam(model.classifier.parameters(), lr = 0.001)
model

Было бы здорово, если бы кто-нибудь мог мне помочь с этим.

1 Ответ

0 голосов
/ 28 апреля 2020

Вы пытаетесь оптимизировать замороженные параметры. Вы должны передать оптимизатору только те параметры, которые хотите оптимизировать, где require_grad = True not all.

params_to_update = []
for name, param in model.named_parameters():
    if param.requires_grad == True:
        params_to_update.append(param)
optimizer = optim.Adam(params_to_update, lr = 0.001)

См. Учебное пособие: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html#finetuning -the-con vnet

Только параметры слоя f c переданы оптимизатору.

...