python怎么使用预训练的模型_PyTorch使用预训练模型

PyTorch模型加载的时候,有预训练模型,通过使用预训练模型可以给模型使用带来很多的便捷,对于模型的使用以下给出了一些总结,如有错误恳请指正。

一、直接加载预训练模型进行训练

1、加载保存的整个模型

torch.save(model,'model.pkl')

...

model = torch.load('model.pkl')

2、加载保存的模型参数

torch.save(model.state_dict(),'model_state_dict.pkl')

...

model.load_state_dict(torch.load('model_state_dict.pkl'))

关于模型的保存和加载,可以详细参照我的这篇文章:HUST小菜鸡:Pytorch搭建简单神经网络(三)——快速搭建、保存与提取​zhuanlan.zhihu.comv2-5aed9b4858ee329f1de0b9d5ff33ce4a_180x120.jpg

通过对模型参数的保存的解析,我们可以深入的了解

load_dict = torch.load('models/cifar10_statedict.pkl')

print(load_dict.keys())

print(type(load_dict))

输出的结果如下所示:

odict_keys(['conv1.0.weight', 'conv1.0.bias', 'conv2.0.weight', 'conv2.0.bias', 'conv3.0.weight', 'conv3.0.bias', 'conv4.0.weight', 'conv4.0.bias', 'conv5.0.weight', 'conv5.0.bias', 'conv6.0.weight', 'conv6.0.bias', 'classifier.1.weight', 'classifier.1.bias', 'classifier.3.weight', 'classifier.3.bias', 'classifier.5.weight', 'classifier.5.bias'])

可以看出保存的state_dict其实是一个collections.OrderedDict的Object,和普通的dict不同的是,该类别是有着严格的顺序,而dict中的元素是没有严格的顺序。

但是有一个问题值得深入考量——两个网络的结构是一样的,但是结构的命名是不一样的,那么对于这种模型的加载,如果不一样的话会出现报错,该如何解决

参照以上结果的输出,state_dict中key就是网络结构的名称,所以当网络结构一样的时候,只需要修改索引key,就可以解决以上的问题,至于如何修改可以参照如下方式:https://stackoverflow.com/questions/12150872/change-key-in-ordereddict-without-losing-order​stackoverflow.com

二、加载部分预训练模型

我们经常对现有的经典网络进行如下操作,我们不修改网络的主体部分,我们只修改网络的输出,或者在最后加上一些网络层来达到我们想要的输出结果,虽然很难保证网络模型和某些公开的模型完全一样,但是预训练模型的参数确实有助于提高训练的准确率,为了结合二者的优点,就需要我们加载部分预训练模型。

model = cifar10_cnn.CIFAR10_Nettest()

pretrained_dict = torch.load('models/cifar10_statedict.pkl')

model_dict = model.state_dict()

print('随机初始化权重第一层:',model_dict['conv1.0.weight'])

# 将pretrained_dict里不属于model_dict的键剔除掉

pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}

print('预训练权重第一层:',pretrained_dict['conv1.0.weight'])

# 更新现有的model_dict

model_dict.update(pretrained_dict) #利用预训练模型的参数,更新模型

model.load_state_dict(model_dict)

print('更新后权重第一层:',model_dict['conv1.0.weight'])

输出的部分结果如下所示,为了直观显示我只截取了中间的某一部分

随机初始化权重第一层: tensor([[[[ 0.0142, 0.1039, 0.1260],

[ 0.1805, -0.0533, 0.0007],

[-0.1032, -0.1039, -0.0633]],

[[ 0.0714, -0.0053, 0.0059],

[-0.0528, 0.0438, -0.1108],

[ 0.0544, 0.0157, 0.1265]],

预训练权重第一层: tensor([[[[ 8.0685e-02, -3.8643e-02, 3.4450e-02],

[-2.3942e-01, -1.5474e-01, 1.3142e-01],

[-9.4602e-02, 6.4120e-02, -9.4336e-02]],

[[ 9.7318e-02, 1.0526e-01, 2.3400e-03],

[-5.8471e-02, -8.8146e-02, -1.6053e-01],

[-1.0788e-01, -5.9083e-02, -9.0651e-02]],

更新后权重第一层: tensor([[[[ 8.0685e-02, -3.8643e-02, 3.4450e-02],

[-2.3942e-01,

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: segmentation_models_pytorch 是一个基于 PyTorch 的图像分割库,可以用来训练语义分割模型。下面是使用 segmentation_models_pytorch 实现单模型训练的基本步骤: 1. 安装 segmentation_models_pytorch 和其依赖项: ``` pip install segmentation-models-pytorch ``` 2. 加载数据集并进行预处理。可以使用 torchvision 或者其他图像处理库加载数据集,并对数据进行预处理,如裁剪、缩放、归一化等操作。 3. 定义模型使用 segmentation_models_pytorch 中提供的模型类(如 UNet、FPN、PSPNet 等)来定义模型。 ```python import segmentation_models_pytorch as smp model = smp.Unet( encoder_name="resnet34", # 使用 ResNet34 作为编码器 encoder_weights="imagenet", # 加载预训练权重 in_channels=3, # 输入通道数 classes=2, # 分类数 ) ``` 4. 定义损失函数和优化器。可以选择使用交叉熵损失函数和 Adam 优化器。 ```python import torch.nn as nn import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 5. 训练模型使用 DataLoader 加载数据集,并对模型进行训练。 ```python from torch.utils.data import DataLoader train_loader = DataLoader(dataset, batch_size=4, shuffle=True) for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}") ``` 6. 保存模型。训练完毕后,可以使用 torch.save() 方法将模型保存到本地。 ```python torch.save(model.state_dict(), "model.pth") ``` ### 回答2: segmentation_models_pytorch是一个基于PyTorch实现的语义分割模型库。使用segmentation_models_pytorch实现单模型训练可以通过以下步骤完成。 首先,安装segmentation_models_pytorch库。可以通过pip install segmentation_models_pytorch命令来安装。 导入所需的库和模型。常用的库包括torch,torchvision和segmentation_models_pytorch。可以使用以下命令导入库: ```python import torch import torchvision.transforms as transforms import segmentation_models_pytorch as smp ``` 加载和预处理训练数据。可以使用torchvision中的transforms来定义一系列的数据预处理操作,例如裁剪、缩放和标准化等。之后,使用torch.utils.data.DataLoader来加载和批量处理数据。 定义模型架构。可以选择使用segmentation_models_pytorch中预定义的模型架构,例如UNet、PSPNet和DeepLab等。根据任务需求选择合适的模型,并初始化相关参数。 定义优化器和损失函数。常见的优化器有Adam和SGD等,损失函数常选择交叉熵损失函数。可以使用torch.optim中的函数来定义优化器,使用torch.nn中的损失函数来定义损失函数。 进行模型训练。使用torch.utils.data.DataLoader加载训练数据集,并迭代训练数据集中的每个批次。将批次数据输入模型中进行前向传播,获取模型的输出。计算损失,并进行反向传播更新模型的参数。重复以上步骤直到达到预定的训练轮数或达到设定的训练目标。 保存和加载训练好的模型。可以使用torch.save函数将训练好的模型保存到指定的文件路径,使用torch.load函数加载保存的模型文件。 以上是使用segmentation_models_pytorch实现单模型训练的基本步骤。根据具体任务和数据的不同,可能还需要进行一些细节操作,例如数据增强、学习率调整和模型评估等。 ### 回答3: segmentation_models_pytorch是一个基于PyTorch的分割模型训练库,可以应用于图像分割任务。下面我将介绍如何使用segmentation_models_pytorch实现单模型训练。 首先,我们需要安装segmentation_models_pytorch库。可以使用pip命令进行安装: ``` pip install segmentation-models-pytorch ``` 在训练之前,我们需要准备好训练数据和标签。通常情况下,训练数据是一些图像,标签则是对应每个像素点的分类或分割结果。 接下来,我们需要导入所需的库: ``` import segmentation_models_pytorch as smp import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset ``` 然后,我们需要创建一个自定义的数据集类,该类继承自torch.utils.data.Dataset类,并实现__len__和__getitem__方法,用于加载和处理数据。 接着,我们可以选择一个合适的分割模型,比如Unet、FPN等。这些模型可以通过调用smp库中的函数进行初始化,比如: ``` model = smp.Unet( encoder_name="resnet34", encoder_weights="imagenet", classes=1, activation='sigmoid' ) ``` 在这里,我们选择了一个使用ResNet-34作为编码器、预训练权重为ImageNet数据集、分类数为1(二分类问题)的Unet模型。 然后,我们可以定义损失函数和优化器: ``` criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 接着,我们可以进行训练循环,依次迭代数据进行训练和优化: ``` for epoch in range(num_epochs): for batch in dataloader: inputs, labels = batch optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 最后,我们可以保存模型并在需要预测时加载模型进行测试: ``` torch.save(model.state_dict(), "segmentation_model.pt") model.load_state_dict(torch.load("segmentation_model.pt")) ``` 以上就是使用segmentation_models_pytorch实现单模型训练的过程。根据具体任务需求,你也可以调整模型、损失函数、优化器等参数来进行更灵活的训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值