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)

运行结果

相关推荐
墨染天姬2 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114242 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠2 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光3 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好3 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力3 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo3 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_3 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能
枫叶林FYL3 小时前
【自然语言处理 NLP】7.2.2 安全性评估与Constitutional AI
人工智能·自然语言处理