PyTorch 实现第一个神经网络

PyTorch包含一个创建和实现神经网络的特定功能,通过一个非常简单的神经网络的实现,但它包含了构建、训练和评估一个基本深度学习模型的核心步骤。可以尝试修改模型的结构、激活函数、损失函数和优化器,以及使用不同的数据集来进一步学习。本文主要介绍将创建一个简单的神经网络,它有一个隐含层,开发一个单独的输出单元。 以及使用PyTorch通过下面的步骤实现第一个神经网络。

1、导入torch和 torch.nn

首先,我们需要使用以下命令导入Pytorch库:

import torch 
import torch.nn as nn

2、定义变量

定义所有图层和批次大小以开始执行神经网络,如下所示:

# 分别定义输入大小、隐藏层大小、输出大小和批量大小
n_in, n_h, n_out, batch_size = 10, 5, 1, 10

3、输入数据

作为神经网络包括输入数据的组合来获取相应的输出数据,例如:

# Create dummy input and target tensors (data)
x = torch.randn(batch_size, n_in)
y = torch.tensor([[1.0], [0.0], [0.0], 
[1.0], [1.0], [1.0], [0.0], [0.0], [1.0], [1.0]])

4、创建模型

在内置功能的帮助下创建顺序模型。 使用以下代码行,创建顺序模型:

# Create a model
model = nn.Sequential(nn.Linear(n_in, n_h),
   nn.ReLU(),
   nn.Linear(n_h, n_out),
   nn.Sigmoid())

5、构建loss函数

利用梯度下降优化器构建损失函数,如下图所示:

Construct the loss function
criterion = torch.nn.MSELoss()
# 构建优化器(本例中为随机梯度下降)
optimizer = torch.optim.SGD(model.parameters(), lr = 0.01)

6、梯度下降模型

使用给定的代码行实现迭代循环的梯度下降模型

# 训练循环(50个epochs)
for epoch in range(50):
    # 前向传播:通过传递 x 到模型计算预测的 y
    y_pred = model(x)
    
    # 计算并打印损失
    loss = criterion(y_pred, y)
    print('Epoch:', epoch, 'Loss:', loss.item())
    
    # 清零梯度,进行反向传播,并更新权重
    optimizer.zero_grad()  # 清零之前的梯度
    loss.backward()  # 反向传播:计算梯度
    optimizer.step()  # 更新模型参数

7、完整代码

使用梯度下降(代码中是随机梯度下降)来最小化损失,通常用于监督学习任务中的模型训练。

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的模型(例如,单层神经网络)
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        # 一个简单的线性层,输入大小为 2,输出大小为 1
        self.fc = nn.Linear(2, 1) 

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

# 示例数据集(输入和目标)
# 示例特征(2D)
x = torch.tensor([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [4.0, 5.0]]) 
y = torch.tensor([[5.0], [7.0], [9.0], [11.0]])  # 示例目标(1D)

# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.MSELoss()  # 均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降优化器

# 训练循环(50个epochs)
for epoch in range(50):
    # 前向传播:通过传递 x 到模型计算预测的 y
    y_pred = model(x)
    
    # 计算并打印损失
    loss = criterion(y_pred, y)
    print('Epoch:', epoch, 'Loss:', loss.item())
    
    # 清零梯度,进行反向传播,并更新权重
    optimizer.zero_grad()  # 清零之前的梯度
    loss.backward()  # 反向传播:计算梯度
    optimizer.step()  # 更新模型参数

推荐阅读
cjavapy编程之路首页