gpt4 book ai didi

python - 训练CNN时出错: "RuntimeError: The size of tensor a (10) must match the size of tensor b (64) at non-singleton dimension 1"

转载 作者:行者123 更新时间:2023-11-30 09:30:47 25 4
gpt4 key购买 nike

我是 Pytorch 新手,我正在尝试实现一个简单的 CNN 来识别 MNIST 图像。

我正在使用 MSE 损失作为损失函数并使用 SGD 作为优化器来训练网络。当我参加培训时,它给了我以下内容

warning: " UserWarning: Using a target size (torch.Size([64])) that is different to the input size (torch.Size([64, 10])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size."

然后我得到以下内容

error: "RuntimeError: The size of tensor a (10) must match the size of tensor b
(64) at non-singleton dimension 1".

我尝试使用在其他问题中找到的一些解决方案来解决它,但似乎没有任何效果。这是我如何加载数据集的代码:

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,),(0.5,))])

trainset = torchvision.datasets.MNIST(root='./data', train = True, transform = transform, download = True)
trainloader = torch.utils.data.DataLoader(trainset, batch_size = 64, shuffle = True)

testset = torchvision.datasets.MNIST(root='./data', train = False, transform = transform, download = True)
testloader = torch.utils.data.DataLoader(testset, batch_size = 64, shuffle = False)

定义我的网络的代码:

    class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
#Convolutional layers
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 12, 5)
#Fully connected layers
self.fc1 = nn.Linear(12*4*4, 120)
self.fc2 = nn.Linear(120, 60)
self.out = nn.Linear(60,10)

def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)), (2,2))
x = F.max_pool2d(F.relu(self.conv2(x)), (2,2))
x = x.reshape(-1, 12*4*4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.out(x)
return x

这就是训练:

net = Net()
print(net)

criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.001)
epochs = 3

for epoch in range(epochs):
running_loss = 0;
for images, labels in trainloader:
optimizer.zero_grad()
output = net(images)
loss = criterion(output, labels)
loss.backward()
optimizer.step()

running_loss += loss.item()
else:
print(f"Training loss: {running_loss/len(trainloader)}")

print('Finished training')

谢谢!

最佳答案

对于此问题,您使用的损失 ( nn.MSELoss ) 不正确。您应该使用nn.CrossEntropyLoss .

均方损失测量输入 x 和目标 y 之间的均方误差。 这里输入和目标自然应该具有相同的形状。

交叉熵损失计算每个图像的类别概率。输出将是矩阵 N x C,目标将是大小为 N 的向量。(N = 批量大小,C =类(class)数量)

由于您的目标是对图像进行分类,因此您需要使用它。

在您的情况下,您的网络输出将是一个大小为 64 x 10 的矩阵,目标是一个大小为 64 的向量。输出矩阵的每一行(应用 softmax 函数后)指示该类的概率,之后计算交叉熵损失。 Pytorch 的 nn.CrossEntropyLoss将 softmax 操作与损失计算结合起来。

可以引用文档here有关 Pytorch 如何计算损失的更多信息。

关于python - 训练CNN时出错: "RuntimeError: The size of tensor a (10) must match the size of tensor b (64) at non-singleton dimension 1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58932935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com