Pytorch ValueError: 改变图像大小后,目标和输入的元素数量必须相同。

问题描述 投票:0回答:1

I have a working peace of code, which takes a Batchsize from 32 Image with shape of 256*256 and I can train my neuronal network.

class Netz(nn.Module):
def __init__(self):
    super(Netz,self).__init__()
    self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
    self.conv2 = nn.Conv2d(6, 12, kernel_size=3)
    self.conv3 = nn.Conv2d(12, 18, kernel_size=3)
    self.conv4 = nn.Conv2d(18, 24, kernel_size=3)
    self.fc1 = nn.Linear(4704, 1000)
    self.fc2 = nn.Linear(1000, 350)
    self.fc3 = nn.Linear(350,43)


def forward (self,x):
    x = F.relu(F.max_pool2d(self.conv1(x), 2))
    x = F.relu(F.max_pool2d(self.conv2(x), 2))
    x = F.relu(F.max_pool2d(self.conv3(x), 2))
    x = F.relu(F.max_pool2d(self.conv4(x), 2))
    x = x.view(-1,4704)
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)
    return torch.sigmoid(x)



    # Traningsalgorithmus
optimizer = optim.Adam(model.parameters(), lr=0.001)
def train(epoch):
    model.train()
    batch_id = 0
    for data, target in train_data_set:
        data = Variable(data)
        target = torch.Tensor(target)
        target = Variable(target)
        optimizer.zero_grad()
        out = model(data)
        criterion = F.binary_cross_entropy
        loss = criterion(out,target)
        loss.backward()
        optimizer.step()
        print ('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
            epoch, batch_id * len(data), len(train_data_set)*32,
                100. * batch_id / len(train_data_set), loss.item()))
        batch_id = batch_id + 1

当我把图像的大小改为50*50,我把代码网改成这样。

class Netz(nn.Module):
def __init__(self):
    super(Netz,self).__init__()
    self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
    self.conv2 = nn.Conv2d(6, 12, kernel_size=3)
    self.conv3 = nn.Conv2d(12, 18, kernel_size=3)
    self.conv4 = nn.Conv2d(18, 24, kernel_size=3)
    self.fc1 = nn.Linear(768, 1000)
    self.fc2 = nn.Linear(1000, 350)
    self.fc3 = nn.Linear(350,43)


def forward (self,x):
    x = F.relu(F.max_pool2d(self.conv1(x), 2))
    x = F.relu(F.max_pool2d(self.conv2(x), 2))
    x = F.relu(F.max_pool2d(self.conv3(x), 2))
    x = F.relu(F.max_pool2d(self.conv4(x), 2))
    x = x.view(-1,768)
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)
    return torch.sigmoid(x)

我就会得到这样的错误: ValueError: Target nelement (1376) != input nelement (43)

到目前为止,我认为问题出现在以下几个方面 x = x.view(-1,768) 它返回一个Tensor,尺寸为Torch.Size([1,768])。当我使用图像大小256*256时,它返回的Tensor是torch.Size([32,4704]),我没有得到错误。

有人知道我怎么能解决我的问题吗?

python resize pytorch reshape valueerror
1个回答
0
投票

当你使用 -1 视图中,因为它只是使用了剩余的大小,如果这与你的意图不一致,你就不会立即知道它的行为与预期不符。你应该特别避免使用 -1 为批处理维度,因为您可能会错误地改变批处理尺寸,而批处理尺寸不应该改变,它们的数据应该相互独立。

给定一个大小为 [32, 3, 256, 256] 卷积后的输出大小为 [32, 24, 14, 14]扁平化,它可以被扁平化为 [32, 4704],正如你在第一个版本中所预料的那样。当你把输入改为大小 [32, 3, 50, 50],卷积后的输出大小为 [32, 24, 1, 1],显然不能转换为尺寸 [32, 768]因为压平它,将导致大小为 [32, 24]. 鉴于 32 * 24 = 768您错误地将批次合并为一个,创建了一个大小为的张量。[1, 768]如果你用了不同的批量大小,它甚至不会工作。

第一个线性的正确输入尺寸应该是24。

self.fc1 = nn.Linear(24, 1000)

为了在模型中发现任何尺寸上的错误,而不是在之后的损失计算中,你可以设置实际的尺寸,而不需要进行任何的修改。-1 的视图中,或者在批处理尺寸后将其平坦化,可以用视图或 torch.flatten因此,如果线性层中存在大小不匹配的情况,就会出现错误。

# Reshape to [batch_size, 24]
x = x.view(x.size(0), 24)

# Flatten with view
x = x.view(x.size(0), -1)

# Flatten, starting from dimension 1 (after the batch dimension)
x = x.flatten(1)
© www.soinside.com 2019 - 2024. All rights reserved.