Python 运行时错误:大小不匹配,m1:[32 x 1],m2:[32 x 9]

Python 运行时错误:大小不匹配,m1:[32 x 1],m2:[32 x 9],python,neural-network,deep-learning,conv-neural-network,pytorch,Python,Neural Network,Deep Learning,Conv Neural Network,Pytorch,我正在建立一个CNN,并训练它对字母a到I的手势分类(9类),每幅图像都是224x224大小的RGB 不确定我需要转换哪个矩阵以及如何转换。我已经设法匹配层的输入和输出,但是矩阵乘法的事情,不确定如何修复它 class LargeNet(nn.Module): def __init__(self): super(LargeNet, self).__init__() self.name = "large" self.conv1 = nn.Co

我正在建立一个CNN,并训练它对字母a到I的手势分类(9类),每幅图像都是224x224大小的RGB

不确定我需要转换哪个矩阵以及如何转换。我已经设法匹配层的输入和输出,但是矩阵乘法的事情,不确定如何修复它

class LargeNet(nn.Module):
    def __init__(self):
        super(LargeNet, self).__init__()
        self.name = "large"
        self.conv1 = nn.Conv2d(3, 5, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(5, 10, 5)
        self.fc1 = nn.Linear(10 * 53 * 53, 32)
        self.fc2 = nn.Linear(32, 9)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        print('x1')
        x = self.pool(F.relu(self.conv2(x)))
        print('x2')
        x = x.view(-1, 10*53*53)
        print('x3')
        x = F.relu(self.fc1(x))
        print('x4')
        x = x.view(-1, 1)
        x = self.fc2(x)
        print('x5')
        x = x.squeeze(1) # Flatten to [batch_size]
        return x
及训练守则

#Loss and optimizer
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model2.parameters(), lr=learning_rate, momentum=0.9)

# Train the model
total_step = len(train_loader)
loss_list = []
acc_list = []
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        print(i,images.size(),labels.size())
        # Run the forward pass
        outputs = model2(images)
        labels=labels.unsqueeze(1)
        labels=labels.float()
        loss = criterion(outputs, labels)
代码打印到x4,然后我得到这个错误运行时错误:大小不匹配,m1:[32 x 1],m2:[32 x 9]位于C:\w\1\s\tmp\u conda\u 3.7\u 055457\conda\conda bld\pytorch\u 156541617654\work\aten\src\TH/generic/THTensorMath.cpp:752


完全回溯错误:

转发
函数中不需要
x=x.view(-1,1)
x=x.squence(1)
。拆下这两条线。您的输出形状将是
(批次大小,9)

此外,您需要将
标签
转换为一个热编码,其形状为
(批量大小,9)

类LargeNet(nn.模块):
定义初始化(自):
超级(LargeNet,self)。\uuuu init\uuuuu()
self.name=“大”
self.conv1=nn.Conv2d(3,5,5)
self.pool=nn.MaxPool2d(2,2)
self.conv2=nn.Conv2d(5,10,5)
self.fc1=nn.线性(10*53*53,32)
self.fc2=nn.线性(32,9)
def前进(自身,x):
x=自池(F.relu(self.conv1(x)))
x=自池(F.relu(self.conv2(x)))
x=x.view(-1,10*53*53)
x=F.relu(自fc1(x))
x=自身.fc2(x)
返回x
model2=LargeNet()
#损失与优化
标准=nn.BCEWithLogitsLoss()
#nn.BCELoss()
optimizer=optim.SGD(model2.parameters(),lr=0.1,momentum=0.9)
images=torch.from_numpy(np.random.randn(2,3224224)).float()#假图像,批量大小为2
标签=火炬张量([1,2]).long()#假标签
输出=模型2(图像)
一个热标签=火炬眼(9)[标签]
损耗=标准(输出、一个热标签)

转发
功能中,您不需要
x=x.view(-1,1)
x=x.screek(1)
。拆下这两条线。您的输出形状将是
(批次大小,9)

此外,您需要将
标签
转换为一个热编码,其形状为
(批量大小,9)

类LargeNet(nn.模块):
定义初始化(自):
超级(LargeNet,self)。\uuuu init\uuuuu()
self.name=“大”
self.conv1=nn.Conv2d(3,5,5)
self.pool=nn.MaxPool2d(2,2)
self.conv2=nn.Conv2d(5,10,5)
self.fc1=nn.线性(10*53*53,32)
self.fc2=nn.线性(32,9)
def前进(自身,x):
x=自池(F.relu(self.conv1(x)))
x=自池(F.relu(self.conv2(x)))
x=x.view(-1,10*53*53)
x=F.relu(自fc1(x))
x=自身.fc2(x)
返回x
model2=LargeNet()
#损失与优化
标准=nn.BCEWithLogitsLoss()
#nn.BCELoss()
optimizer=optim.SGD(model2.parameters(),lr=0.1,momentum=0.9)
images=torch.from_numpy(np.random.randn(2,3224224)).float()#假图像,批量大小为2
标签=火炬张量([1,2]).long()#假标签
输出=模型2(图像)
一个热标签=火炬眼(9)[标签]
损耗=标准(输出、一个热标签)


请显示完整的错误回溯。@ba_ul链接到完整的错误回溯您的输入大小是多少?为什么有
x=x.view(-1,1)
这行?@zihao-zhao输入大小是RGB方形图片3通道,224 x 224像素请显示完整的错误回溯。@完全错误回溯的链接您的输入大小是多少?为什么有
x=x.view(-1,1)
这行?@zihaozhihao输入大小是RGB方形图片3个通道,224 x 224像素,可以使代码更动态,我正在考虑创建一个将批大小作为参数传递的函数,唯一需要的更改是images=torch.from_numpy(np.random.randn(batch_size,3224224)).float()和labels=torch.tensor([1,batch_size]).long()?@megazord您想在培训期间更改批大小吗?培训前,我想在一个小数据集上测试我的代码,然后在一个更大的数据集上测试我的代码,这将要求我使用更大的批处理大小并测试不同的批处理大小,以查看最佳的批处理大小。@megazord,我明白了,是的,你可以按照你说的做。谢谢,它很有效,使代码更具动态性,我正在考虑创建一个将批大小作为参数传递的函数,唯一需要的更改是images=torch.from_numpy(np.random.randn(batch_size,3224224)).float()和labels=torch.tensor([1,batch_size]).long()?@megazord您想在培训期间更改批大小吗?培训前,我想在一个小的数据集上测试我的代码,然后在一个更大的数据集上测试我的代码,这将要求我使用更大的批处理大小,并测试不同的批处理大小,以查看最佳的批处理大小。@megazord,我明白了,是的,你可以按照你说的做。