#04 构建您的第一个神经网络:PyTorch入门指南

文章目录


前言

在过去的几天里,我们深入了解了深度学习的基础,从安装PyTorch开始,到理解Tensor运算,以及自动微分系统Autograd的工作原理。今天,我们将整合我们所学的知识和技能,并迈出一个重要的步伐:构建和训练我们的第一个神经网络。

在本篇博文中,我会指导您如何设计一个简单的全连接神经网络(也称为多层感知机MLP),并使用PyTorch作为您的工具。我们的目标是用这个网络解决一个分类问题,并了解神经网络训练的基本流程。让我们一步一步地进行。

理论基础

在开始编码之前,让我们先回顾一下全连接神经网络的基本组件和原理。一个典型的神经网络由多个层组成,每个层由多个神经元组成。在全连接网络中,一个层中的每个神经元都与前一层的所有神经元连接。这种密集的连接模式能让网络从输入数据中捕获复杂的模式。

神经网络层的组成

神经网络中的每一层主要包含以下部分:

  1. 输入节点:这些是将数据输入到网络的节点。
  2. 权重:每个连接都有一个权重,它决定了输入信号对神经元的激活程度的影响。
  3. 偏置:每个神经元都有一个偏置,它提供了除了输入以外的另一个调节激活的手段。
  4. 激活函数:它决定了神经元的输出,通常是一个非线性函数,如ReLU或Sigmoid。

前向传播与反向传播

神经网络的训练分为两个阶段:前向传播和反向传播。

  • 前向传播:在这个阶段,输入数据通过网络的每一层,每个神经元根据其权重、偏置和激活函数计算输出。
  • 反向传播:训练的这一部分涉及根据网络输出和实际结果之间的差异来调整权重和偏置。这是通过计算损失函数的梯度并将其反向传播到网络中完成的。

神经网络设计

现在,让我们设计一个简单的神经网络。假设我们要解决的是一个二分类问题,我们的网络将有两个输入节点(对应于两个特征),几个隐藏层,以及一个输出节点。

步骤1:准备数据集

在构建模型之前,我们首先需要准备数据集。通常,我们会对数据进行预处理,如标准化,然后分为训练集和测试集。

python 复制代码
import torch
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import train_test_split

# 假设data为特征,labels为标签
data_train, data_test, labels_train, labels_test = train_test_split(data, labels, test_size=0.2)
train_dataset = TensorDataset(torch.tensor(data_train, dtype=torch.float32), torch.tensor(labels_train, dtype=torch.float32))
test_dataset = TensorDataset(torch.tensor(data_test, dtype=torch.float32), torch.tensor(labels_test, dtype=torch.float32))

train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

步骤2:构建模型

接下来,我们将使用PyTorch定义我们的神经网络。我们将使用nn.Module作为基类,并定义我们的层和前向传播方法。

python 复制代码
import torch.nn as nn
import torch.nn.functional as F

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(2, 5)
        self.fc2 = nn.Linear(5, 1)

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

model = SimpleNN()

步骤3:定义损失函数和优化器

损失函数用于评估模型的预测与实际标签之间的差异。优化器用于根据损失函数的梯度更新模型的权重。

python 复制代码
import torch.optim as optim

criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

步骤4:训练模型

训练模型涉及多个迭代(或"epoch"),在每个迭代中,我们将完成一个完整的前向和后向传播过程。

python 复制代码
for epoch in range(100):  # 举例迭代100次
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), labels)
        loss.backward()
        optimizer.step()

步骤5:评估模型

最后,我们需要评估我们的模型性能,通常使用测试集来完成这个任务。

python 复制代码
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in test_loader:
        outputs = model(inputs)
        predicted = outputs.round().squeeze()  # 将输出四舍五入为0或1
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy: {100 * correct / total}%')

结论

在以上步骤中,我们从头开始构建了一个简单的神经网络,并在PyTorch中进行了训练和评估。这个过程涵盖了许多重要的概念和技巧,是进一步学习深度学习的坚实基础。

值得注意的是,真实世界的神经网络要复杂得多,涉及到更复杂的数据预处理、更深的网络结构、正则化技术,以及更精细的训练技巧。但通过这个基本的例子,我们已经开始了深度学习之旅,并为未来的学习打下了坚实的基础。

相关推荐
AI极客菌34 分钟前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭36 分钟前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^42 分钟前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Power20246662 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k2 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
沉下心来学鲁班2 小时前
复现LLM:带你从零认识语言模型
人工智能·语言模型
数据猎手小k2 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
YRr YRr2 小时前
深度学习:循环神经网络(RNN)详解
人工智能·rnn·深度学习
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘