我正在尝试使用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