deeplearning.md 28 KB

返回 AI book AI book

深度学习

深度学习入门手册

以下是一份深度学习的入门手册,旨在帮助你理解深度学习的基本概念、工具和技术,并通过简单的代码示例来展示如何使用深度学习解决实际问题。

深度学习入门手册

一、深度学习简介

深度学习是机器学习的一个子领域,它基于人工神经网络,试图从大量的数据中自动学习特征表示。与传统的机器学习方法相比,深度学习模型可以自动学习数据的层次化表示,通常在处理图像、音频、文本等复杂数据时表现出色。

(一)核心概念

  • 神经网络:深度学习的基础,由许多相互连接的神经元组成,这些神经元按照层状结构排列,包括输入层、隐藏层和输出层。每个神经元接收输入,进行加权求和,并通过激活函数产生输出。
  • 激活函数:引入非线性,使得神经网络可以学习非线性关系。常见的激活函数有 Sigmoid、ReLU(Rectified Linear Unit)、Tanh 等。
  • 损失函数:衡量模型预测结果与真实结果之间的差异,常见的有均方误差(MSE)、交叉熵损失(Cross Entropy Loss)等,用于训练过程中优化模型。
  • 优化器:根据损失函数的梯度更新神经网络的权重,以最小化损失。常见的优化器有随机梯度下降(SGD)、Adam、RMSProp 等。

  • 书籍:《Deep Learning》(深度学习),由 Ian Goodfellow 等人编写,是深度学习领域的经典著作。

DeepLearning 深度学习的图书

  • 论文:在 arXiv 和顶级会议(如 NeurIPS、ICML、ICLR)上阅读最新的深度学习论文,了解前沿研究。

中科院计算所 智能计算系统 AI Computing Systems 陈云霁

一套完整的智能计算体系,课件+源代码 智能计算系统 AI Computing Systems 陈云霁

最好的学习就是干项目

实例

基于深度学习的垃圾分类 http://www.gitcc.com/ai100/dl-wastesort

深度学习识别网站验证码

使用深度学习对人体心电数据进行多分类

使用深度学习对人体心电数据进行多分类

工业场景:基于深度学习的滚动轴承故障诊断方法

基于深度学习的滚动轴承故障诊断方法

了解的一些项目,不一定是要做,但是看看真实的项目,培养感觉

1 轴承数据集故障诊断的仿真平台 用了简单的几个深度学习算法

轴承数据集故障诊断的仿真平台

深度学习常见算法

以下是深度学习中的一些常见算法:

一、多层感知机(Multilayer Perceptron,MLP)

  • 算法介绍
    • MLP是一种最基本的前馈神经网络,由输入层、一个或多个隐藏层和输出层组成。每层包含多个神经元,神经元之间全连接。每个神经元接收上一层神经元的输出,经过加权求和和激活函数处理后传递给下一层。
    • 激活函数用于引入非线性,常见的激活函数有 Sigmoid、ReLU、Tanh 等。
    • MLP可以处理各种类型的数据,如分类、回归等任务,但在处理图像、音频、文本等复杂数据时,可能需要更多的预处理和特征工程。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.utils.data import DataLoader
    from torchvision import datasets, transforms
    
    
    # 数据预处理
    transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
    ])
    
    
    # 加载MNIST数据集
    trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
    
    
    # 定义MLP模型
    class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, 10)
    
    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x
    
    
    model = MLP()
    
    
    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    
    
    # 训练模型
    for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if i % 100 == 99:
            print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 100:.3f}')
            running_loss = 0.0
    
  • 代码解释

    • 首先,我们使用 transforms 对 MNIST 数据集进行预处理,将图像转换为张量并标准化。
    • 定义 MLP 模型,包含三个全连接层,使用 ReLU 作为激活函数。
    • 采用 CrossEntropyLoss 作为损失函数,SGD 作为优化器。
    • 在训练过程中,对每个 batch 进行前向传播、计算损失、反向传播和参数更新。

二、卷积神经网络(Convolutional Neural Network,CNN)

  • 算法介绍
    • CNN是专门为处理具有网格结构数据(如图像)而设计的网络。它由卷积层、池化层、全连接层等组成。
    • 卷积层使用卷积核在输入上滑动进行卷积操作,提取局部特征。池化层(如最大池化、平均池化)对特征图进行降维操作,减少参数和计算量。
    • 常见的 CNN 架构包括 LeNet、AlexNet、VGG、ResNet 等,用于图像分类、目标检测、图像分割等任务。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.utils.data import DataLoader
    from torchvision import datasets, transforms
    
    
    # 数据预处理
    transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
    ])
    
    
    # 加载MNIST数据集
    trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
    trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
    
    
    # 定义简单的CNN模型
    class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.fc1 = nn.Linear(64 * 5 * 5, 128)
        self.fc2 = nn.Linear(128, 10)
    
    
    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.max_pool2d(x, 2)
        x = torch.relu(self.conv2(x))
        x = torch.max_pool2d(x, 2)
        x = torch.flatten(x, 1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x
    
    
    model = SimpleCNN()
    
    
    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    
    
    # 训练模型
    for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if i % 100 == 99:
            print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 100:.3f}')
            running_loss = 0.0
    
  • 代码解释

    • 定义了一个简单的 CNN 模型,包含两个卷积层、两个池化层和两个全连接层。
    • 卷积层使用 Conv2d 模块,池化层使用 max_pool2d 模块。
    • 使用 Adam 优化器进行训练,训练过程与 MLP 类似。

三、循环神经网络(Recurrent Neural Network,RNN)

  • 算法介绍
    • RNN 主要用于处理序列数据,如时间序列、文本等。它具有内部的循环结构,允许信息在序列中传递。
    • 基本的 RNN 存在梯度消失和梯度爆炸问题,因此发展出了 LSTM(Long Short-Term Memory)和 GRU(Gated Recurrent Unit)等变种,通过门控机制解决这些问题。
    • 可用于文本生成、机器翻译、语音识别等任务。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    
    # 定义简单的RNN模型
    class SimpleRNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleRNN, self).__init__()
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)
    
    
    def forward(self, x):
        out, _ = self.rnn(x)
        out = self.fc(out[:, -1, :])
        return out
    
    
    # 输入和输出维度
    input_size = 10
    hidden_size = 20
    output_size = 1
    
    
    # 创建模型、损失函数和优化器
    model = SimpleRNN(input_size, hidden_size, output_size)
    criterion = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=0.01)
    
    
    # 输入数据
    x = torch.randn(1, 5, input_size)
    y = torch.randn(1, output_size)
    
    
    # 训练模型
    for epoch in  range(100):
    optimizer.zero_grad()
    output = model(x)
    loss = criterion(output, y)
    loss.backward()
    optimizer.step()
    
  • 代码解释

    • 定义了一个简单的 RNN 模型,包含一个 RNN 层和一个全连接层。
    • batch_first=True 表示输入数据的维度顺序为 (batch, seq_length, input_size)
    • 使用 MSELoss 作为损失函数,Adam 作为优化器,对随机生成的数据进行训练。

四、长短时记忆网络(Long Short-Term Memory,LSTM)

  • 算法介绍
    • LSTM 是一种特殊的 RNN,具有记忆单元和三个门(输入门、遗忘门、输出门),可以更好地处理长序列中的长期依赖问题。
    • 能够在处理序列数据时选择性地记住或忘记信息,使其在自然语言处理、时间序列预测等任务中表现出色。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    
    # 定义简单的LSTM模型
    class SimpleLSTM(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SimpleLSTM, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)
    
    
    def forward(self, x):
        out, _ = self.lstm(x)
        out = self.fc(out[:, -1, :])
        return out
    
    
    # 输入和输出维度
    input_size = 10
    hidden_size = 20
    output_size = 1
    
    
    # 创建模型、损失函数和优化器
    model = SimpleLSTM(input_size, hidden_size, output_size)
    criterion = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=0.01)
    
    
    # 输入数据
    x = torch.randn(1, 5, input_size)
    y = torch.randn(1, output_size)
    
    
    # 训练模型
    for epoch in range(100):
    optimizer.zero_grad()
    output = model(x)
    loss = criterion(output, y)
    loss.backward()
    optimizer.step()
    
  • 代码解释

    • 定义了一个简单的 LSTM 模型,包含一个 LSTM 层和一个全连接层。
    • batch_first=True 表示输入数据的维度顺序为 (batch, seq_length, input_size)
    • 训练过程与 RNN 类似,但使用 LSTM 层处理序列数据。

五、生成对抗网络(Generative Adversarial Network,GAN)

  • 算法介绍
    • GAN 由生成器(Generator)和判别器(Discriminator)组成。生成器试图生成逼真的数据,判别器试图区分真实数据和生成器生成的数据。
    • 两者通过对抗训练,最终生成器可以生成高质量的模拟数据,可用于图像生成、数据增强、风格迁移等任务。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    
    # 定义生成器
    class Generator(nn.Module):
    def __init__(self, input_size, output_size):
        super(Generator, self).__init__()
        self.main = nn.Sequential(
            nn.Linear(input_size, 128),
            nn.ReLU(),
            nn.Linear(128, 256),
            nn.ReLU(),
            nn.Linear(256, output_size),
            nn.Tanh()
        )
    
    
    def forward(self, x):
        return self.main(x)
    
    
    # 定义判别器
    class Discriminator(nn.Module):
    def __init__(self, input_size):
        super(Discriminator, self).__init__()
        self.main = nn.Sequential(
            nn.Linear(input_size, 128),
            nn.LeakyReLU(0.2),
            nn.Linear(128, 64),
            nn.LeakyReLU(0.2),
            nn.Linear(64, 1),
            nn.Sigmoid()
        )
    
    
    def forward(self, x):
        return self.main(x)
    
    
    # 输入和输出维度
    input_size = 100
    output_size = 784
    
    
    # 创建生成器和判别器
    generator = Generator(input_size, output_size)
    discriminator = Discriminator(output_size)
    
    
    # 定义损失函数和优化器
    criterion = nn.BCELoss()
    optimizer_G = optim.Adam(generator.parameters(), lr=0.0002)
    optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002)
    
    
    # 训练过程
    for epoch in range(100):
    # 训练判别器
    optimizer_D.zero_grad()
    real_data = torch.randn(64, output_size)
    real_labels = torch.ones(64, 1)
    fake_data = generator(torch.randn(64, input_size))
    fake_labels = torch.zeros(64, 1)
    
    
    real_output = discriminator(real_data)
    fake_output = discriminator(fake_data.detach())
    
    
    loss_D_real = criterion(real_output, real_labels)
    loss_D_fake = criterion(fake_output, fake_labels)
    loss_D = loss_D_real + loss_D_fake
    loss_D.backward()
    optimizer_D.step()
    
    
    # 训练生成器
    optimizer_G.zero_grad()
    fake_data = generator(torch.randn(64, input_size))
    fake_output = discriminator(fake_data)
    loss_G = criterion(fake_output, real_labels)
    loss_G.backward()
    optimizer_G.step()
    
  • 代码解释

    • 生成器将随机噪声作为输入,输出模拟数据。判别器将输入数据判断为真或假。
    • 使用 BCELoss 作为损失函数,Adam 作为优化器。
    • 训练过程中,先训练判别器区分真假数据,再训练生成器生成更逼真的数据。

六、自编码器(Autoencoder)

  • 算法介绍
    • 自编码器是一种无监督学习算法,由编码器和解码器组成。编码器将输入数据压缩为低维表示(隐层),解码器将隐层表示还原为原始数据。
    • 可用于数据降维、特征提取、去噪等任务。
  • 代码示例

    import torch
    import torch.nn as nn
    import torch.optim as optim
    
    
    # 定义自编码器
    class Autoencoder(nn.Module):
    def __init__(self):
        super(Autoencoder, self).__init__()
        self.encoder = nn.Sequential(
            nn.Linear(784, 128),
            nn.ReLU(),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Linear(64, 32)
        )
        self.decoder = nn.Sequential(
            nn.Linear(32, 64),
            nn.ReLU(),
            nn.Linear(64, 128),
            nn.ReLU(),
            nn.Linear(128, 784),
            nn.Tanh()
        )
    
    
    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x
    
    
    model = Autoencoder()
    
    
    # 定义损失函数和优化器
    criterion = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    
    
    # 输入数据
    x = torch.randn(1, 784)
    
    
    # 训练模型
    for epoch in range(100):
    optimizer.zero_grad()
    outputs = model(x)
    loss = criterion(outputs, x)
    loss.backward()
    optimizer.step()
    
  • 代码解释

    • 编码器将输入数据降维,解码器将其还原。
    • 使用 MSELoss 作为损失函数,Adam 作为优化器,训练过程旨在最小化重构误差。

这些深度学习算法是深度学习领域的基础,每个算法都有其独特的特点和适用场景,在实际应用中,可根据具体任务选择合适的算法并进行相应的调参和优化。

深度学习领域在不断发展,新的算法和改进不断涌现,你可以通过阅读学术论文、参加在线课程、参与开源项目等方式不断更新知识,提升技能。

深度学习一般都是一个流程,所以很容易就会发明 框架

以下是深度学习的一般流程:

一、问题定义

  • 明确你想要解决的问题,例如图像分类、目标检测、语义分割、文本翻译、语音识别等。确定问题的类型(分类、回归、生成等)和性能指标(如准确率、召回率、F1分数、均方误差等),这将指导后续的模型选择和评估方法。

二、数据收集与预处理

  • 数据收集
    • 从各种来源收集相关数据,如公开数据集(如MNIST、CIFAR-10、ImageNet等),或通过网络爬虫、传感器采集、用户输入等方式获取数据。
    • 确保数据的多样性和代表性,以保证模型能够学习到不同情况下的特征。
  • 数据预处理
    • 数据清洗:去除噪声数据、处理缺失值和异常值。例如,在处理文本数据时,可能需要删除无效字符;对于图像数据,可能需要修复损坏的图像。
    • 数据归一化或标准化:将数据缩放到合适的范围,例如将图像像素值归一化到[0, 1]或[-1, 1]区间,以加快模型收敛速度和提高稳定性。
    • 数据增强:对于图像和音频数据,可通过旋转、翻转、裁剪、添加噪声等方式增加数据的多样性,防止过拟合。在自然语言处理中,可通过同义词替换、词序调整等进行数据增强。
    • 数据分割:将数据划分为训练集、验证集和测试集。通常,大部分数据用于训练,一小部分用于验证和测试,比例可以是 70:15:15 或 80:10:10 等。

三、选择深度学习模型

  • 根据问题类型和数据特征选择合适的模型架构,例如:
    • 图像任务
      • 对于图像分类,可选择卷积神经网络(CNN),如经典的 AlexNet、VGG、ResNet、Inception 等。
      • 对于目标检测,可选择 YOLO、Faster R-CNN、SSD 等。
      • 对于图像分割,可选择 U-Net、Mask R-CNN 等。
    • 序列数据任务
      • 对于文本处理,可选择循环神经网络(RNN)及其变种 LSTM、GRU,或更现代的 Transformer 架构,如 BERT、GPT 等。
      • 对于时间序列预测,可选择 LSTM、GRU 或 Prophet 等。
    • 生成任务
      • 可选择生成对抗网络(GAN)或变分自编码器(VAE)等。

四、模型构建

  • 定义模型架构
    • 使用深度学习框架(如TensorFlow、PyTorch)构建模型。
    • 确定网络的层数、每层的神经元数量、激活函数(如ReLU、Sigmoid、Tanh)、池化层(如最大池化、平均池化)、正则化(如 L1、L2 正则化)等。
    • 对于复杂任务,可能需要构建更复杂的架构,如编码器-解码器结构或多分支结构。
  • 损失函数选择
    • 对于分类任务,可使用交叉熵损失(如二元交叉熵、多分类交叉熵)。
    • 对于回归任务,可使用均方误差(MSE)、平均绝对误差(MAE)等。
    • 对于生成任务,可使用如生成对抗网络中的二元交叉熵。
  • 优化器选择
    • 常见的优化器有随机梯度下降(SGD)及其变种(如 SGD with momentum、Adagrad、Adadelta、RMSProp、Adam 等)。选择合适的学习率,并可根据需要调整优化器的其他参数,如动量(momentum)。

五、模型训练

  • 初始化模型参数:随机初始化或使用预训练的参数。
  • 设置训练超参数:如学习率、批次大小、训练轮次(epochs)等。
  • 训练过程
    • 将训练数据分批输入模型,进行前向传播,计算损失。
    • 进行反向传播,使用优化器更新模型参数。
    • 通常会使用验证集评估模型在训练过程中的性能,以监控过拟合或欠拟合情况,可使用早停法(Early Stopping)避免过拟合。

六、模型评估与优化

  • 评估:使用测试集评估模型的性能,根据之前确定的性能指标计算得分。
  • 优化
    • 如果性能未达到预期,可调整超参数(如学习率、批次大小、网络结构等),或尝试不同的优化器、损失函数。
    • 也可收集更多数据或对现有数据进行更精细的预处理。
    • 采用集成学习方法,将多个模型的结果进行组合,提高性能。

七、模型部署与应用

  • 将训练好的模型部署到实际应用中,例如:
    • 对于图像分类模型,可部署在移动设备或服务器上,用于图像识别应用。
    • 对于自然语言处理模型,可集成到聊天机器人、文本分类系统等。
    • 对于生成模型,可用于生成新的数据,如生成图像、文本等。

八、持续改进

  • 收集新的数据,不断更新和优化模型,以适应新的情况或提高性能。

深度学习是一个迭代的过程,在不同阶段都可能需要根据实际情况进行调整和优化,以获得最佳性能。通过不断的实验和学习,可以逐步提高对深度学习的掌握和应用能力。

如果你需要更深入的信息,如每个步骤的代码示例或对某个阶段的详细解释,可以继续向我询问。

二、深度学习框架

目前有许多深度学习框架可供选择,以下是几个常用的:

  • TensorFlow:由 Google 开发,功能强大且灵活,提供了从简单到复杂的各种深度学习模型的实现。
  • PyTorch:以其动态计算图和易于使用的接口而受到欢迎,特别适合研究和开发。
  • Keras:一个高级的神经网络 API,可以在 TensorFlow 或 Theano 上运行,提供了简洁的接口,适合快速开发。

三、深度学习入门步骤

(一)环境搭建

以下是使用 PyTorch 搭建深度学习环境的示例:

pip install torch torchvision torchtext

(二)数据准备

深度学习的第一步是准备数据。以图像分类任务为例,我们可以使用 torchvision 中的 MNIST 数据集。

import torch
import torchvision
import torchvision.transforms as transforms

# 定义数据预处理
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5,), (0.5,))]
)

# 下载训练集和测试集
trainset = torchvision.datasets.MNIST(root='./data', train=True,
                                download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                    shuffle=True, num_workers=2)

testset = torchvision.datasets.MNIST(root='./data', train=False,
                               download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                   shuffle=False, num_workers=2)
  • 解释
    • transforms.ToTensor() 将图像转换为 PyTorch 的 Tensor 类型。
    • transforms.Normalize((0.5,), (0.5,)) 对数据进行标准化,使其范围在 -1 到 1 之间。
    • torch.utils.data.DataLoader 用于将数据集封装为可迭代的数据加载器,便于批量处理。

(三)构建神经网络

下面是一个简单的全连接神经网络的 PyTorch 实现:

import torch.nn as nn
import torch.nn.functional as F


class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 输入层到第一个隐藏层
        self.fc2 = nn.Linear(128, 64)    # 第一个隐藏层到第二个隐藏层
        self.fc3 = nn.Linear(64, 10)     # 第二个隐藏层到输出层

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 将图像展平
        x = F.relu(self.fc1(x))  # 第一个隐藏层,使用 ReLU 激活函数
        x = F.relu(self.fc2(x))  # 第二个隐藏层,使用 ReLU 激活函数
        x = self.fc3(x)        # 输出层
        return x


net = SimpleNet()
  • 解释
    • nn.Linear 表示全连接层。
    • forward 方法定义了数据的前向传播路径,将输入通过各层和激活函数。

(四)定义损失函数和优化器

选择合适的损失函数和优化器:

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
  • 解释
    • nn.CrossEntropyLoss() 用于多分类任务。
    • optim.SGD 是随机梯度下降优化器,lr 是学习率,momentum 可以加速收敛。

(五)训练模型

以下是训练网络的代码:

# 训练周期
epochs = 10

for epoch in range(epochs):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        # 清零梯度
        optimizer.zero_grad()

        # 前向传播
        outputs = net(inputs)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 200 == 199:
            print(f'Epoch {epoch + 1}, Batch {i + 1}, Loss: {running_loss / 200:.3f}')
            running_loss = 0.0

print('Finished Training')
  • 解释
    • 每个 epoch 遍历整个数据集,optimizer.zero_grad() 清除梯度。
    • outputs = net(inputs) 是前向传播,loss.backward() 是反向传播,optimizer.step() 更新权重。

(六)测试模型

以下是测试模型性能的代码:

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        inputs, labels = data
        outputs = net(inputs)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')
  • 解释
    • torch.no_grad() 表示在测试阶段不计算梯度。
    • torch.max(outputs.data, 1) 找出每个样本输出概率最大的类别作为预测类别。

(七)保存和加载模型

保存和加载训练好的模型:

# 保存模型
torch.save(net.state_dict(), 'simplenet.pth')

# 加载模型
net = SimpleNet()
net.load_state_dict(torch.load('simplenet.pth'))

四、深度学习的应用

深度学习在许多领域都有广泛的应用,包括但不限于:

  • 图像识别:如物体识别、人脸识别、场景分类等。
  • 自然语言处理:文本分类、机器翻译、情感分析等。
  • 语音识别:语音转文本、语音命令识别等。

五、进阶学习资源

  • 在线课程:Coursera 上的“深度学习专项课程”,由 Andrew Ng 教授讲授,涵盖深度学习的基础知识和实践。
  • 书籍:《Deep Learning》(深度学习),由 Ian Goodfellow 等人编写,是深度学习领域的经典著作。

DeepLearning 深度学习的图书

  • 论文:在 arXiv 和顶级会议(如 NeurIPS、ICML、ICLR)上阅读最新的深度学习论文,了解前沿研究。

最好的学习就是干项目

实例 商业级别 到这个水平 可以卖钱,接项目了

1) 基于深度学习高性能中文车牌识别 基于深度学习高性能中文车牌识别

2)基于深度学习的滚动轴承故障诊断方法 基于深度学习的滚动轴承故障诊断方法

3)基于深度学习的肿瘤辅助诊断系统 基于深度学习的肿瘤辅助诊断系统

4)一个基于深度学习的中文语音识别系统 一个基于深度学习的中文语音识别系统

5)利用卫星和航空图像进行深度学习的技术 利用卫星和航空图像进行深度学习的技术

当然,还有我们自己开源的 基于深度学习的工业低代码平台

https://www.gitcc.com/democode/ai-demo-hub

# 返回 AI book AI book