当前位置: 首页 > article >正文

PyTorch实战-模拟线性函数和非线性函数

1 需求

需求:模拟y=x

需求:模拟y=x^2


2 接口


3.* y=x

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
import matplotlib.pyplot as plt


# 自定义数据集类
class MyDataset(Dataset):
    def __init__(self, start=-10, end=10, num_points=100):
        self.x = torch.linspace(start, end, num_points).view(-1, 1)
        self.y = self.x

    def __len__(self):
        return len(self.x)

    def __getitem__(self, idx):
        return self.x[idx], self.y[idx]


# 定义一个简单的线性模型,y = x 可以表示为 y = 1 * x + 0,这里使用线性层来模拟
class LinearModel(nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        # 输入维度为 1,输出维度为 1
        self.linear = nn.Linear(1, 1)

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


# 实例化模型
model = LinearModel()

# 定义损失函数,这里使用均方误差损失
criterion = nn.MSELoss()
# 定义优化器,使用随机梯度下降,学习率为 0.01
optimizer = optim.SGD(model.parameters(), lr=0.01)


# 实例化自定义数据集
dataset = MyDataset()
# 实例化 DataLoader,batch_size 为 10
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)


# 开始训练
num_epochs = 1000
for epoch in range(num_epochs):
    running_loss = 0.0
    for i, (inputs, targets) in enumerate(dataloader):
        # 前向传播
        outputs = model(inputs)
        # 计算损失
        loss = criterion(outputs, targets)
        # 清空梯度
        optimizer.zero_grad()
        # 反向传播
        loss.backward()
        # 更新参数
        optimizer.step()
        running_loss += loss.item()
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss / len(dataloader):.4f}')


# 测试模型
# 生成测试数据,这里使用和训练数据相同的范围,也可以使用新的范围
x_test = torch.linspace(-10, 10, 100).view(-1, 1)
y_test = model(x_test)


# 可视化结果
plt.plot(dataset.x.detach().numpy(), dataset.y.detach().numpy(), label='True')
plt.plot(x_test.detach().numpy(), y_test.detach().numpy(), label='Predicted')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('y = x')
plt.show()

3.* y=x^2

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
import matplotlib.pyplot as plt


# 自定义数据集类
class MyDataset(Dataset):
    def __init__(self, start=-10, end=10, num_points=100):
        self.x = torch.linspace(start, end, num_points).view(-1, 1)
        # 计算 y = x^2
        self.y = self.x ** 2

    def __len__(self):
        return len(self.x)

    def __getitem__(self, idx):
        return self.x[idx], self.y[idx]


# 定义一个简单的神经网络模型
class QuadraticModel(nn.Module):
    def __init__(self):
        super(QuadraticModel, self).__init__()
        # 一个简单的神经网络,包含一个隐藏层
        self.fc1 = nn.Linear(1, 10)
        self.fc2 = nn.Linear(10, 1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x


# 实例化模型
model = QuadraticModel()

# 定义损失函数,这里使用均方误差损失
criterion = nn.MSELoss()
# 定义优化器,使用随机梯度下降,学习率为 0.01
optimizer = optim.SGD(model.parameters(), lr=0.01)


# 实例化自定义数据集
dataset = MyDataset()
# 实例化 DataLoader,batch_size 为 10
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)


# 开始训练
num_epochs = 1000
for epoch in range(num_epochs):
    running_loss = 0.0
    for i, (inputs, targets) in enumerate(dataloader):
        # 前向传播
        outputs = model(inputs)
        # 计算损失
        loss = criterion(outputs, targets)
        # 清空梯度
        optimizer.zero_grad()
        # 反向传播
        loss.backward()
        # 更新参数
        optimizer.step()
        running_loss += loss.item()
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss / len(dataloader):.4f}')


# 测试模型
# 生成测试数据,这里使用和训练数据相同的范围,也可以使用新的范围
x_test = torch.linspace(-10, 10, 100).view(-1, 1)
y_test = model(x_test)


# 可视化结果
plt.plot(dataset.x.detach().numpy(), dataset.y.detach().numpy(), label='True')
plt.plot(x_test.detach().numpy(), y_test.detach().numpy(), label='Predicted')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('y = x^2')
plt.show()

4 参考资料


http://www.kler.cn/a/447397.html

相关文章:

  • node express服务器配置orm框架sequilize
  • 安装milvus以及向量库增删改操作
  • MacOS安装MySQL
  • Java性能测试Benchmark使用总结
  • 开源轮子 - Logback 和 Slf4j
  • 音频接口:PDM TDM128 TDM256
  • 基于matlab的单目相机标定
  • C语言 文件操作——按字符读写文件
  • uni-app开发商品分类页面实现
  • 奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试
  • IIoT赋能绿色智造:2025制造业的可持续发展之路
  • 主要是使用#includenlohmannjson.hpp时显示找不到文件,但是我文件已正确导入visual studio配置,也保证文件正确存在
  • .NET重点
  • 标准模板库(STL)中的一个容器 都有什么
  • ARM学习(38)多进程多线程之间的通信方式
  • 工业摄像机基于电荷耦合器件的相机
  • 三格电子——新品IE103转ModbusTCP网关
  • C++ OCR银行卡文字识别
  • 【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
  • vue-flow流程图组件
  • 基于SpringBoot的“旅游管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 模型数据算法概论
  • 【Elasticsearch04】企业级日志分析系统ELK之Elasticsearch 插件
  • 方格分割(蓝桥杯2017年试题D)
  • 台球助教系统开发之助教预约功能模块需求分析(第十三章)
  • 【Python】利用函数模拟创建【栈】的数据结构操作