首页 > 解决方案 > Pytorch:RuntimeError:mat1 dim 1 必须匹配 mat2 dim 0

问题描述

使用 resnet50 模型。自定义最后一层,它显示运行时错误..我是 PyTorch 的新手,我不断收到错误 mat1 dim1 must match mat1 dim0

这是我的网络代码

from torchvision import models
model = models.resnet50(pretrained=True)

for param in model.parameters():
    param.requires_grad = False
    
class Identity(nn.Module):
    def __init__(self):
        super(Identity, self).__init__()
    def forward(self, x):
        return x

    
model.avgpool = Identity()
model.fc = nn.Linear(2048, 2, bias=True)

for param in model.fc.parameters():
    param.requires_grad = True
model = model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)



def train(num_epoch, model):
    for epoch in range(0, 3):
        losses = []
        model.train()
        loop = tqdm(enumerate(train_loader), total=len(train_loader))
        for batch_idx, (data, targets) in loop:
            data = data.to(device=device)
            targets = targets.to(device=device)
            scores = model.forward(data)
            loss = criterion(scores, targets)

            optimizer.zero_grad()
            losses.append(loss)
            loss.backward()
            optimizer.step()

            loop.set_description(f"Epoch {epoch+1}/{num_epoch} process: {int((batch_idx / len(train_loader)) * 100)}")
            loop.set_postfix(loss=loss.data.item())

train(1, model)

RuntimeError: mat1 dim 1 必须匹配 mat2 dim 0

标签: pythonmachine-learningdeep-learningpytorch

解决方案


此错误来自nn.Linear您更改。
回想一下,nn.Linear计算一个简单的矩阵点积,因此来自前一层的输入维度必须等于weight矩阵形状(您将其设置为2048)。
我的猜测是,由于您删除了该model.avgpool层,因此您现在有超过 2048 个输入维度,从而导致您得到错误。


顺便说一句,你不需要自己实现“身份”层,pytorch 已经有了nn.Identity.


推荐阅读