本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/PyTorch
优化器:
在Pytorch中,优化器(Optimizer)是用于更新和计算模型参数的工具,目的是最小化或最大化一个损失函数。优化器根据损失函数的输出和模型的梯度信息来更新模型的权重。
Pytorch将常用的优化器封装在torch库的optim子模块中,各种优化算法(都继承自基类optim.Optimizer)可以使用以下语句查看:
import torch.optim as optim
dir(torch.optim)
['ASGD',
'Adadelta',
'Adagrad',
'Adam',
'AdamW',
'Adamax',
'LBFGS',
'NAdam',
'Optimizer',
'RAdam',
'RMSprop',
'Rprop',
'SGD',
'SparseAdam',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'_functional',
'_multi_tensor',
'lr_scheduler',
'swa_utils']
-
实例化优化器:
-
在训练循环中使用优化器:
使用优化器实现线性回归:
-
生成数据:
# 设置随机数种子,保证运行结果一致
torch.manual_seed(2024)
def get_fake_data(num):
"""
生成随机数据,y = 0.5 * x +30并加上一些随机噪声
"""
x = torch.randint(low = -5, high=30, size=(num,)).to(dtype=torch.float32)
y = 0.5 * x +30 + torch.randn(num,)
return x,y
x , y = get_fake_data(num=11)
# 对输入数据做归一化处理
x_new = x * 0.1
-
定义函数:
# 定义模型:
def model(x , w , b):
return w * x + b
# 定义损失函数:
def loss_fn(y_p , y):
squared_diffs = (y_p - y)**2
return squared_diffs.mean()
-
循环训练,求解参数值:
def training_loop(n_epochs , optimizer , params , x , y):
for epoch in range(1 , n_epochs+1):
#前向传播
y_p = model(x,*params)
loss = loss_fn(y_p ,y)
# 梯度归零
optimizer.zero_grad()
# 反向传播
loss.backward()
# 参数更新
optimizer.step()
if epoch % 10 ==0:
print(f"Epoch : {epoch} , Loss : {loss}")
print(f"Params : {params} , Grad : {params.grad}")
print("-----")
return params
# 实例化一个优化器
params=torch.tensor([1.0 , 0.0],requires_grad=True)
learning_rate=1e-2
optimizer = torch.optim.SGD([params] , lr=learning_rate)
training_loop(n_epochs=1000 , optimizer=optimizer , params=params , x=x_new , y=y)
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师