PyTorch基础(使用Tensor及Antograd实现机器学习)

使用Tensor及Antograd实现机器学习

2.6节可以说是纯手工完成一个机器学习任务,数据用Numpy表示,梯度及学习是自

己定义并构建学习模型。这种方法适合于比较简单的情况,如果稍微复杂一些,代码量将

几何级增加。那是否有更方便的方法呢?本节我们将使用PyTorch的一个自动求导的包

------antograd,利用这个包及对应的Tensor,便可利用自动反向传播来求梯度,无须手工

计算梯度。以下是具体实现代码。

1)导入需要的库。

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

python 复制代码
import torch as t
from matplotlib import pyplot as plt

t.manual_seed(10)
dytpe=t.float
#生成x坐标数据,x为tensor,需要把x的形状转换为100x1
x=t.unsqueeze(t.linspace(-1,1,100),dim=1)
#生成y坐标数据,y为tensor,形状为100x1,另加上一些噪声
y=3*x.pow(2)+2+0.2*t.rand(x.size())

#画图,把tensor数据转换为numpy数据
plt.scatter(x.numpy(),y.numpy())
plt.show()

运行结果:

3)初始化权重参数。

python 复制代码
# 随机初始化参数,参数w、b为需要学习的,故需requires_grad=True
w = t.randn(1,1, dtype=dtype,requires_grad=True)
b = t.zeros(1,1, dtype=dtype, requires_grad=True)

4)训练模型。

python 复制代码
lr =0.001 # 学习率
for ii 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)

完整代码

python 复制代码
import torch as t
from matplotlib import pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK']  = 'TRUE'  # 允许重复加载OpenMP
os.environ['OMP_NUM_THREADS']  = '1'  # 限制OpenMP线程数

t.manual_seed(10)
dtype=t.float
#生成x坐标数据,x为tensor,需要把x的形状转换为100x1
x=t.unsqueeze(t.linspace(-1,1,100),dim=1)
#生成y坐标数据,y为tensor,形状为100x1,另加上一些噪声
y=3*x.pow(2)+2+0.2*t.rand(x.size())

#画图,把tensor数据转换为numpy数据
#plt.scatter(x.numpy(),y.numpy())
#plt.show()

#随机初始化参数,参数w.b为需要学习的,故需requires_grad=True
w=t.randn(1,1,dtype=dtype,requires_grad=True)
b=t.zeros(1,1,dtype=dtype,requires_grad=True)

#训练模型
lr=0.001 #学习率

for ii 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_()

    #可视化训练结果
    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)

运行结果

相关推荐
Swaggy T8 分钟前
自动驾驶决策算法 —— 有限状态机 FSM
linux·人工智能·算法·机器学习·自动驾驶
雪可问春风15 分钟前
YOLOv8 训练报错:PyTorch 2.6+ 模型加载兼容性问题解决
人工智能·pytorch·yolo
神齐的小马32 分钟前
机器学习 [白板推导](九)[变分推断]
人工智能·机器学习
liliangcsdn44 分钟前
Mac M1探索AnythingLLM+Ollama+知识库问答
人工智能
元让_vincent1 小时前
论文Review 激光动态物体剔除 Dynablox | RAL2023 ETH MIT出品!
人工智能·计算机视觉·目标跟踪·机器人·自动驾驶·点云·动态物体剔除
青禾智源1 小时前
从零看懂 AR 智能眼镜:未来 10 年技术演进与新手入门指南
人工智能
POLOAPI1 小时前
一张照片秒变3D模型!微软Copilot 3D正在颠覆三维创作的游戏规则
人工智能·github copilot
热爱生活的五柒1 小时前
深度学习日志及可视化过程
人工智能·深度学习
心一信息1 小时前
修复图像、视频和3D场景的AI工具–Inpaint Anything
人工智能·3d
数字诗人1 小时前
Trae+supabase:四小时打造一个拥有前后端完整功能的社区论坛系统
人工智能