PyTorch深度学习代码框架常用方法汇总
PyTorch深度学习代码框架常用方法汇总
在深度学习项目中,使用PyTorch框架时经常会遇到一些常用的方法和技巧。本文总结了一些在PyTorch深度学习代码框架中常用的方法,包括命令行参数解析、GPU训练、学习率调度、参数管理等,希望能帮助读者更好地理解和使用PyTorch。
argparse.ArgumentParser()
argparse
是Python用于解析命令行参数的标准模块,详细信息可以参考官方文档。
- 导入argparse模块:
import argparse
- 创建一个解析对象:
parser = argparse.ArgumentParser()
- 向解析对象中添加要关注的命令行参数和选项:
parser.add_argument()
部分参数解释:
metavar:当
ArgumentParser
生成帮助消息时,它需要用某种方式来引用每个预期的参数。默认情况下,ArgumentParser
对象使用dest
值作为每个对象的"名称"。默认情况下,对于位置参数,dest
值将被直接使用,而对于可选参数,dest
值将被转换为大写形式。因此,一个位置参数dest='bar'
的引用形式将为bar
。一个带有单独命令行参数的可选参数--foo
的引用形式将为FOO
。可以使用metavar
来指定一个替代名称。choices:某些命令行参数应当从一组受限的值中选择。这可以通过将一个序列对象作为
choices
关键字参数传给add_argument()
来处理。当执行命令行解析时,参数值将被检查,如果参数不是可接受的值之一,就将显示错误消息。
- 调用
parse_args()
进行解析:parser.parse_args()
字符串函数-strip()
strip()
函数用于移除字符串头尾指定的字符(默认为空格)或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
使用GPU进行训练的几种方法
os.environ['CUDA_VISIBLE_DEVICES']
:使用指定的GPU及GPU显存,是设定程序对哪几张显卡可视。需要放在.py
文件的开头。使用
model.to(device)
:
import torch.nn as nn
import torch.optim as optim
# 定义模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# ...
def forward(self, x):
# ...
model = Net()
# 将模型和数据加载到GPU中
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
data = data.to(device)
# 定义优化器和损失函数
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)
- 使用
torch.cuda.set_device("cuda:0")
:
import torch
torch.cuda.set_device("cuda:0")
model.cuda()
data = data.cuda()
torch.optim.lr_scheduler
用于在训练过程中修改学习率(learning_rate)。示例:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
scheduler = ExponentialLR(optimizer, gamma=0.9)
for epoch in range(20):
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
scheduler.step()
CLASS torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
当epoch数达到milestones中的一个时,衰减每个参数组的学习率。注意,这种衰减可以与其他方式同时进行。当last_epoch=-1时,设置初始lr为lr。
nn.Parameter()
用于把普通的tensor转换为可学习的tensor。
super()和 __ init __()
super(FasterRCNN, self).__init__(backbone, rpn, roi_heads, transform)
super()
用来调用父类(基类)的方法,__init__()
是类的构造方法,super().__init__()
就是调用父类的init
方法,同样可以使用super()
去调用父类的其他方法。
train_iter = iter(train_loader),data, _ = next(train_iter)
iter()
函数用来生成迭代器,即通过iter()
函数获取这些可迭代对象的迭代器,实际上就是调用了可迭代对象的__iter__
方法。
next()
得到迭代对象的值,并且将迭代对象指向下一个值。
直接调用self()
比如:results = self(**data, mode=mode)
在PyTorch的nn.Module
实现中,__call__()
方法中直接调用了forward()
方法,所以一般看到self()
其实就是在运行forward
方法了。