Pytorch_study_Task_2:设立计算图并自动计算
1.numpy和pytorch实现梯度下降法
包含:
设定初始值
求取梯度
在梯度方向上进行参数的更新
通过函数y=x2实现梯度下降
用numpy实现梯度下降法
x =1 #设定初始值
learning_rate =0.1 #学习率
epoches =100
y =lambda x:x**2 #简单曲线
for epoch in range(epoches):
dx =2*x #求取梯度
x = x-learning_rate*dx; #在梯度方向上进行参数的更新
print(x)
输出 x 接近于0:
2.0370359763344877e-10
用pytorch实现梯度下降法
import torch
x = torch.randn(1,1,requires_grad =True) #设定初始值
print('grad',x.grad,'data',x.data) #打印获得的随机初始值
learning_rate =0.1
epoches =100
for epoch in range(epoches):
y = x**2
y.backward()
print("grad",x.grad.data) #求取梯度
x.data = x.data - learning_rate*x.grad.data #在梯度方向上进行参数的更新
x.grad.data.zero_()
print(x.data)
x获得的随机初始值为;
grad None data tensor([[0.8927]])
输出 x 接近由于0:
tensor([[1.8184e-10]])
2.pytorch实现线性回归
包含:
pytorch实现一个简单的神经网络
用函数y = a * x^2 + b建立数据集,并给数据 y 加上一点噪声:
import torch
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size()) # noisy y data (tensor), shape=(100, 1)
建立神经网络:
import torch
import torch.nn.functional as F # 激励函数都在这
class Net(torch.nn.Module): # 继承 torch 的 Module
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__() # 继承 __init__ 功能
# 定义每层用什么样的形式
self.hidden = torch.nn.Linear(n_feature, n_hidden) # 隐藏层线性输出
self.predict = torch.nn.Linear(n_hidden, n_output) # 输出层线性输出
def forward(self, x): # 这同时也是 Module 中的 forward 功能
# 正向传播输入值, 神经网络分析出输出值
x = F.relu(self.hidden(x)) # 激励函数(隐藏层的线性值)
x = self.predict(x) # 输出值
return x
net = Net(n_feature=1, n_hidden=10, n_output=1)
print(net) # net 的结构
net 的结构为:
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
训练网络:
# optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss() # 预测值和真实值的误差计算公式 (均方差)
for t in range(100):
prediction = net(x) # 喂给 net 训练数据 x, 输出预测值
loss = loss_func(prediction, y) # 计算两者的误差
optimizer.zero_grad() # 清空上一步的残余更新参数值
loss.backward() # 误差反向传播, 计算参数更新值
optimizer.step() # 将参数更新值施加到 net 的 parameters 上
注:“pytorch实现线性回归”中代码参考莫烦PYTHON:https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/302_classification.py