有没有办法监控 VGG19 预训练模型中的形状如何变化?

Is there a way to monitor how the shapes are changing inside VGG19 pretrained model?

提问人:mvalpha 提问时间:11/16/2023 更新时间:11/17/2023 访问量:32

问:

所以问题是我正在尝试使用 VGG19 预训练模型做一些事情,并且最初的 8 个卷积层被冻结了。 我的图像大小是,我不想调整大小,因为它可能会影响性能。我一次又一次地收到错误,矩阵无法相乘,那么有没有办法通过 vgg19 传递图像?3 x 400 x 4003 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 深度学习 pytorch vgg-net

评论

0赞 DerekG 11/16/2023
是的,两种常见的方法是 i.)出于调试目的,只需添加 print 语句即可在 forward 函数 ii 中每一层之后打印结果的形状。寄存器钩子(参见 stackoverflow.com/questions/75319661/...)

答:

0赞 ibra ndiaye 11/17/2023 #1

问题是输入张量的形状不正确。该模型需要形状 [B, 3, 400, 400],其中 B 是批量大小。如果一次向模型发送一张图像,则需要使用形状为 [1, 3, 400, 400] 的张量,而不是 [3, 400, 400]。您可以使用 实现此目的。在网络的输出端,可以使用 消除此维度。torch.unsqueeze()torch.squeeze()

另请注意,您可以简单地将模型置于评估模式 () 中,并使用 来装饰推理函数,而不是显式设置为 。这将立即停用函数中的任何梯度计算。require_gradfalsemodel.eval()torch.no_grad()

为了进一步说明,该模型需要形状为 [B, 3, 400, 400] 的张量,其中 B 表示批量大小,3 表示 RGB 颜色通道,400x400 是图像分辨率。如果要发送单个图像,则需要将其调整为 [1, 3, 400, 400],以便模型正确处理它。该函数可用于添加批处理所需的附加维度。同样,可用于在处理图像后删除此额外维度。torch.unsqueeze()torch.squeeze()

最后,在执行推理时,无需计算梯度。您可以使用 阻止 PyTorch 计算梯度。这可以节省内存并加快代码速度。此外,请记住在运行推理之前将模型设置为评估模式。这会将模型中的所有层设置为评估模式,这对于某些类型的层(如丢弃和批量归一化)至关重要,这些层在训练和评估期间的行为不同。torch.no_grad()model.eval()

0赞 Anna Andreeva Rogotulka 11/17/2023 #2

为了获取有关模型层的摘要,请使用 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
----------------------------------------------------------------