PyTorch【6】常用优化器及损失函数

一.优化器

1.参数

optimizer = torch.optim.Adam(params,lr)

  • params:被优化的参数,通常为 model.parameters()
  • lr:学习率
  • 其余参数:不同的优化器有不同的具体参数

2.常用优化器

  • torch.optim.Adadelta()
  • torch.optim.Adagrad()
  • torch.optim.Adam()
  • torch.optim.Adamax()
  • torch.optim.ASGD()
  • torch.optim.LBFGS()
  • torch.optim.RMSprop()
  • torch.optim.Rprop()
  • torch.optim.SGD()

3.学习率的设置方式

(1).所有网络层有相同的学习率

optimizer = Adam(testnet.parameters(),lr=0.001)

(2).不同网络层有步同的学习率

optimizer = Adam(
    [{'params':model.hidden.parameters(),'lr':0.0001},
    {'params':model.regression.parameters(),'lr':0.01}],
    lr=1e-2 # 其他没有指定的所有参数
)

(3).不同的epoch设置不同的学习率

随着训练次数的增加,适当调整学习率会使得训练效果更好,达到这样的效果分为两步:

  • 选择合适的学习率更新表
  • 执行梯度更新
from torch.optim.lr_scheduler import LambdaLR,StepLR,MultiStepLR,ExponentialLR,CosineAnnealingLR

# 1.不同的参数组设置不同的学习调整策略
LambdaLR(optimizer,			# 优化器
         lr_lambda,			# 自定义调整规则
         last_epoch=-1,		# 始调整学习率的时间,默认-1表示初始值
         verbose=False		# 是否打印更新状态
)

# Example:
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()
    scheduler.get_lr()	# 获取当前的学习率

# 2.等间隔调整学习率
StepLR(
    optimizer,
    step_size,			# 学习率更新的epoch间隔
    gamma=0.1,			# 学习率调整为上个间隔的gamma倍
    last_epoch=-1,
    verbose=False
)

# Example:
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 60
# lr = 0.0005   if 60 <= epoch < 90
# ......
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()

# 3.按照设定的间隔调整学习率
MultiStepLR(
    optimizer,
    milestones,			# epoch间隔列表,必须递增
    gamma=0.1,			# 学习率调整为上个间隔的gamma倍
    last_epoch=-1,
    verbose=False)

# Example:
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 80
# lr = 0.0005   if epoch >= 80
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()


# 4.按照实数衰减设置学习率
ExponentialLR(optimizer,gamma,last_epoch=-1,verbose=False)
	# lr 的变化情况为:lr = lr*(gamma^epoch)

# 5.余弦为周期,在每个周期最大值时调整学习率
CosineAnnealingLR(optimizer,T_max,eta_min=0,last_epoch=-1,verbose=False)
	# T_max (int): 迭代iterations次后重新调整学习率
	# eta_min (float): 每个epoch的最小学习率

二.损失函数

1.参数

# 均方误差
torch.nn.MSELoss(
    size_average=True,	# 计算的损失为每个batch的均值,否则为每个batch的和。未来会被reduction代替
    reduce=True,		# 是否根据size_average参数设定计算损失。未来会被reduction代替
    reduction='mean'	# 计算损失的方式:'none'|'mean'|'sum'。'mean':损失为每个batch的均值,'sum':损失为每个batch的和
)

# 交叉熵损失函数
torch.nn.CrossEntropyLoss(
    weight,
    size_average=True,
    ignore_index=True,
    reduction='mean',
    label_smoothing=0.0)	# 标签平滑系数

2.常用损失函数

名称使用类型
torch.nn.L1Loss()平均绝对值误差损失回归
torch.nn.MSELoss()均方误差损失回归
torch.nn.CrossEntropyLoss()交叉熵损失多分类
torch.nn.NLLLoss()负对数似然函数损失多分类
torch.nn.NLLLoss2d()图片负对数似然函数损失图像分割
torch.nn.KLDivLoss()KL散度损失回归
torch.nn.BCELoss()二分类交叉熵损失函数二分类
torch.nn.MarginRankingLoss()评价相似度的损失
torch.nn.MultiLabelMarginLoss()多标签分类的损失多标签分类
torch.nn.SmoothL1Loss()平滑的L1损失回归
torch.nn.SoftMarginLoss()多标签二分类问题的损失多标签二分类
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值