Ошибка при использовании Vgg16 (обучение передаче) — Ошибка времени выполнения: Не удалось запустить torchinfo

#pytorch

Вопрос:

Я пытаюсь использовать VGG16 с обучением передаче, но получаю ошибки:

 model = torchvision.models.vgg16(pretrained=True) print(model) for param in model.parameters():  param.requires_grad = False  input_size = model.classifier[0].in_features  model.classifier[0] = nn.Sequential(  nn.Linear(input_size, 128), nn.ReLU(),  nn.Linear(128, 2))  torchinfo.summary(model, (64, 3, 224, 224))  

VGG16:

 VGG(  (features): Sequential(  (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (1): ReLU(inplace=True)  (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (3): ReLU(inplace=True)  (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)  (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (6): ReLU(inplace=True)  (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (8): ReLU(inplace=True)  (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)  (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (11): ReLU(inplace=True)  (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (13): ReLU(inplace=True)  (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (15): ReLU(inplace=True)  (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)  (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (18): ReLU(inplace=True)  (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (20): ReLU(inplace=True)  (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (22): ReLU(inplace=True)  (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)  (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (25): ReLU(inplace=True)  (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (27): ReLU(inplace=True)  (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  (29): ReLU(inplace=True)  (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)  )  (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))  (classifier): Sequential(  (0): Linear(in_features=25088, out_features=4096, bias=True)  (1): ReLU(inplace=True)  (2): Dropout(p=0.5, inplace=False)  (3): Linear(in_features=4096, out_features=4096, bias=True)  (4): ReLU(inplace=True)  (5): Dropout(p=0.5, inplace=False)  (6): Linear(in_features=4096, out_features=1000, bias=True)  ) )  

Ошибка:

 --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) ~/.local/lib/python3.8/site-packages/torchinfo/torchinfo.py in forward_pass(model, x, batch_dim, cache_forward_pass, device, **kwargs)  260 if isinstance(x, (list, tuple)): --gt; 261 _ = model.to(device)(*x, **kwargs)  262 elif isinstance(x, dict):  ~/.local/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)  1101 or _global_forward_hooks or _global_forward_pre_hooks): -gt; 1102 return forward_call(*input, **kwargs)  1103 # Do not call functions when jit is used  ~/.local/lib/python3.8/site-packages/torchvision/models/vgg.py in forward(self, x)  51 x = torch.flatten(x, 1) ---gt; 52 x = self.classifier(x)  53 return x  ~/.local/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)  1119  -gt; 1120 result = forward_call(*input, **kwargs)  1121 if _global_forward_hooks or self._forward_hooks:  ~/.local/lib/python3.8/site-packages/torch/nn/modules/container.py in forward(self, input)  140 for module in self: --gt; 141 input = module(input)  142 return input  ~/.local/lib/python3.8/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)  1119  -gt; 1120 result = forward_call(*input, **kwargs)  1121 if _global_forward_hooks or self._forward_hooks:  ~/.local/lib/python3.8/site-packages/torch/nn/modules/linear.py in forward(self, input)  102 def forward(self, input: Tensor) -gt; Tensor: --gt; 103 return F.linear(input, self.weight, self.bias)  104   ~/.local/lib/python3.8/site-packages/torch/nn/functional.py in linear(input, weight, bias)  1847 return handle_torch_function(linear, (input, weight, bias), input, weight, bias=bias) -gt; 1848 return torch._C._nn.linear(input, weight, bias)  1849   RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x2 and 4096x4096)  The above exception was the direct cause of the following exception:  RuntimeError Traceback (most recent call last) /tmp/ipykernel_8204/406510959.py in lt;modulegt;  11 nn.Linear(128, 2))  12  ---gt; 13 torchinfo.summary(model, (64, 3, 224, 224))  ~/.local/lib/python3.8/site-packages/torchinfo/torchinfo.py in summary(model, input_size, input_data, batch_dim, cache_forward_pass, col_names, col_width, depth, device, dtypes, row_settings, verbose, **kwargs)  192 input_data, input_size, batch_dim, device, dtypes  193 ) --gt; 194 summary_list = forward_pass(  195 model, x, batch_dim, cache_forward_pass, device, **kwargs  196 )  ~/.local/lib/python3.8/site-packages/torchinfo/torchinfo.py in forward_pass(model, x, batch_dim, cache_forward_pass, device, **kwargs)  268 except Exception as e:  269 executed_layers = [layer for layer in summary_list if layer.executed] --gt; 270 raise RuntimeError(  271 "Failed to run torchinfo. See above stack traces for more details. "  272 f"Executed layers up to: {executed_layers}"  RuntimeError: Failed to run torchinfo. See above stack traces for more details. Executed layers up to: [Sequential: 1, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, MaxPool2d: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, MaxPool2d: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, MaxPool2d: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, MaxPool2d: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, Conv2d: 2, ReLU: 2, MaxPool2d: 2, AdaptiveAvgPool2d: 1, Sequential: 2, Linear: 3, ReLU: 3, Linear: 3, ReLU: 2, Dropout: 2]  

Я использую следующие версии пакетов pytorch:

 torch==1.10.0 torchinfo==1.5.3 torchvision==0.11.1  
  1. Что случилось ?
  2. Что мне нужно изменить, чтобы использовать VGG16 (с обучением по переводу) ?

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

1. Я вижу RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x2 and 4096x4096) в журналах, что вы можете не соответствовать измерению при изменении модели.классификатор[0]

Ответ №1:

В случае, если вы пытаетесь изменить окончательный классификатор, вы должны изменить весь, а не только один слой:

 model.classifier = nn.Sequential(  nn.Linear(input_size, 128), nn.ReLU(),  nn.Linear(128, 2))