基于一个例子,总结过去一个月的学习:
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中进行深度学习任务的初始化代码。让我简要解释一下这些代码的作用:
-
import torch
: 导入PyTorch库,PyTorch是一种流行的深度学习框架。 -
from torch import nn
: 从PyTorch库中导入神经网络模块(nn
)。这个模块包含了用于构建和训练神经网络的类和函数。 -
from torch.nn import init
: 从PyTorch的神经网络模块中导入初始化模块(init
)。初始化方法用于设置神经网络参数的初始值。 -
import numpy as np
: 导入NumPy库并将其重命名为np
。NumPy通常用于进行数值计算,常常与PyTorch一起使用。 -
import sys
: 导入sys模块,它提供了访问Python解释器维护的一些变量以及与解释器交互的功能。 -
sys.path.append("..")
: 将当前脚本所在目录的父目录添加到系统路径中。这允许您从父目录中导入模块和包。 -
import d2lzh_pytorch as d2l
: 导入名为d2lzh_pytorch
的模块,并将其重命名为d2l
。这似乎是您正在使用的一个自定义模块,用于深度学习相关任务,它存储在父目录中并在Python路径中附加了该模块。
问题:为什么导入torch库之后还要从torch库中导入其模块?
不知道回答是否正确。
定义模型
这段代码定义了一个简单的神经网络模型,使用了PyTorch中的nn.Sequential
容器来构建一个层的序列。让我逐行解释这段代码的作用:
-
num_inputs, num_outputs, num_hiddens = 784, 10, 256
: 这一行定义了三个变量,分别代表输入特征的数量(num_inputs
),输出类别的数量(num_outputs
),和中间隐藏层的大小(num_hiddens
)。 -
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
个输出类别。
-
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数据集进行训练和测试。以下是每一部分的解释:
-
batch_size = 256
: 这一行定义了批处理大小,即每次训练迭代中使用的数据样本数量。在这里,批处理大小设置为256。 -
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
: 这一行使用自定义的d2l
模块中的load_data_fashion_mnist
函数加载Fashion MNIST数据集,并将训练集和测试集分别存储在train_iter
和test_iter
中。数据集已经分成了批次,每个批次包含256个样本。 -
loss = torch.nn.CrossEntropyLoss()
: 这一行创建了一个交叉熵损失函数,用于计算模型输出与实际标签之间的损失。在分类任务中,交叉熵损失通常用作损失函数。 -
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
: 这里创建了一个随机梯度下降(SGD)优化器,用于更新神经网络的参数。net.parameters()
返回神经网络net
的所有可学习参数(权重和偏差),并将它们传递给SGD优化器,设置学习率(lr)为0.5。 -
num_epochs = 5
: 这一行定义了训练的总轮数,每个轮次会遍历整个训练数据集一次。 -
最后一行调用了
d2l.train_ch3
函数,该函数接受模型、训练数据迭代器、测试数据迭代器、损失函数、轮次数、批处理大小、以及其他一些可选参数。它将使用SGD优化器在训练数据上训练模型,然后在测试数据上评估模型的性能,最终输出训练过程中的损失和精度信息。
这段代码执行了一个训练过程,使用Fashion MNIST数据集对神经网络模型进行了5轮的训练,并在每轮后在测试数据集上进行性能评估。训练过程中使用了交叉熵损失函数和随机梯度下降优化器。通过这个过程,模型将逐渐学习适合Fashion MNIST分类任务的参数。
标签:nn,torch,神经网络,多层,感知机,pytorch,num,import,net From: https://www.cnblogs.com/H-force/p/17746503.html