机器学习之反向传播(我的第一个机器学习项目)


只是通过此项目理解机器学习实现过程,若有对反向传播不理解的可以自己查阅资料或者和我交流,我们一起探讨。吴恩达老师和李宏毅老师的课程都挺不错,对机器学习感兴趣的可以自学一下。下附链接。
吴恩达
https://www.bilibili.com/video/BV164411b7dx?spm_id_from=333.999.0.0
李宏毅
https://www.bilibili.com/video/BV1Wv411h7kN

使用Numpy实现机器学习

首先,我们用最原始的Numpy实现有关回归的一个机器学习任务,不用
PyTorch中的包或类。这种方法代码可能多一点,但每一步都是透明的,有
利于理解每步的工作原理。主要步骤包括:首先,给出一个数组x,然后基于表达式y=3x^ 2 + 2,加上一些噪音数据到达另一组数据y。然后,构建一个机器学习模型,学习表达式y=wx^ 2+b的两个参数w、b。利用数组x,y的数据为训练数据。最后,采用梯度梯度下降法,通过多次迭代,学习到w、b的值。

具体实现步骤

1.库的导入

#导入库
import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt

2.生成输入数据x及目标数据y

#生成输入数据x及目标数据y
np.random.seed(100)
x = np.linspace(-1,1,100).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()

此时显示为
在这里插入图片描述

3.随机初始化参数

w1 = np.random.rand(1,1)
b1 = np.random.rand(1,1)

4.训练模型

在这里插入图片描述

#训练模型
lr = 0.0000001 #学习率
for i in range(800):
    #前向传播,并定义损失函数loss
    y_pred = x.pow(2).mm(w)+b
    loss = 0.5 * (y_pred - y) ** 2
    loss = loss.sum()
    #自动计算梯度,梯度存放在grad属性中
    loss.backward()
    # 手动更新参数,需要用torch.no_grad(),使上下文环境中切断自动求导的计算
    with t.no_grad():
        w -= lr * w.grad
        b -= lr * b.grad
    #梯度清零
    w.grad.zero_()
    b.grad.zero_()

5.可视化训练结果

plt.plot(x.numpy(), y_pred.detach().numpy(),'r',label='predict')#predict
plt.scatter(x.numpy(),y.numpy(),color='blue',marker='o',label='true') # true data
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w, b)

在这里插入图片描述

使用Tensor及Antograd实现机器学习

具体实现步骤

1.导入需要的库。

#导入需要的库
import torch as t
%matplotlib inline
from matplotlib import pyplot as plt

2.生成训练数据,并可视化数据分布情况。

#生成训练数据,并可视化数据分布情况。
t.manual_seed(100)
dtype = t.float
dtype = t.float
#生成x坐标数据,x为tenor,需要把x的形状转换为100x1
x = t.unsqueeze(torch.linspace(-1,1,100),dim = 1)
#生成y坐标数据,y为tenor,形状为100x1,另加上一些噪声
y = 3*x.pow(2)+2+0.2*torch.rand(x.size())
# 画图,把tensor数据转换为numpy数据
plt.scatter(x.numpy(),y.numpy())
plt.show()

在这里插入图片描述
3.随机初始化参数,参数w、b为需要学习的,故需requires_grad=True

w = t.randn(1,1, dtype=dtype,requires_grad=True)
b = t.randn(1,1, dtype=dtype, requires_grad=True)

4.训练模型

#训练模型
lr = 0.0000001 #学习率
for i in range(800):
    #前向传播,并定义损失函数loss
    y_pred = x.pow(2).mm(w)+b
    loss = 0.5 * (y_pred - y) ** 2
    loss = loss.sum()
    #自动计算梯度,梯度存放在grad属性中
    loss.backward()
    # 手动更新参数,需要用torch.no_grad(),使上下文环境中切断自动求导的计算
    with t.no_grad():
        w -= lr * w.grad
        b -= lr * b.grad
    #梯度清零
    w.grad.zero_()
    b.grad.zero_()

5.可视化训练结果

#可视化训练结果
plt.plot(x.numpy(), y_pred.detach().numpy(),'r-',label='predict')#predict
plt.scatter(x.numpy(), y.numpy(),color='blue',marker='o',label='true') # true data
plt.xlim(-1,1)
plt.ylim(2,6)
plt.legend()
plt.show()
print(w, b)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ap21ril

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值