所以问题是我正在尝试使用 VGG19 预训练模型做一些事情,并且初始 8 个卷积层被冻结。 我的图像大小是
3 x 400 x 400
,我不想调整大小,因为这可能会影响性能。我一次又一次地收到错误,矩阵无法相乘,那么有没有办法通过 vgg19 传递 3 x 400 x 400
图像?
weights = VGG19_Weights.DEFAULT
vgg19_layer = vgg19(weights = weights)
for i in range(16):
for param in vgg19_layer.features[i].parameters():
param.requires_grad = False
这就是我的使用方式
vgg19_layer
。
self.vgg19 = vgg19_layer
这就是我当前发送输入的方式。
x = torch.randn((3, 400, 400))
model(x)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (512x49 and 25088x4096)
问题在于输入张量的形状不正确。该模型期望形状为 [B, 3, 400, 400],其中 B 为批量大小。如果一次向模型发送一张图像,则需要使用形状为 [1, 3, 400, 400] 而不是 [3, 400, 400] 的张量。您可以使用
torch.unsqueeze()
来实现这一点。在网络的输出处,您可以使用 torch.squeeze()
消除此维度。
另请注意,您可以简单地将模型置于评估模式 (
require_grad
),并用 false
装饰您的推理函数,而不是将 model.eval()
显式设置为 torch.no_grad()
。这将立即停用函数内的任何梯度计算。
为了进一步澄清,模型需要形状为 [B, 3, 400, 400] 的张量,其中 B 表示批量大小,3 表示 RGB 颜色通道,400x400 是图像分辨率。如果您发送单个图像,则需要将其重新整形为 [1, 3, 400, 400] 以便模型正确处理它。
torch.unsqueeze()
函数可用于添加批处理所需的附加维度。同样,在处理图像后,可以使用 torch.squeeze()
来删除这个额外的维度。
最后,在进行推理时,不需要计算梯度。您可以使用
torch.no_grad()
来阻止 PyTorch 计算梯度。这可以节省内存并加快代码速度。另外,请记住在运行推理之前使用 model.eval()
将模型设置为评估模式。这会将模型中的所有层设置为评估模式,这对于某些类型的层(例如 dropout 和批量归一化)至关重要,它们在训练和评估期间表现不同。
为了获得有关模型各层的摘要,请使用 torchsummary,如下所示
from torchsummary import summary
summary(CNNNetwork().cuda(), (1, 64, 16))
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 16, 64, 16] 416
BatchNorm2d-2 [-1, 16, 64, 16] 32
ReLU-3 [-1, 16, 64, 16] 0
MaxPool2d-4 [-1, 16, 32, 8] 0
Conv2d-5 [-1, 32, 32, 8] 12,832
ReLU-6 [-1, 32, 32, 8] 0
MaxPool2d-7 [-1, 32, 16, 4] 0
BatchNorm2d-8 [-1, 32, 16, 4] 64
Conv2d-9 [-1, 64, 18, 6] 18,496
ReLU-10 [-1, 64, 18, 6] 0
MaxPool2d-11 [-1, 64, 9, 3] 0
BatchNorm2d-12 [-1, 64, 9, 3] 128
Conv2d-13 [-1, 128, 11, 5] 73,856
ReLU-14 [-1, 128, 11, 5] 0
MaxPool2d-15 [-1, 128, 5, 2] 0
BatchNorm2d-16 [-1, 128, 5, 2] 256
Flatten-17 [-1, 1280] 0
Linear-18 [-1, 35] 44,835
================================================================
Total params: 150,915
Trainable params: 150,915
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.83
Params size (MB): 0.58
Estimated Total Size (MB): 1.41
----------------------------------------------------------------