Как изменить размер дополненного ввода на канал в Pytorch?
Я пытаюсь настроить классификатор изображений с помощью Pytorch. Мои образцы изображений имеют 4 канала и имеют размер 28x28 пикселей. Я пытаюсь использовать встроенный torchvision.models.inception_v3() в качестве моей модели. Всякий раз, когда я пытаюсь запустить свой код, я получаю эту ошибку:
RuntimeError: Рассчитанный размер дополненного ввода на канал: (1 x 1). Размер ядра: (3 х 3). Размер ядра не может превышать фактический входной размер в /opt/conda/conda-bld/pytorch_1524584710464/work/aten/src/THNN/generic/SpatialConvolutionMM.c:48
Я не могу найти, как изменить размер входного сигнала на канал или не могу понять, что означает ошибка. Я полагаю, что мне нужно изменить размер входных данных для каждого канала, так как я не могу редактировать размер ядра в готовой модели.
Я пробовал набивать, но это не помогло. Вот сокращенная часть моего кода, которая выдает ошибку, когда я вызываю train():
import torch
import torchvision as tv
import torch.optim as optim
from torch import nn
from torch.utils.data import DataLoader
model = tv.models.inception_v3()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.0001, weight_decay=0)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=0.9)
trn_dataset = tv.datasets.ImageFolder(
"D:/tests/classification_test_data/trn",
transform=tv.transforms.Compose([tv.transforms.RandomRotation((0,275)), tv.transforms.RandomHorizontalFlip(),
tv.transforms.ToTensor()]))
trn_dataloader = DataLoader(trn_dataset, batch_size=32, num_workers=4, shuffle=True)
for epoch in range(0, 10):
train(trn_dataloader, model, criterion, optimizer, lr_scheduler, 6, 32)
print("End of training")
def train(train_loader, model, criterion, optimizer, scheduler, num_classes, batch_size):
model.train()
scheduler.step()
for index, data in enumerate(train_loader):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
outputs_flatten = flatten_outputs(outputs, num_classes)
loss = criterion(outputs_flatten, labels)
loss.backward()
optimizer.step()
def flatten_outputs(predictions, number_of_classes):
logits_permuted = predictions.permute(0, 2, 3, 1)
logits_permuted_cont = logits_permuted.contiguous()
outputs_flatten = logits_permuted_cont.view(-1, number_of_classes)
return outputs_flatten
0 ответов
Это могло быть связано со следующим. В документации Pytorch для модели Inception_v3 отмечается, что модель ожидает ввода формы Nx3x299x299. Это связано с тем, что архитектура содержит полностью связанный слой фиксированной формы.
Важно: в отличие от других моделей inception_v3 ожидает тензоры с размером N x 3 x 299 x 299, поэтому убедитесь, что ваши изображения имеют соответствующий размер.
Может быть, это поздний пост, но я попытался разобраться с этим простым методом. Получив такую ошибку, я использовал собственный модуль conv2d и почему-то пропустил отправку заполнения в свой nn.conv2d. Я обнаружил эту ошибку. В моей реализации conv2d я распечатал форму выходной переменной и нашел точную ошибку в моем коде. model = VGG_BNN_ReLU('VGG11',10) импорт резака x = torch.randn(1,3,32,32) model.forward(x)
Надеюсь, это поможет.