其实各大深度学习框架背后的原理都可以理解为拟合一个参数数量特别庞大的函数,所以各框架都能用来拟合任意函数,Pytorch也能。
在这篇博客中,就以拟合y = ax + b为例(a和b为需要拟合的参数),说明在Pytorch中如何拟合一个函数。
一、定义拟合网络
1、观察普通的神经网络的优化流程
# 定义网络
net = ...
# 定义优化器
optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005)
# 定义损失函数
loss_op = torch.nn.MSELoss(reduction='sum')
# 优化
for step, (inputs, tag) in enumerate(dataset_loader):
# 向前传播
outputs = net(inputs)
# 计算损失
loss = loss_op(tag, outputs)
# 清空梯度
optimizer.zero_grad()
# 向后传播
loss.backward()
# 更新梯度
optimizer.step()
上面的代码就是一般情况下的流程。为了能使用Pytorch内置的优化器,所以我们需要定义一个一个网络,实现函数parameters(返回需要优化的参数)和forward(向前传播);为了能支持GPU优化,还需要实现cuda和cpu两个函数,把参数从内存复制到GPU上和从GPU复制回内存。
基于以上要求,网络的定义就类似于:
class Net:
def __init__(self):
# 在这里定义要求的参数
pass
def cuda(self):
# 传输参数到GPU
pass
def cpu(self):
# 把参数传输回内存
pass
def forward(self, inputs):
# 实现向前传播,就是根据输入inputs计算一遍输出
pass
def parameters(self):
# 返回参数
pass
在拟合数据量很大时,还可以使用GPU来加速;如果没有英伟达显卡,则可以不实现cuda和cpu这两个函数。
2、初始化网络
回顾本文目的,拟合: y = ax + b, 所以在__init__函数中就需要定义a和b两个参数,另外为了实现parameters、cpu和cuda,还需要定义属性__parameters和__gpu:
def __init__(self):
# y = a*x +