基于小土堆学习
神经网络的搭建
神经网络pytorch官方文档:
pytorch官方说明文档
torch.nn是pytorch存放神经网络的工具箱
-
Containers
Containers(容器)在神经网络中通常不是一个特指的技术术语,但在编程和数据处理中,容器可以泛指用于存储和管理数据的结构,如列表、字典、数组等。在神经网络的上下文中,可能指的是封装了多个网络层的结构,如PyTorch中的nn.Module,它作为一个基类,用于构建所有神经网络模块。这些模块可以被视为包含(或封装)了网络层的容器。更好的叫法是骨架,也就是神经网络的骨架,后续填充不同内容既可以组成神经网络。 -
Convolution Layers(卷积层)
卷积层是卷积神经网络(CNN)的核心组成部分,主要用于特征提取。它通过卷积核在输入图像上滑动,进行局部区域的加权求和操作,从而提取图像的空间层次特征。卷积层的关键参数包括卷积核大小、步长(stride)、填充(padding)等。 -
Pooling Layers(池化层)
池化层也称为取样层,通常紧跟在卷积层之后,用于降低特征图的维度(即高度和宽度),同时保留重要的特征信息。池化操作有助于减少计算量,控制过拟合,并引入平移不变性。常见的池化方法包括最大池化(Max Pooling)和平均池化(Average Pooling)。 -
Padding Layers(填充层)
填充层主要用于在输入特征图的边界周围添加额外的像素值(通常是0或边界值的复制),以调整输入特征图的尺寸,从而控制卷积层或池化层的输出尺寸。填充可以增加特征图的尺寸(当填充值大于0时),也可以保持特征图的尺寸不变(通过适当的填充和步长设置)。 -
Non-linear Activations(非线性激活)
非线性激活函数是神经网络中引入非线性的关键,使得神经网络能够逼近复杂的非线性函数。常见的非线性激活函数包括ReLU(Rectified Linear Unit)、Sigmoid、Tanh等。这些函数作用于神经元的输出,增加网络的非线性表达能力。 -
Normalization Layers(归一化层)
归一化层用于对输入特征进行归一化处理,以加速网络训练过程并提高模型的泛化能力。常见的归一化方法包括BatchNorm(批量归一化)、LayerNorm(层归一化)、InstanceNorm(实例归一化)和GroupNorm(组归一化)等。这些方法通过调整特征的均值和方差,使得不同批次或不同样本之间的特征分布更加一致。
其他层或概念简述:
Recurrent Layers(循环层):如LSTM(长短期记忆网络)和GRU(门控循环单元),用于处理序列数据。
Transformer Layers:基于自注意力机制的层,广泛应用于自然语言处理任务。
Linear Layers(线性层):全连接层,用于将输入特征映射到输出空间。
Dropout Layers(丢弃层):在训练过程中随机丢弃一部分神经元,以防止过拟合。
Sparse Layers(稀疏层):设计用于处理稀疏输入数据的层。
Distance Functions(距离函数):用于计算样本间距离的函数,如欧氏距离、余弦相似度等。
Loss Functions(损失函数):用于评估模型预测值与真实值之间差异的函数,指导模型训练过程。
Vision Layers:专门用于视觉任务的层,如目标检测、分割等。
Shuffle Layers:可能指的是打乱数据顺序的层,但在标准神经网络层中不常见。
DataParallel Layers(多GPU分布式层):用于在多个GPU上并行处理数据的层,提高计算效率。
Utilities:工具类层,提供辅助功能,如数据预处理、后处理等。
Quantized Functions(量化函数):用于对模型参数或激活值进行量化的函数,以减小模型大小并提高推理速度。
Lazy Modules Initialization:懒加载模块初始化,即在需要时才初始化模块参数,以减少内存占用。
1. Containers
在神经网络框架中,如PyTorch,Containers 和 Module 是构建和管理神经网络的基础。以下是您提到的各个组件的详细解释:
- Module
Module 是所有神经网络模块的基类。在 PyTorch 中,torch.nn.Module 是构建神经网络的基石。它提供了很多基础功能,比如参数的注册、模块的嵌套、以及前向和后向传播的实现等。为神经网络提供基础的骨架。
- Sequential
Sequential 是一个顺序容器,用于按顺序包含多个子模块。在 PyTorch 中,torch.nn.Sequential 使得模型的构建变得非常简单,你只需要将各个层按顺序作为参数传递给 Sequential 即可。
-
ModuleList
ModuleList 是一个存储子模块的列表。与普通的 Python 列表不同,ModuleList 中的模块会被正确地注册,并且所有的参数也会被包含到整个模块的参数列表中。这使得 ModuleList 成为管理子模块列表的理想选择。 -
ModuleDict
ModuleDict 是一个存储子模块的字典。与普通的 Python 字典类似,但 ModuleDict 中的模块也会被正确地注册,并且所有的参数也会被包含到整个模块的参数列表中。这使得 ModuleDict 成为管理子模块字典的理想选择。 -
ParameterList
ParameterList 是一个存储参数的列表。与普通的 Python 列表不同,ParameterList 中的参数会被正确地注册,并且可以被整个模块识别和管理。这使得 ParameterList 成为管理参数列表的理想选择。 -
ParameterDict
ParameterDict 是一个存储参数的字典。与普通的 Python 字典类似,但 ParameterDict 中的参数也会被正确地注册,并且可以被整个模块识别和管理。这使得 ParameterDict 成为管理参数字典的理想选择。
总的来说,这些容器和模块类为构建和管理复杂的神经网络提供了强大的工具。通过组合使用这些组件,你可以轻松地构建出各种复杂度的神经网络模型。
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):#定义自己神经网络的名字
def __init__(self):#初始化
super().__init__()#模板调用初始化函数,是必须的
self.conv1 = nn.Conv2d(1, 20, 5)#自己定义
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
#输入是x,x会首先进行conv1(x)也就是卷积,再次经过非线性处理F.relu(self.conv2(x))
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
输入送到神经网络中,神经网络会给一个输出,然后神经网络的运算步骤就是 forward。下图就是一个前向传播的例子。
在 PyTorch 中,forward(*input) 方法定义了每次调用模块时执行的计算。这是构建神经网络时最关键的方法之一,因为它定义了数据如何通过网络层进行前向传播。
forward 方法应该被所有子类重写,以定义特定的计算逻辑。例如,在一个简单的线性层(nn.Linear)中,forward 方法会定义输入数据如何与权重矩阵相乘并加上偏置。
重要的是要注意,虽然你需要在 forward 方法中定义前向传播的逻辑,但在实际使用中,你应该直接调用模块实例而不是 forward 方法本身。这是因为直接调用模块实例会触发所有注册的钩子(hooks),这些钩子可以用于各种目的,比如修改输入或输出、记录梯度等。而直接调用 forward 方法则不会触发这些钩子。
import torch
from torch import nn
class Test(nn.Module):
def __int__(self):
super(Test,self).__int__()
def forward(self,input):
output = input + 1
return output
test = Test()
x = torch.tensor(1.0)
output = test(x)
print(output)
结果如下:
C:\Anaconda3\envs\pytorch_test\python.exe H:\Python\Test\nn_model.py
tensor(2.)
进程已结束,退出代码0