使用Tensorflow2和Pytorch实现线性回归

本文介绍如何使用TensorFlow2和Pytorch实现线性回归,并详细展示了从数据准备到模型训练及测试的全过程。通过代码示例,读者可以直观地看到loss随迭代次数减少的趋势。
部署运行你感兴趣的模型镜像

使用Tensorflow2和Pytorch实现线性回归

步骤

准备步骤:
1. 创建数据集
2. 设置超参数
3. 创建模型(函数)
4. 选择损失函数
5. 选择优化器

训练步骤:
6. 通过模型(函数)前向传播
7. 计算损失
8. 对超参数求梯度
9. 使用优化器利用梯度调整超参数

测试步骤:
10. 创建测试集
11. 通过模型得到预测结果
12. 画出散点图和曲线图

Tensorflow2代码

import tensorflow as tf
import numpy as np
from tensorflow.keras import Model
from tensorflow.keras.losses import MeanSquaredLogarithmicError
from tensorflow.keras.optimizers import SGD
import matplotlib.pyplot as plt

#初始化参数
x=tf.reshape(tf.range(0,15,dtype=tf.float32),[15,1])
y=3*x+tf.constant(np.random.randn(15,1).astype(np.float32))+4
w=tf.Variable(np.random.rand(),dtype=tf.float32)
b=tf.Variable(np.random.rand(),dtype=tf.float32)

print('x=',np.reshape(x,[1,15]),'\ny=',np.reshape(y,[1,15]),'\nw=',w,'\nb=',b)

#创建模型
class My_model(Model):
    def __init__(self):
        super().__init__()

    # 构建一个线性层
    def linear(self,x):
        return w*x+b

    def call(self,x):
        x=self.linear(x)
        return x

#定义超参数
epoch=1500 #迭代次数
Ir=0.01 #学习率
model=My_model() #初始化模型
optimizer=SGD(learning_rate=Ir) #初始化优化器
losser=MeanSquaredLogarithmicError() #初始化损失函数
all_loss=[] #用于存储loss

print('--------------训练------------------------------------------------------------------')

for i in range(1,epoch+1):
    with tf.GradientTape() as tape:
        cy = model(x)  # 前向传播,获得预测值
        loss = losser(cy, y) #计算loss
        grad=tape.gradient(loss,[w,b]) #求出w,b的梯度
    optimizer.apply_gradients(zip(grad,[w,b]))
    if i%10==0:
        all_loss.append(loss) #添加loss
        print('epoch:',i,'loss:',loss) #打印loss值

print('w:',w,'\nb:',b)
print('--------------测试------------------------------------------------------------------')
#画图
plt.rcParams['font.sans-serif']=['SimHei'] #载入字体
px=tf.reshape(tf.range(0,15,0.1,dtype=tf.float32),[150,1])
py=model(px)
plt.subplot(121)
plt.title('结果图')
plt.scatter(x,y)
plt.plot(px.numpy(),py.numpy())
plt.subplot(122)
plt.title('loss图')
plt.plot(px.numpy(),all_loss)
plt.show()

效果

效果如图:
随着迭代次数的增加,loss逐渐减小。
在这里插入图片描述
在这里插入图片描述

Pytorch代码

import torch as th
from torch.nn import Module,Linear,MSELoss
from torch.optim import SGD
import matplotlib.pyplot as plt

#初始化参数
x=th.arange(0,15,1,dtype=th.float32).view(15,1)
y=3*x+th.randn(15,1,dtype=th.float32)+4
w=th.rand(1)
b=th.rand(1)
print('x=',x.view(1,15),'\ny=',y.view(1,15),'\nw=',w,'\nb=',b)
print('--------------训练------------------------------------------------------------------')
#创建模型
class My_model(Module):
    def __init__(self,input_shape,output_shape):
        super().__init__()
        self.linear=Linear(input_shape,output_shape)

    def forward(self,x):
        x=self.linear(x)
        return x

#定义超参数
epoch=1500 #迭代次数
Ir=0.01 #学习率
model=My_model(1,1) #初始化模型
optimizer=SGD(model.parameters(),Ir) #初始化优化器
losser=MSELoss() #初始化损失函数
all_loss=[] #用于存储loss

for i in range(1,epoch+1):
    optimizer.zero_grad() #将优化器的梯度清零,防止叠加
    cy=model(x)  #前向传播,获得预测值
    loss=losser(cy,y)
    loss.backward() #计算loss和反向传播
    optimizer.step() #更新权重
    if i%10==0:
        all_loss.append(loss)
        print('epoch:',i,'loss:',loss) #打印loss值

print(optimizer.state)
print('--------------测试------------------------------------------------------------------')
#画图
plt.rcParams['font.sans-serif']=['SimHei'] #载入字体
px=th.arange(0,15,0.1,dtype=th.float32,requires_grad=False).view(150,1)
py=model(px)
plt.subplot(121)
plt.title('结果图')
plt.scatter(x,y)
plt.plot(px.detach().numpy(),py.detach().numpy())
plt.subplot(122)
plt.title('loss图')
plt.plot(px.detach().numpy(),all_loss)
plt.show()

效果

效果如下:
随着迭代次数的增加,loss逐渐减小。
在这里插入图片描述
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### TensorFlowPyTorch 的技术特性与应用场景对比 #### 技术特性 **TensorFlow** 是由 Google 开发的开源深度学习框架,其核心特点是基于静态计算图(Static Computation Graph)的设计。在模型定义阶段,用户需要先定义完整的计算流程,然后才能执行具体的计算任务。这种设计使得 TensorFlow 在部署性能优化方面具有优势,尤其是在大规模分布式训练生产环境中表现突出。TensorFlow 提供了完整的生态系统,包括 TensorFlow Lite(移动端推理)、TensorFlow.js(浏览器端推理)、TensorFlow Serving(模型服务)等工具链[^1]。 **PyTorch** 是由 Facebook(现 Meta)开发的开源深度学习框架,其核心特点是基于动态计算图(Dynamic Computation Graph)的设计。动态图允许用户在运行时即时构建执行计算流程,这使得 PyTorch 在调试开发过程中更加灵活直观,特别适合研究快速原型开发。PyTorch 的 API 设计更接近 Python 原生语法,降低了学习门槛,因此在学术界研究领域受到广泛欢迎。PyTorch 同样具备完整的工具链,包括 TorchScript(模型导出与部署)、PyTorch Lightning(简化训练流程)、TorchVision(计算机视觉模型库)等[^1]。 #### 性能与优化 TensorFlow 在执行效率方面表现优异,尤其是在 GPU 多设备并行计算方面。TensorFlow 支持自动设备分配优化,能够充分利用 GPU 的并行计算能力。其默认使用 XLA(Accelerated Linear Algebra)编译器对计算图进行优化,从而提升推理训练速度。TensorFlow 的分布式训练能力也较为成熟,支持多 GPU、TPU 跨节点训练[^4]。 PyTorch 在 GPU 加速方面同样表现出色,通过 CUDA 后端实现高效的 GPU 计算。PyTorch 的动态图机制在灵活性上优于 TensorFlow,但在性能优化方面略逊一筹,特别是在大规模训练部署场景中。然而,随着 TorchScript TorchDynamo 的发展,PyTorch 在模型编译优化方面的能力不断提升,逐步缩小与 TensorFlow 的差距。此外,PyTorch 提供了丰富的调试工具,如 Py-Spy TorchViz,有助于开发者深入分析模型执行过程。 #### 应用场景 **TensorFlow** 更适用于工业级部署大规模生产环境,例如: - 搜索引擎中的推荐系统 - 语音识别与自然语言处理服务 - 自动驾驶机器人控制中的模型推理 - 跨平台部署(移动端、浏览器、嵌入式设备) **PyTorch** 更适合研究快速迭代场景,例如: - 学术研究中的新模型开发 - 强化学习生成对抗网络(GAN)实验 - 医疗图像分析与生物信息学研究 - 教育教学中的模型实现与调试 #### 示例代码:使用 TensorFlow PyTorch 实现线性回归 ```python # TensorFlow 实现线性回归 import tensorflow as tf # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(1, input_shape=(1,)) ]) # 编译模型 model.compile(optimizer='sgd', loss='mean_squared_error') # 训练模型 model.fit(x_train, y_train, epochs=100) ``` ```python # PyTorch 实现线性回归 import torch import torch.nn as nn import torch.optim as optim # 定义模型 class LinearRegression(nn.Module): def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(1, 1) def forward(self, x): return self.linear(x) model = LinearRegression() # 定义损失函数优化器 criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(100): inputs = torch.from_numpy(x_train).float() labels = torch.from_numpy(y_train).float() optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月明Mo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值