深度学习中基于pytorch的多层感知机简洁实现

发布时间 2023-11-03 16:40:58作者: HDD-SG

基于一个例子,总结过去一个月的学习:

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("..") 
import d2lzh_pytorch as d2l

num_inputs, num_outputs, num_hiddens = 784, 10, 256

net = nn.Sequential(
        d2l.FlattenLayer(),
        nn.Linear(num_inputs, num_hiddens),
        nn.ReLU(),
        nn.Linear(num_hiddens, num_outputs), 
        )

for params in net.parameters():
    init.normal_(params, mean=0, std=0.01)

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
loss = torch.nn.CrossEntropyLoss()

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)

num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

导入需要的库

这段代码是用于在Python中进行深度学习任务的初始化代码。让我简要解释一下这些代码的作用:

  1. import torch: 导入PyTorch库,PyTorch是一种流行的深度学习框架。

  2. from torch import nn: 从PyTorch库中导入神经网络模块(nn)。这个模块包含了用于构建和训练神经网络的类和函数。

  3. from torch.nn import init: 从PyTorch的神经网络模块中导入初始化模块(init)。初始化方法用于设置神经网络参数的初始值。

  4. import numpy as np: 导入NumPy库并将其重命名为np。NumPy通常用于进行数值计算,常常与PyTorch一起使用。

  5. import sys: 导入sys模块,它提供了访问Python解释器维护的一些变量以及与解释器交互的功能。

  6. sys.path.append(".."): 将当前脚本所在目录的父目录添加到系统路径中。这允许您从父目录中导入模块和包。

  7. import d2lzh_pytorch as d2l: 导入名为d2lzh_pytorch的模块,并将其重命名为d2l。这似乎是您正在使用的一个自定义模块,用于深度学习相关任务,它存储在父目录中并在Python路径中附加了该模块。

问题:为什么导入torch库之后还要从torch库中导入其模块?
image
不知道回答是否正确。

定义模型

这段代码定义了一个简单的神经网络模型,使用了PyTorch中的nn.Sequential容器来构建一个层的序列。让我逐行解释这段代码的作用:

  1. num_inputs, num_outputs, num_hiddens = 784, 10, 256: 这一行定义了三个变量,分别代表输入特征的数量(num_inputs),输出类别的数量(num_outputs),和中间隐藏层的大小(num_hiddens)。

  2. net = nn.Sequential(...): 这里创建了一个神经网络模型,使用nn.Sequential容器将多个神经网络层按顺序堆叠在一起。具体的层包括:

    • d2l.FlattenLayer(): 这是自定义的展平层,用于将输入数据展平成一维向量。在深度学习中,通常需要将输入数据从多维形状展平为一维,以供全连接层使用。
    • nn.Linear(num_inputs, num_hiddens): 这是一个全连接层,它接受num_inputs个输入特征和num_hiddens个神经元。它执行线性变换操作。
    • nn.ReLU(): 这是激活函数层,使用ReLU(修正线性单元)激活函数来引入非线性性。
    • nn.Linear(num_hiddens, num_outputs): 这是另一个全连接层,接受num_hiddens个输入和num_outputs个输出类别。
  3. for params in net.parameters(): init.normal_(params, mean=0, std=0.01): 这个循环迭代遍历神经网络net的所有参数(包括权重和偏差),然后使用正态分布随机初始化它们。init.normal_是PyTorch中的初始化函数,它将参数初始化为均值为0、标准差为0.01的随机值。这是常用的初始化方法之一。

这段代码定义了一个包含两个全连接层和一个ReLU激活函数的神经网络,用于处理784维的输入数据,输出一个10维的向量,通常用于图像分类任务。随机初始化参数是深度学习中的常见步骤,以使模型能够在训练中逐渐学习适合任务的参数值。

读取数据并训练模型

这段代码涉及训练一个神经网络模型,使用Fashion MNIST数据集进行训练和测试。以下是每一部分的解释:

  1. batch_size = 256: 这一行定义了批处理大小,即每次训练迭代中使用的数据样本数量。在这里,批处理大小设置为256。

  2. train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size): 这一行使用自定义的d2l模块中的load_data_fashion_mnist函数加载Fashion MNIST数据集,并将训练集和测试集分别存储在train_itertest_iter中。数据集已经分成了批次,每个批次包含256个样本。

  3. loss = torch.nn.CrossEntropyLoss(): 这一行创建了一个交叉熵损失函数,用于计算模型输出与实际标签之间的损失。在分类任务中,交叉熵损失通常用作损失函数。

  4. optimizer = torch.optim.SGD(net.parameters(), lr=0.5): 这里创建了一个随机梯度下降(SGD)优化器,用于更新神经网络的参数。net.parameters()返回神经网络net的所有可学习参数(权重和偏差),并将它们传递给SGD优化器,设置学习率(lr)为0.5。

  5. num_epochs = 5: 这一行定义了训练的总轮数,每个轮次会遍历整个训练数据集一次。

  6. 最后一行调用了d2l.train_ch3函数,该函数接受模型、训练数据迭代器、测试数据迭代器、损失函数、轮次数、批处理大小、以及其他一些可选参数。它将使用SGD优化器在训练数据上训练模型,然后在测试数据上评估模型的性能,最终输出训练过程中的损失和精度信息。

这段代码执行了一个训练过程,使用Fashion MNIST数据集对神经网络模型进行了5轮的训练,并在每轮后在测试数据集上进行性能评估。训练过程中使用了交叉熵损失函数和随机梯度下降优化器。通过这个过程,模型将逐渐学习适合Fashion MNIST分类任务的参数。