当前位置:   article > 正文

深度学习之pytorch 中 torch.nn介绍

深度学习之pytorch 中 torch.nn介绍

1. torch.nn 介绍

pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有几类:

1. Layers(层):包括全连接层、卷积层、池化层等。
2. Activation Functions(激活函数):包括ReLU、Sigmoid、Tanh等。
3. Loss Functions(损失函数):包括交叉熵损失、均方误差等。
4. Optimizers(优化器):包括SGD、Adam、RMSprop等。
5. Initialization Functions(初始化函数):包括Xavier初始化、He初始化等。
6. Utilities(实用工具):包括数据处理的函数、模型构建的函数等。

2. Layers(层):

2.1 全连接层

在 `torch.nn` 中,全连接层的函数主要包括以下几个:
1. `torch.nn.Linear(in_features, out_features, bias=True)`: 创建一个线性层,其中in_features是输入特征的大小,out_features是输出特征的大小,bias表示是否使用偏置。
2. `torch.nn.Bilinear(in1_features, in2_features, out_features, bias=True)`: 创建一个双线性层,用于计算两组输入之间的双线性操作。
这些函数用于创建神经网络中的全连接层,其中 `torch.nn.Linear` 是应用最广泛的全连接层函数。

2.2 卷积层

在 `torch.nn` 中,卷积层的函数主要包括以下几个:
1. `torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)`: 创建一维卷积层。
2. `torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)`: 创建二维卷积层。
3. `torch.nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)`: 创建三维卷积层。
这些函数用于创建神经网络中的卷积层。

2.3 池化层

在 `torch.nn` 中,池化层的函数主要包括以下几个:
1. `torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)`: 创建一维最大池化层。
2. `torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)`: 创建二维最大池化层。
3. `torch.nn.MaxPool3d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)`: 创建三维最大池化层。
4. `torch.nn.AvgPool1d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)`: 创建一维平均池化层。
5. `torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)`: 创建二维平均池化层。
6. `torch.nn.AvgPool3d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)`: 创建三维平均池化层。
这些函数用于创建神经网络中的不同类型的池化层。

3. Activation Functions(激活函数)

在 `torch.nn` 中,常见的激活函数包括:
1. `torch.nn.ReLU`: ReLU激活函数。
2. `torch.nn.ReLU6`: 限制线性整流激活函数,将负值截断为0,将正值截断为6。
3. `torch.nn.ELU`: 指数线性单元激活函数。
4. `torch.nn.Sigmoid`: Sigmoid激活函数。
5. `torch.nn.Tanh`: 双曲正切激活函数。
6. `torch.nn.Softmax`: Softmax激活函数,常用于多分类问题。
这些激活函数可用于神经网络的不同层中,以引入非线性特性和增加网络的表达能力。

4. Loss Functions(损失函数)

在 `torch.nn` 中,常见的损失函数包括:
1. `torch.nn.MSELoss`: 均方误差损失函数,用于回归问题。
2. `torch.nn.L1Loss`: 平均绝对误差损失函数,也用于回归问题。
3. `torch.nn.CrossEntropyLoss`: 交叉熵损失函数,通常用于多分类问题。
4. `torch.nn.NLLLoss`: 负对数似然损失函数,结合了LogSoftmax和负对数似然损失,通常用于多分类问题。
5. `torch.nn.BCELoss`: 二元交叉熵损失函数,通常用于二分类问题。
6. `torch.nn.BCEWithLogitsLoss`: 结合了Sigmoid和二元交叉熵损失的函数,通常用于二分类问题。
这些损失函数可以帮助定义神经网络的训练目标,并用于计算预测值与真实标签之间的误差。

5、Optimizers(优化器)

在 `torch.nn` 中,常见的优化器函数包括:
1. `torch.optim.SGD`: 随机梯度下降优化器。
2. `torch.optim.Adam`: Adam优化器,结合了动量和自适应学习率。
3. `torch.optim.Adagrad`: 自适应学习率优化器。
4. `torch.optim.RMSprop`: RMSprop优化器,结合了动量和自适应学习率。
5. `torch.optim.Adadelta`: Adadelta优化器,自适应学习率方法之一。
6. `torch.optim.Adamax`: Adamax优化器,基于Adam算法的变种。
这些优化器函数可用于调整神经网络的参数以最小化定义的损失函数,从而实现模型的训练和优化。

6. Initialization Functions(初始化函数)

在 `torch.nn` 中,常见的初始化函数包括:
1. `torch.nn.init.uniform_`: 均匀分布初始化。
2. `torch.nn.init.normal_`: 正态分布初始化。
3. `torch.nn.init.constant_`: 常数初始化。
4. `torch.nn.init.eye_`: 单位矩阵初始化。
5. `torch.nn.init.xavier_uniform_`: Xavier均匀分布初始化。
6. `torch.nn.init.xavier_normal_`: Xavier正态分布初始化。
7. `torch.nn.init.kaiming_uniform_`: Kaiming均匀分布初始化(用于ReLU激活函数)。
8. `torch.nn.init.kaiming_normal_`: Kaiming正态分布初始化(用于ReLU激活函数)。
这些初始化函数可用于初始化神经网络的权重和偏置,以帮助训练神经网络时更好地收敛和避免梯度消失或梯度爆炸等问题。

7. Utilities(实用工具)

在 `torch.nn` 中,有一些实用的工具函数,包括但不限于:
1. `torch.nn.functional.conv2d`: 二维卷积操作。
2. `torch.nn.functional.linear`: 线性变换,等同于全连接层。
3. `torch.nn.functional.relu`: ReLU激活函数。
4. `torch.nn.functional.max_pool2d`: 二维最大池化操作。
5. `torch.nn.functional.dropout`: 随机失活操作。
6. `torch.nn.functional.cross_entropy`: 交叉熵损失函数。
7. `torch.nn.functional.mse_loss`: 均方误差损失函数。
8. `torch.nn.functional.softmax`: softmax函数,常用于多分类问题。
这些工具函数提供了在神经网络中常见的操作,用于构建神经网络结构和定义损失函数。

8、其他

8.1 torch.nn.Conv2d 与 torch.nn.functional.conv2d 的区别

`torch.nn.Conv2d` 是一个类,用于创建二维卷积层,它是 PyTorch 中的一个模块。而 `torch.nn.functional.conv2d` 是一个函数,用于执行二维卷积操作。
区别在于:
- `torch.nn.Conv2d` 是一个类,它是一个包含可学习参数的卷积层,可以包含权重和偏置项,并且具有其他卷积层相关的属性和方法。
- `torch.nn.functional.conv2d` 是一个函数,它执行卷积操作,但是它不包含可学习的参数,需要手动输入卷积核和偏置项,通常用于在自定义的网络结构或者函数中执行卷积操作。


以下是它们的使用示例:
使用 `torch.nn.Conv2d` 创建一个简单的卷积层:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个二维卷积层
  4. conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
  5. # 定义输入数据
  6. input_data = torch.randn(1, 3, 32, 32)  # (batch_size, channels, height, width)
  7. # 通过卷积层进行前向传播
  8. output = conv_layer(input_data)
  9. print(output.shape)  # 输出结果的形状

使用 `torch.nn.functional.conv2d` 执行二维卷积操作:

  1. import torch
  2. import torch.nn.functional as F
  3. # 定义输入数据
  4. input_data = torch.randn(1, 3, 32, 32)  # (batch_size, channels, height, width)
  5. # 定义卷积核
  6. weight = torch.randn(16, 3, 3, 3)  # (out_channels, in_channels, kernel_height, kernel_width)
  7. # 执行二维卷积操作
  8. output = F.conv2d(input_data, weight, bias=None, stride=1, padding=1)
  9. print(output.shape)  # 输出结果的形状

8.2 torch.nn.Linear 与torch.nn.functional.linear的区别

`torch.nn.Linear` 是一个类,用于创建全连接层(也称为线性层),它是 PyTorch 中的一个模块。而 `torch.nn.functional.linear` 是一个函数,用于执行线性变换操作。
区别在于:
- `torch.nn.Linear` 是一个类,它是一个包含可学习参数的全连接层,可以包含权重和偏置项,并且具有其他全连接层相关的属性和方法。
- `torch.nn.functional.linear` 是一个函数,它执行线性变换操作,但是它不包含可学习的参数,需要手动输入权重和偏置项,通常用于在自定义的网络结构或者函数中执行线性变换操作。


下面是它们的使用示例:
使用 `torch.nn.Linear`:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个线性变换模块
  4. linear_module = nn.Linear(in_features=5, out_features=3)
  5. # 构造输入张量
  6. input_data = torch.randn(2, 5)  # 2个样本,每个样本5个特征
  7. # 应用线性变换
  8. output = linear_module(input_data)


使用 `torch.nn.functional.linear`:

  1. import torch
  2. import torch.nn.functional as F
  3. # 构造输入张量和权重
  4. input_data = torch.randn(2, 5)  # 2个样本,每个样本5个特征
  5. weight = torch.randn(3, 5)      # 权重矩阵
  6. # 应用线性变换
  7. output = F.linear(input_data, weight)


在这两个示例中,都创建了输入数据并应用了线性变换,但是 `torch.nn.Linear`更适合用于创建神经网络模型,而 `torch.nn.functional.linear` 更适合在自定义的前向传播函数中使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/124065
推荐阅读
相关标签
  

闽ICP备14008679号