有没有办法监控VGG19预训练模型内部形状的变化?

问题描述 投票:0回答:2

所以问题是我正在尝试使用 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)
python deep-learning pytorch vgg-net
2个回答
0
投票

问题在于输入张量的形状不正确。该模型期望形状为 [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 和批量归一化)至关重要,它们在训练和评估期间表现不同。


0
投票

为了获得有关模型各层的摘要,请使用 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
----------------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.