东莞网站seo优化托管,软文推广收费,深圳网站建设怎样做,百度移动权重搭建CNN网络
本章我们来学习一下如何搭建网络#xff0c;初始化方法#xff0c;模型的保存#xff0c;预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试#xff0c;所以这里我们只以VGG为例。 请注意#xff0c;这里定义的只是一个简陋的版本#xff0c;后续一…搭建CNN网络
本章我们来学习一下如何搭建网络初始化方法模型的保存预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试所以这里我们只以VGG为例。 请注意这里定义的只是一个简陋的版本后续一些经典网络的学习我们会在另外单独去开一个专栏讲解。 1. 网络搭建
在PyTorch中你可以使用 torchvision.models 中的 vgg16 来加载预定义的VGG16模型也可以手动定义。以下是手动定义的一个简化版本
import torch
import torch.nn as nnclass VGG16(nn.Module):def __init__(self, num_classes1000):super(VGG16, self).__init__()self.features nn.Sequential(nn.Conv2d(3, 64, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(64, 64, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2, stride2),nn.Conv2d(64, 128, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(128, 128, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2, stride2),nn.Conv2d(128, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(256, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(256, 256, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2, stride2),nn.Conv2d(256, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(512, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(512, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2, stride2),nn.Conv2d(512, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(512, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.Conv2d(512, 512, kernel_size3, padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2, stride2),)self.avgpool nn.AdaptiveAvgPool2d((7, 7))self.classifier nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(inplaceTrue),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplaceTrue),nn.Dropout(),nn.Linear(4096, num_classes),)def forward(self, x):x self.features(x)x self.avgpool(x)x torch.flatten(x, 1)x self.classifier(x)return x2. 初始化方法
在这里我们不再手动初始化每一层因为PyTorch的默认初始化通常足够好。你可以选择手动初始化如果需要可以使用 torch.nn.init 中的不同方法。
3. 模型的保存
使用 torch.save 保存VGG16模型
vgg16 VGG16()torch.save(vgg16.state_dict(), vgg16_model.pth)4. 预训练模型的加载
要加载预训练的VGG16模型你可以使用 torchvision.models 中的 vgg16(pretrainedTrue)或者手动加载预训练权重
vgg16 VGG16()vgg16.load_state_dict(torch.load(pretrained_vgg16.pth))
请确保路径 pretrained_vgg16.pth 是你预训练模型文件的实际路径。你可以从PyTorch的官方模型库或其他来源下载预训练权重。
上面是最简单的一种模型全部加载的方式但也有一些情况下只是想加载其中一部分层的参数。剩下一部分由于已经改变参数了无法加载预训练模型所以要选择随机初始化。 、
这里我们来观察网络怎么去表示的
if __name__ __main__:model VGG16()for name, value in model.named_parameters():print(name)
下面就是控制台打印出的部分信息。 这两行的输出就是打印网络层的名字实际上加载预训练模型时也是按照这个名字来加载的。
# 加载预训练 VGG16 模型的参数
pretrained_dict torch.load(pretrained_vgg16.pth)# 剔除预训练模型中全连接层的参数
pretrained_dict.pop(classifier.0.weight)
pretrained_dict.pop(classifier.0.bias)
pretrained_dict.pop(classifier.3.weight)
pretrained_dict.pop(classifier.3.bias)
pretrained_dict.pop(classifier.6.weight)
pretrained_dict.pop(classifier.6.bias)# 获取自定义模型的参数字典
model_dict model.state_dict()# 更新自定义模型的参数字典加载预训练模型的参数值
model_dict.update(pretrained_dict)# 加载更新后的参数字典到自定义模型中
model.load_state_dict(model_dict)
自己定义的一些层是不会出现在pretrained_dict中因此会将其剔除从而只加载了 pretrained_dict中有的层。
总结
本章只是对网络的定义进行一个简单的示例具体的部分我们会在另外一个专栏讲解这里只是为了让读者了解网络定义的流程。在实际项目中通常需要更详细的网络结构包括适当的初始化方法、损失函数的选择、优化器的设置等。如果读者了解掌握了基本的网络定义过程你可以在本专栏中深入讲解这些方面以及如何训练和评估模型等内容。