Pytorch 运行时错误:mat1 和 mat2 形状无法相乘

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

我正在 Pytorch 上构建 CNN 并收到以下错误消息:

运行时错误:mat1 和 mat2 形状无法相乘(32x32768 和 512x256)

我建立了以下模型:

def classifier_block(input, output, kernel_size, stride, last_layer=False):
  if not last_layer:
    x = nn.Sequential(
        nn.Conv2d(input, output, kernel_size, stride, padding=3),
        nn.BatchNorm2d(output),
        nn.LeakyReLU(0.2, inplace=True)
    )
  else:
    x = nn.Sequential(
        nn.Conv2d(input, output, kernel_size, stride),
        nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
    )
  return x

class Classifier(nn.Module):
  def __init__(self, input_dim, output):
    super(Classifier, self).__init__()
    self.classifier = nn.Sequential(
        classifier_block(input_dim, 64, 7, 2),
        classifier_block(64, 64, 3, 2),
        classifier_block(64, 128, 3, 2),
        classifier_block(128, 256, 3, 2),
        classifier_block(256, 512, 3, 2, True)
    )
    print('CLF: ',self.classifier)
    
    self.linear = nn.Sequential(
        nn.Linear(512, 256),
        nn.ReLU(inplace=True),
        nn.Linear(256, 128),
        nn.ReLU(inplace=True),
        nn.Linear(128, 64),
        nn.ReLU(inplace=True),
        nn.Linear(64, output)
    )
    print('Linear: ', self.linear)
  
  def forward(self, image):
    print('IMG: ', image.shape)
    x = self.classifier(image)
    print('X: ', x.shape)
    return self.linear(x.view(len(x), -1))

输入图像的大小为

512x512
。这是我的训练块:

loss_train = []
loss_val = []

for epoch in range(epochs):
  print('Epoch: {}/{}'.format(epoch, epochs))
  total_train = 0
  correct_train = 0
  cumloss_train = 0
  classifier.train()
  for batch, (x, y) in enumerate(train_loader):
    x = x.to(device)
    print(x.shape)
    print(y.shape)
    output = classifier(x)
    loss = criterion(output, y.to(device))
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    print('Loss: {}'.format(loss))

如有任何建议,我们将不胜感激。

python machine-learning deep-learning pytorch conv-neural-network
1个回答
0
投票

您需要匹配分类器部分中图层的形状。

修复此部分:

self.linear = nn.Sequential(
    nn.Linear(512, 256),
    nn.ReLU(inplace=True),
    nn.Linear(256, 128),
    nn.ReLU(inplace=True),
    nn.Linear(128, 64),
    nn.ReLU(inplace=True),
    nn.Linear(64, output)
)

对此:

self.linear = nn.Sequential(
    nn.Linear(32768, 256),
    nn.ReLU(inplace=True),
    nn.Linear(256, 128),
    nn.ReLU(inplace=True),
    nn.Linear(128, 64),
    nn.ReLU(inplace=True),
    nn.Linear(64, output)
)
© www.soinside.com 2019 - 2024. All rights reserved.