赞
踩
\qquad 首先,给出一个数组 x x x,然后基于表达式 y = 3 x 2 + 2 y=3x^2+2 y=3x2+2,加上一些噪音数据到达另一组数据 y y y。
\qquad 然后,构建一个机器学习模型,学习表达式 y = w x 2 + b y=wx^2+b y=wx2+b 的两个参数 w 、 b w、b w、b。利用数组 x x x, y y y 的数据为训练数据。
\qquad 最后,采用梯度下降法,通过多次迭代,学习到 w 、 b w、b w、b 的值。
具 体 步 骤 如 下 : 具体步骤如下: 具体步骤如下:
# -*- coding:utf-8 -*-
import numpy as np
# 调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接python console里生成图像
%matplotlib inline
from matplotlib import pyplot as plot
# 设置随机数种子,生成同一份数据,以便用多种方法进行比较
np.random.seed(100)
x = np.linspace(-1,1,100).reshape(100,1)
# 为数据加入噪声 0.2 * np.random.rand(x.size).reshape(100,1)
y = 3 * np.power(x,2) + 2 + 0.2 * np.random.rand(x.size).reshape(100,1)
# 画图
plt.scatter(x,y)
plt.show()
# 随机初始化参数
w = np.random.rand(1,1)
b = np.random.rand(1,1)
lr = 0.001 # 学习率
# 迭代 800 次
for i in range(800):
# 前向传播
y_pred = np.power(x,2) * w + b
# 定义损失函数
loss = 0.5 * (y_pred - y) ** 2
loss = loss.sum()
# 计算梯度
grad_w = np.sum((y_pred - y) * np.power(x,2))
grad_b = np.sum((y_pred - y))
# 使用梯度下降法,是loss最小
w -= lr * grad_w
b -= lr * grad_b
y_pred = np.power(x,2) * w + b
plt.plot(x,y_pred,'r-',label='predict')
plt.scatter(x,y,color='blue',marker='o',label='true')
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w,b)
\qquad 使用 P y T o r c h PyTorch PyTorch 的自动求导包 a u t o g r a d autograd autograd 便可利用自动反向传播来求梯度 。
# 导入需要的库
import torch
%matplotlib inline
from matplotlib import pyplot as plt
# 生成训练数据,并可视化数据分布情况
torch.manual_seed(100)
# 生成x坐标数据,x为tensor,需要把x的形状转换为 100 x 1
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
# 生成y坐标数据,y为tensor,形状为 100 x 1,另加上一些噪声
y = 3 * x.pow(2) + 2 + 0.2 * torch.rand(x.size())
# 画图,把tensor数据转换为numpy数据
plt.scatter(x.numpy(),y.numpy())
plt.show()
# 随机初始化参数,参数w、b为需要学习的,故需requires_grad=True
w = torch.randn(1,1,dtype=torch.float,requires_grad=True)
b = torch.randn(1,1,dtype=torch.float,requires_grad=True)
lr = 0.001 # 学习率
for i in range(800):
# 前向传播
y_pred = x.pow(2).mm(w) + b
# 定义损失函数
loss = 0.5 * (y_pred - y) ** 2
loss = loss.sum()
# 自动计算梯度,梯度存放在grad属性中
loss.backward()
# 手动更新参数,需要用torch.,使上下文环境中切断自动求导的计算
# 强制之后的内容不进行计算图构建,节省了内存空间
with torch.no_grad():
w -= lr * w.grad
b -= lr * b.grad
# 梯度清零
w.grad.zero_()
b.grad.zero_()
y_pred = x.pow(2).mm(w) + b
# 涉及到梯度反向传播的tensor变量不能够直接使用numpy()转numpy
# 需要使用detach返回一个新的tensor,从当前的计算图中分离出来
plt.plot(x.numpy(),y_pred.detach().numpy(),'r-',label='predict')
plt.scatter(x.numpy(),y.numpy(),color='blue',marker='o',label='true')
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w,b)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。