如何在Pytorch中更改每个通道的填充输入大小?

时间:2018-11-22 21:26:50

标签: pytorch torchvision

我正在尝试使用Pytorch设置图像分类器。我的样本图像有4个通道,大小为28x28像素。我正在尝试使用内置的torchvision.models.inception_v3()作为模型。每当我尝试运行代码时,都会出现此错误:

  

RuntimeError:计算每个通道的填充输入大小:(1 x 1)。   内核大小:(3 x 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

2 个答案:

答案 0 :(得分:0)

可能是由于以下原因。针对Inception_v3模型的Pytorch文档指出,该模型期望输入形状为Nx3x299x299。这是因为架构包含固定形状的完全连接的层。

重要:与其他模型相比,inception_v3期望张量的大小为N x 3 x 299 x 299,因此请确保图像的大小相应。

https://pytorch.org/docs/stable/torchvision/models.html#inception-v3

答案 1 :(得分:0)

可能这是一个较晚的帖子,但是我试图用一种简单的方法来解决这个问题。 在遇到这种错误时,我正在使用自定义的conv2d模块,因此我错过了将填充发送到nn.conv2d的功能。 我发现了这个错误, 在我的conv2d实现中,我打印了输出变量的形状,并在代码中找到了确切的错误。 型号= VGG_BNN_ReLU('VGG11',10) 进口火炬 x = torch.randn(1,3,32,32) model.forward(x)

希望这会有所帮助。学习愉快