pytorch如何定义损失函数,如何定义优化器,如何反向传播,如何更新梯度。pytorch如何用GPU运行程序。GPU如何用部分网络训练好的参数=PyTorch学习笔记(四)

  • Post author:
  • Post category:其他




数据:

通常来说,先要将数据用python包来加载到numpy里面,再转换成torch.tensor。

对于图像-pliiow/opencv

对于声音-scipy/librosa

对于文本-用python加载就可以

torchvision:用于载入图像的包。

torchvision.datasets:图片转换包。

torch.utils.data.Dataloader:图像转换包。



优化器和损失函数

#先定义一个损失函数
criterion = torch.nn.MSELoss(reduction='sum')
#定义优化器,参数主要是学习率和动量
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4, momentum=0.9)

#然后在后面的程序中把输出和预测放入criterion中
loss = criterion(y_pred, y)

选择损失函数优化器,写法相对固定。



反向传播更新参数

#先将梯度归零
optimizer.zero_grad()
#反向传播
loss.backward()
#梯度优化更新参数
optimizer.step()

经典三部,不管网络和整体结构如何变化,都是这几布,只需要将这几步嵌套在自己定义的循环当中就可以了。



使用部分模型参数进行训练

# 使用部分预训练模型方法1
model = VGG19(num_classes=2, init_weights=False)
model_dict = model.state_dict()
# 加载预训练模型
state_dict = torch.load('pretrained/vgg19-dcbb9e9d.pth')
# 把相同参数名的参数找出来
new_state_dict = {k: v for k, v in state_dict.items() if k in model_dict}
# 更新参数
model_dict.update(new_state_dict)
# 加载模型参数
model.load_state_dict(model_dict)

# 使用部分预训练模型方法2
model = VGG19(num_classes=2, init_weights=False)
# 加载模型参数时,令strict为False
# 表明不严格要求state_dict中的键与该模块中state_dict()函数返回的键匹配
model.load_state_dict(torch.load('pretrained/vgg19-dcbb9e9d.pth'), strict=False)

大部分时候都是需要自己进行训练的,如果数据量比较少,可以考虑迁移学习,也就是用别人训练好的参数。



使用GPU跑程序



1.首先你需要一个性能好的GPU。

2.安装gpu版本的pytorch,如何安装,官网有安装指令。(注意conda的镜像已经不支持pytorch了,所以还是换成本来的源慢慢下载吧),当然也可以使用pip。

3.步骤

import os

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
#如果有多个的话,自己选择gpu的编号
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
#确认是否可用
torch.cuda.is_available()
#支持的话就可以添加以下语句进行使用
device = torch.device('cuda:0')
model.to(device)
images = images.to(device)
labels = labels.to(device)



版权声明:本文为wacebb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。