目标大小 (torch.Size([12])) 必须与输入大小 (torch.Size([12, 1000])) 相同
Target size (torch.Size([12])) must be the same as input size (torch.Size([12, 1000]))
我正在使用 models.vgg16(pretrained=True)
模型进行图像分类,其中 类 的数量 = 3。
批量大小为 12 trainloader = torch.utils.data.DataLoader(train_data, batch_size=12, shuffle=True)
,因为错误显示 Target size (torch.Size([12])) must be the same as input size (torch.Size([12, 1000]))
我已经更改了最后一个 fc 层参数并得到了最后一个 FC 层 Linear(in_features=1000, out_features=3, bias=True)
损失函数为BCEWithLogitsLoss()
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(vgg16.parameters(), lr=0.001, momentum=0.9)
训练代码是
# zero the parameter gradients
optimizer.zero_grad()
outputs = vgg16(inputs) #----> forward pass
loss = criterion(outputs, labels) #----> compute loss #error occurs here
loss.backward() #----> backward pass
optimizer.step() #----> weights update
在计算损失时,出现此错误Target size (torch.Size([12])) must be the same as input size (torch.Size([12, 1000]))
代码位于:code
尝试仔细检查您是如何修改线性层的。似乎不知何故模型没有转发通过它。
你的模型输出每个样本有 1000 个输出大小,而它应该有 3 个。这就是你无法评估损失的原因,因为你试图将 1000 classes 与 3 进行比较。你应该有 3在你的最后一层输出,这应该有效。
编辑
根据您在此处共享的代码:link,我认为存在两个问题。
首先,您以这种方式修改了模型:
# Load the pretrained model from pytorch
vgg16 = models.vgg16(pretrained=True)
vgg16.classifier[6].in_features = 1000
vgg16.classifier[6].out_features = 3
虽然您在这里所做的是将层作为 属性 添加到您的网络,但您还应该修改模型的 forward()
函数。将图层作为属性添加到列表中不会在前向传递输入时应用图层。
通常正确执行此操作的方法是定义新的 class,它继承自您要实现的模型 - class myvgg16(models.vgg16)
或更普遍的 class myvgg(nn.Module)
。您可以在以下 link
中找到进一步的解释
如果失败,请尝试 unsqueeze(1)
您的目标大小(即标签变量)。这不太可能是错误的原因,但值得一试。
编辑
再试一次将目标张量转换为一个热向量。并在 BCELoss 接收浮点数时将张量类型更改为 Float。
把你模型的代码分享出来,调试起来会很方便。问题肯定出在您最后一个完全连接的层中。大小不匹配清楚地表明您为 12 张图像(批量大小)分别获得了 1000 个特征,但是您有 12 个特征要与之进行比较。
很明显全连接层有问题
用这个解决问题-
vgg16 = models.vgg16(pretrained=True)
vgg16.classifier[6]= nn.Linear(4096, 3)
if __name__ == "__main__":
from torchsummary import summary
model = vgg16
model = model.cuda()
print(model)
summary(model, input_size = (3,120,120))
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 64, 120, 120] 1,792
ReLU-2 [-1, 64, 120, 120] 0
Conv2d-3 [-1, 64, 120, 120] 36,928
ReLU-4 [-1, 64, 120, 120] 0
MaxPool2d-5 [-1, 64, 60, 60] 0
Conv2d-6 [-1, 128, 60, 60] 73,856
ReLU-7 [-1, 128, 60, 60] 0
Conv2d-8 [-1, 128, 60, 60] 147,584
ReLU-9 [-1, 128, 60, 60] 0
MaxPool2d-10 [-1, 128, 30, 30] 0
Conv2d-11 [-1, 256, 30, 30] 295,168
ReLU-12 [-1, 256, 30, 30] 0
Conv2d-13 [-1, 256, 30, 30] 590,080
ReLU-14 [-1, 256, 30, 30] 0
Conv2d-15 [-1, 256, 30, 30] 590,080
ReLU-16 [-1, 256, 30, 30] 0
MaxPool2d-17 [-1, 256, 15, 15] 0
Conv2d-18 [-1, 512, 15, 15] 1,180,160
ReLU-19 [-1, 512, 15, 15] 0
Conv2d-20 [-1, 512, 15, 15] 2,359,808
ReLU-21 [-1, 512, 15, 15] 0
Conv2d-22 [-1, 512, 15, 15] 2,359,808
ReLU-23 [-1, 512, 15, 15] 0
MaxPool2d-24 [-1, 512, 7, 7] 0
Conv2d-25 [-1, 512, 7, 7] 2,359,808
ReLU-26 [-1, 512, 7, 7] 0
Conv2d-27 [-1, 512, 7, 7] 2,359,808
ReLU-28 [-1, 512, 7, 7] 0
Conv2d-29 [-1, 512, 7, 7] 2,359,808
ReLU-30 [-1, 512, 7, 7] 0
MaxPool2d-31 [-1, 512, 3, 3] 0
AdaptiveAvgPool2d-32 [-1, 512, 7, 7] 0
Linear-33 [-1, 4096] 102,764,544
ReLU-34 [-1, 4096] 0
Dropout-35 [-1, 4096] 0
Linear-36 [-1, 4096] 16,781,312
ReLU-37 [-1, 4096] 0
Dropout-38 [-1, 4096] 0
Linear-39 [-1, 3] 12,291
================================================================
Total params: 134,272,835
Trainable params: 134,272,835
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.16
Forward/backward pass size (MB): 62.84
Params size (MB): 512.21
Estimated Total Size (MB): 575.21
我正在使用 models.vgg16(pretrained=True)
模型进行图像分类,其中 类 的数量 = 3。
批量大小为 12 trainloader = torch.utils.data.DataLoader(train_data, batch_size=12, shuffle=True)
,因为错误显示 Target size (torch.Size([12])) must be the same as input size (torch.Size([12, 1000]))
我已经更改了最后一个 fc 层参数并得到了最后一个 FC 层 Linear(in_features=1000, out_features=3, bias=True)
损失函数为BCEWithLogitsLoss()
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(vgg16.parameters(), lr=0.001, momentum=0.9)
训练代码是
# zero the parameter gradients
optimizer.zero_grad()
outputs = vgg16(inputs) #----> forward pass
loss = criterion(outputs, labels) #----> compute loss #error occurs here
loss.backward() #----> backward pass
optimizer.step() #----> weights update
在计算损失时,出现此错误Target size (torch.Size([12])) must be the same as input size (torch.Size([12, 1000]))
代码位于:code
尝试仔细检查您是如何修改线性层的。似乎不知何故模型没有转发通过它。
你的模型输出每个样本有 1000 个输出大小,而它应该有 3 个。这就是你无法评估损失的原因,因为你试图将 1000 classes 与 3 进行比较。你应该有 3在你的最后一层输出,这应该有效。
编辑
根据您在此处共享的代码:link,我认为存在两个问题。
首先,您以这种方式修改了模型:
# Load the pretrained model from pytorch
vgg16 = models.vgg16(pretrained=True)
vgg16.classifier[6].in_features = 1000
vgg16.classifier[6].out_features = 3
虽然您在这里所做的是将层作为 属性 添加到您的网络,但您还应该修改模型的 forward()
函数。将图层作为属性添加到列表中不会在前向传递输入时应用图层。
通常正确执行此操作的方法是定义新的 class,它继承自您要实现的模型 - class myvgg16(models.vgg16)
或更普遍的 class myvgg(nn.Module)
。您可以在以下 link
如果失败,请尝试 unsqueeze(1)
您的目标大小(即标签变量)。这不太可能是错误的原因,但值得一试。
编辑
再试一次将目标张量转换为一个热向量。并在 BCELoss 接收浮点数时将张量类型更改为 Float。
把你模型的代码分享出来,调试起来会很方便。问题肯定出在您最后一个完全连接的层中。大小不匹配清楚地表明您为 12 张图像(批量大小)分别获得了 1000 个特征,但是您有 12 个特征要与之进行比较。
很明显全连接层有问题
用这个解决问题-
vgg16 = models.vgg16(pretrained=True)
vgg16.classifier[6]= nn.Linear(4096, 3)
if __name__ == "__main__":
from torchsummary import summary
model = vgg16
model = model.cuda()
print(model)
summary(model, input_size = (3,120,120))
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 64, 120, 120] 1,792
ReLU-2 [-1, 64, 120, 120] 0
Conv2d-3 [-1, 64, 120, 120] 36,928
ReLU-4 [-1, 64, 120, 120] 0
MaxPool2d-5 [-1, 64, 60, 60] 0
Conv2d-6 [-1, 128, 60, 60] 73,856
ReLU-7 [-1, 128, 60, 60] 0
Conv2d-8 [-1, 128, 60, 60] 147,584
ReLU-9 [-1, 128, 60, 60] 0
MaxPool2d-10 [-1, 128, 30, 30] 0
Conv2d-11 [-1, 256, 30, 30] 295,168
ReLU-12 [-1, 256, 30, 30] 0
Conv2d-13 [-1, 256, 30, 30] 590,080
ReLU-14 [-1, 256, 30, 30] 0
Conv2d-15 [-1, 256, 30, 30] 590,080
ReLU-16 [-1, 256, 30, 30] 0
MaxPool2d-17 [-1, 256, 15, 15] 0
Conv2d-18 [-1, 512, 15, 15] 1,180,160
ReLU-19 [-1, 512, 15, 15] 0
Conv2d-20 [-1, 512, 15, 15] 2,359,808
ReLU-21 [-1, 512, 15, 15] 0
Conv2d-22 [-1, 512, 15, 15] 2,359,808
ReLU-23 [-1, 512, 15, 15] 0
MaxPool2d-24 [-1, 512, 7, 7] 0
Conv2d-25 [-1, 512, 7, 7] 2,359,808
ReLU-26 [-1, 512, 7, 7] 0
Conv2d-27 [-1, 512, 7, 7] 2,359,808
ReLU-28 [-1, 512, 7, 7] 0
Conv2d-29 [-1, 512, 7, 7] 2,359,808
ReLU-30 [-1, 512, 7, 7] 0
MaxPool2d-31 [-1, 512, 3, 3] 0
AdaptiveAvgPool2d-32 [-1, 512, 7, 7] 0
Linear-33 [-1, 4096] 102,764,544
ReLU-34 [-1, 4096] 0
Dropout-35 [-1, 4096] 0
Linear-36 [-1, 4096] 16,781,312
ReLU-37 [-1, 4096] 0
Dropout-38 [-1, 4096] 0
Linear-39 [-1, 3] 12,291
================================================================
Total params: 134,272,835
Trainable params: 134,272,835
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.16
Forward/backward pass size (MB): 62.84
Params size (MB): 512.21
Estimated Total Size (MB): 575.21