如何解决PyTorch中的尺寸不匹配错误?

我正在尝试使用CIFAR10数据在PyTorch中创建一个逻辑模型。在运行模型进行评估后,我遇到了一个错误:

RuntimeError: size mismatch, m1: [750 x 4096], m2: [1024 x 10] at C:\w\1\s\tmp_conda_3.7_100118\conda\conda-bld\pytorch_1579082551706\work\aten\src\TH/generic/THTensorMath.cpp:136

看起来是input_size造成了问题,我对此并不熟悉。请告诉我应该做哪些更改来解决这个错误。

这些是超参数:

batch_size = 100learning_rate = 0.001# Other constantsinput_size = 4*4*64num_classes = 10

这是下载并将数据集分割成训练、验证和测试集的单元格。

transform = torchvision.transforms.Compose(    [torchvision.transforms.ToTensor(),     torchvision.transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5))])testset = torchvision.datasets.CIFAR10(root='D:\PyTorch\cifar-10-python', train=False,download=False, transform=transform)trainvalset = torchvision.datasets.CIFAR10(root='D:\PyTorch\cifar-10-python', train=True,download=False, transform=transform)trainset, valset = torch.utils.data.random_split(trainvalset, [45000, 5000]) # 10% for validationtrain_loader = torch.utils.data.DataLoader(trainset, batch_size=50, shuffle=True)test_loader = torch.utils.data.DataLoader(testset, batch_size=1000, shuffle=False)val_loader = torch.utils.data.DataLoader(valset, batch_size=1000, shuffle=False)

这是我的模型架构。

class CifarModel(nn.Module):    def __init__(self):        super().__init__()        self.linear = nn.Linear(input_size,  num_classes)    def forward(self, xb):        xb = xb.view(-1, 64*8*8)        #xb = xb.reshape(-1, 784)        print(xb.shape)        out = self.linear(xb)        return out    def training_step(self, batch):        images, labels = batch         out = self(images)                  # Generate predictions        loss = F.cross_entropy(out, labels) # Calculate loss        return loss    def validation_step(self, batch):        images, labels = batch         out = self(images)                    # Generate predictions        loss = F.cross_entropy(out, labels)   # Calculate loss        acc = accuracy(out, labels)           # Calculate accuracy        return {'val_loss': loss.detach(), 'val_acc': acc.detach()}    def validation_epoch_end(self, outputs):        batch_losses = [x['val_loss'] for x in outputs]        epoch_loss = torch.stack(batch_losses).mean()   # Combine losses        batch_accs = [x['val_acc'] for x in outputs]        epoch_acc = torch.stack(batch_accs).mean()      # Combine accuracies        return {'val_loss': epoch_loss.item(), 'val_acc': epoch_acc.item()}    def epoch_end(self, epoch, result):        print("Epoch [{}], val_loss: {:.4f}, val_acc: {:.4f}".format(epoch, result['val_loss'], result['val_acc']))model = CifarModel()
def accuracy(outputs, labels):    _, preds = torch.max(outputs, dim=1)    return torch.tensor(torch.sum(preds == labels).item() / len(preds))def evaluate(model, val_loader):    outputs = [model.validation_step(batch) for batch in val_loader]    return model.validation_epoch_end(outputs)def fit(epochs, lr, model, train_loader, val_loader, opt_func=torch.optim.SGD):    history = []    optimizer = opt_func(model.parameters(), lr)    for epoch in range(epochs):        # Training Phase         for batch in train_loader:            loss = model.training_step(batch)            loss.backward()            optimizer.step()            optimizer.zero_grad()        # Validation phase        result = evaluate(model, val_loader)        model.epoch_end(epoch, result)        history.append(result)    return historyevaluate(model, val_loader)

回答:

你在这里指定了输出类别数应为10:

num_classes = 10

然而,你的前向函数并未反映这一点:

xb = xb.view(-1, 64*8*8) # 你得到750x4096out = self.linear(xb) # 这里线性层的输入尺寸=input_size = 4*4*64 # 1024# num_classes = 10 

请按如下方式修改:

xb = xb.view(-1, 64*4*4) # 你得到750x1024out = self.linear(xb) # M1 750x1024 M2 1024x10:# input_size = 4*4*64 # 1024# num_classes = 10 

Related Posts

神经网络反向传播代码不工作

我需要编写一个简单的由1个输出节点、1个包含3个节点的…

值错误:y 包含先前未见过的标签:

我使用了 决策树分类器,我想将我的 输入 作为 字符串…

使用不平衡数据集进行特征选择时遇到的问题

我正在使用不平衡数据集(54:38:7%)进行特征选择…

广义随机森林/因果森林在Python上的应用

我在寻找Python上的广义随机森林/因果森林算法,但…

如何用PyTorch仅用标量损失来训练神经网络?

假设我们有一个神经网络,我们希望它能根据输入预测三个值…

什么是RNN中间隐藏状态的良好用途?

我已经以三种不同的方式使用了RNN/LSTM: 多对多…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注