提问人:mvalpha 提问时间:11/16/2023 更新时间:11/17/2023 访问量:32
有没有办法监控 VGG19 预训练模型中的形状如何变化?
Is there a way to monitor how the shapes are changing inside VGG19 pretrained model?
问:
所以问题是我正在尝试使用 VGG19 预训练模型做一些事情,并且最初的 8 个卷积层被冻结了。
我的图像大小是,我不想调整大小,因为它可能会影响性能。我一次又一次地收到错误,矩阵无法相乘,那么有没有办法通过 vgg19 传递图像?3 x 400 x 400
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()
最后,在执行推理时,无需计算梯度。您可以使用 阻止 PyTorch 计算梯度。这可以节省内存并加快代码速度。此外,请记住在运行推理之前将模型设置为评估模式。这会将模型中的所有层设置为评估模式,这对于某些类型的层(如丢弃和批量归一化)至关重要,这些层在训练和评估期间的行为不同。torch.no_grad()
model.eval()
为了获取有关模型层的摘要,请使用 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
----------------------------------------------------------------
评论