Added nn
This commit is contained in:
0
Pytorch/nn/viFunc/DirectlyUse-nn.func
Normal file
0
Pytorch/nn/viFunc/DirectlyUse-nn.func
Normal file
161
Pytorch/nn/viFunc/nn.Conv2d.md
Normal file
161
Pytorch/nn/viFunc/nn.Conv2d.md
Normal file
@@ -0,0 +1,161 @@
|
||||
### `torch.nn.Conv2d` 类的方法详解
|
||||
|
||||
根据 PyTorch 官方文档(`torch.nn.Conv2d`),这是一个实现二维卷积的模块,广泛用于处理图像数据,执行卷积操作 \( y = W * x + b \),其中 \( * \) 表示卷积操作,\( W \) 是卷积核(权重),\( b \) 是偏置(如果启用)。该类继承自 `nn.Module`,因此除了特定方法外,还支持 `nn.Module` 的通用方法(如 `train()`、`eval()` 等)。文档中明确提到了一些方法,主要包括 `__init__`、`forward` 和 `extra_repr`,此外还涉及权重初始化和一些内部方法(如 `_conv_forward`)。以下详细讲解所有相关方法,基于官方文档和实现逻辑。
|
||||
|
||||
以下是每个方法的签名、参数、返回值和详细解释。参数类型基于 Python 标准类型和 PyTorch 张量规范。
|
||||
|
||||
---
|
||||
|
||||
#### 1. `__init__` 方法(初始化方法)
|
||||
- **签名**:
|
||||
```python
|
||||
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
|
||||
```
|
||||
- **参数**:
|
||||
- `in_channels`(int):输入张量的通道数(如 RGB 图像为 3)。
|
||||
- `out_channels`(int):输出张量的通道数(卷积核数量)。
|
||||
- `kernel_size`(int 或 tuple):卷积核大小,单个数(如 3 表示 3x3)或元组(如 (3, 3))。
|
||||
- `stride`(int 或 tuple,默认 1):卷积步幅,控制卷积核移动的步长。
|
||||
- `padding`(int、tuple 或 str,默认 0):输入的填充量,可为单个数、元组或字符串(如 'valid' 或 'same',但 'same' 需手动计算)。
|
||||
- `dilation`(int 或 tuple,默认 1):卷积核元素间距(膨胀卷积),用于增大感受野。
|
||||
- `groups`(int,默认 1):分组卷积设置,控制输入和输出通道的分组连接。
|
||||
- `bias`(bool,默认 True):是否添加可学习的偏置。
|
||||
- `padding_mode`(str,默认 'zeros'):填充模式,支持 'zeros'、'reflect'、'replicate' 或 'circular'。
|
||||
- `device`(torch.device 或 None,默认 None):模块的设备(CPU 或 GPU)。
|
||||
- `dtype`(torch.dtype 或 None,默认 None):模块的数据类型。
|
||||
- **返回值**:无(构造函数,初始化模块)。
|
||||
- **解释**:
|
||||
初始化二维卷积层,创建权重张量(形状为 `(out_channels, in_channels/groups, kernel_height, kernel_width)`)和可选的偏置张量(形状为 `(out_channels,)`)。权重使用均匀分布 \(\mathcal{U}(-\sqrt{k}, \sqrt{k})\) 初始化,其中 \( k = \frac{\text{groups}}{\text{in_channels} \cdot \prod \text{kernel_size}} \)。该方法定义了卷积操作的参数,是构建 CNN 的核心。例如,`nn.Conv2d(3, 64, 3)` 创建一个从 3 通道输入到 64 通道输出的 3x3 卷积层。
|
||||
- **注意**:
|
||||
- 分组卷积(`groups > 1`)将输入和输出通道分组,降低计算量。
|
||||
- `padding_mode` 影响边界处理,'zeros' 是最常用的。
|
||||
- 支持 TensorFloat32 加速(在支持的硬件上),float16 输入可能在某些设备上转为 float32。
|
||||
|
||||
---
|
||||
|
||||
#### 2. `forward` 方法(前向传播方法)
|
||||
- **签名**:
|
||||
```python
|
||||
forward(input)
|
||||
```
|
||||
- **参数**:
|
||||
- `input`(torch.Tensor):输入张量,形状为 `(N, C_in, H_in, W_in)`,其中 \( N \) 是批量大小,\( C_in \) 是输入通道数,\( H_in, W_in \) 是输入的高度和宽度。
|
||||
- **返回值**:
|
||||
torch.Tensor,形状为 `(N, C_out, H_out, W_out)`,其中 \( C_out = \text{out_channels} \),输出尺寸 \( H_out, W_out \) 由公式计算:
|
||||
\[
|
||||
H_out = \left\lfloor \frac{H_in + 2 \cdot \text{padding}[0] - \text{dilation}[0] \cdot (\text{kernel_size}[0] - 1) - 1}{\text{stride}[0]} \right\rfloor + 1
|
||||
\]
|
||||
\[
|
||||
W_out = \left\lfloor \frac{W_in + 2 \cdot \text{padding}[1] - \text{dilation}[1] \cdot (\text{kernel_size}[1] - 1) - 1}{\text{stride}[1]} \right\rfloor + 1
|
||||
\]
|
||||
- **解释**:
|
||||
执行二维卷积操作,对输入张量应用卷积核和偏置(如果启用)。内部调用 F.conv2d(PyTorch 的函数式卷积接口),结合权重、偏置和初始化时指定的参数(如步幅、填充等)。这是模型前向传播的核心,隐式调用如 `output = layer(input)`。
|
||||
**示例**(来自文档):
|
||||
```python
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
m = nn.Conv2d(16, 33, 3, stride=2) # 16 通道输入,33 通道输出,3x3 核,步幅 2
|
||||
input = torch.randn(20, 16, 50, 100) # 批量 20,16 通道,50x100 尺寸
|
||||
output = m(input) # 输出形状: (20, 33, 24, 49)(根据公式计算)
|
||||
```
|
||||
- **注意**:
|
||||
输入的通道数必须等于 `in_channels`,否则会报错。输出尺寸由卷积参数决定,需仔细检查以避免维度不匹配。
|
||||
|
||||
---
|
||||
|
||||
#### 3. `extra_repr` 方法(额外字符串表示方法)
|
||||
- **签名**:
|
||||
```python
|
||||
extra_repr()
|
||||
```
|
||||
- **参数**:无。
|
||||
- **返回值**:str,描述模块参数的字符串。
|
||||
- **解释**:
|
||||
返回一个字符串,表示模块的关键参数,用于增强模块的打印表示。例如,打印 `Conv2d` 层时会显示类似:
|
||||
```python
|
||||
Conv2d(16, 33, kernel_size=(3, 3), stride=(2, 2), padding=(0, 0), bias=True)
|
||||
```
|
||||
包括 `in_channels`、`out_channels`、`kernel_size`、`stride`、`padding` 等信息。用于调试和模型结构可视化,继承自 `nn.Module` 并在 `Conv2d` 中覆盖以显示特定参数。
|
||||
- **注意**:此方法不影响计算,仅用于信息展示。
|
||||
|
||||
---
|
||||
|
||||
#### 4. `_conv_forward` 方法(内部前向传播方法)
|
||||
- **签名**(推测,文档未明确列出签名):
|
||||
```python
|
||||
_conv_forward(input, weight, bias)
|
||||
```
|
||||
- **参数**:
|
||||
- `input`(torch.Tensor):输入张量,形状同 `forward` 的输入。
|
||||
- `weight`(torch.Tensor):卷积核权重,形状为 `(out_channels, in_channels/groups, kernel_height, kernel_width)`。
|
||||
- `bias`(torch.Tensor 或 None):偏置张量,形状为 `(out_channels,)` 或 None(若 `bias=False`)。
|
||||
- **返回值**:
|
||||
torch.Tensor,卷积操作的结果,形状同 `forward` 的输出。
|
||||
- **解释**:
|
||||
这是 `forward` 方法的内部实现,调用 `torch.nn.functional.conv2d` 执行实际的卷积计算。参数包括输入、权重、偏置,以及初始化时设置的 `stride`、`padding`、`dilation`、`groups` 和 `padding_mode`。文档中未直接列出此方法为公共接口,但它是 `forward` 的核心逻辑,公开在实现中以支持自定义扩展。
|
||||
- **注意**:
|
||||
通常用户无需直接调用此方法,除非需要自定义卷积逻辑(如修改权重或偏置的处理方式)。
|
||||
|
||||
---
|
||||
|
||||
#### 5. `reset_parameters` 方法(重置参数方法)
|
||||
- **签名**:
|
||||
```python
|
||||
reset_parameters()
|
||||
```
|
||||
- **参数**:无。
|
||||
- **返回值**:无。
|
||||
- **解释**:
|
||||
重置模块的权重和偏置(如果启用)。权重使用均匀分布 \(\mathcal{U}(-\sqrt{k}, \sqrt{k})\) 初始化,其中 \( k = \frac{\text{groups}}{\text{in_channels} \cdot \prod \text{kernel_size}} \)。偏置(若存在)也使用相同分布初始化。此方法在需要重新初始化模型参数时调用,例如在训练实验中重置网络。
|
||||
- **注意**:
|
||||
调用此方法会覆盖现有参数,需谨慎使用。
|
||||
|
||||
---
|
||||
|
||||
### 附加说明
|
||||
- **继承方法**:
|
||||
作为 `nn.Module` 的子类,`Conv2d` 支持所有通用方法,例如:
|
||||
- `parameters()`:返回可训练参数(权重和偏置)。
|
||||
- `named_parameters()`:返回带名称的参数。
|
||||
- `zero_grad()`:清零梯度。
|
||||
- `to(device)`:移动模块到指定设备。
|
||||
这些方法非 `Conv2d` 独有,但常用于模型训练和调试。
|
||||
- **属性**:
|
||||
- `weight`(nn.Parameter):卷积核权重张量。
|
||||
- `bias`(nn.Parameter 或 None):偏置张量(若 `bias=True`)。
|
||||
- 其他属性(如 `stride`、`padding`)存储初始化时的参数。
|
||||
- **使用提示**:
|
||||
- 输入张量必须是 4D(批量、通道、高、宽),否则会报错。
|
||||
- 输出尺寸需根据公式计算,调试时可用 `torch.nn.functional.conv2d` 的文档验证。
|
||||
- 分组卷积和膨胀卷积是高级特性,需理解其对计算量和感受野的影响。
|
||||
- `padding_mode` 影响边界处理,'circular' 等模式在特定任务(如周期性数据)中有用。
|
||||
- **版本相关**:
|
||||
文档未提及特定版本差异,但 PyTorch 2.x 系列优化了卷积性能(如 TensorFloat32 支持)。float16 在某些设备(如 ROCm)上会转为 float32 计算。
|
||||
|
||||
---
|
||||
|
||||
### 示例代码(综合应用)
|
||||
```python
|
||||
import torch
|
||||
import torch.nn as nn
|
||||
|
||||
# 初始化 Conv2d 层
|
||||
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True)
|
||||
|
||||
# 创建输入张量 (批量=1, 通道=3, 高=32, 宽=32)
|
||||
input = torch.randn(1, 3, 32, 32)
|
||||
|
||||
# 前向传播
|
||||
output = conv(input)
|
||||
print(output.shape) # 输出: torch.Size([1, 64, 32, 32])(因 padding=1 保持尺寸)
|
||||
|
||||
# 查看模块信息
|
||||
print(conv) # 调用 extra_repr,显示参数
|
||||
|
||||
# 重置参数
|
||||
conv.reset_parameters()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
如果需要更详细的数学推导、特定参数组合的示例,或其他 `nn.Module` 方法的讲解,请告诉我!
|
47
Pytorch/nn/viFunc/nn.Linear.md
Normal file
47
Pytorch/nn/viFunc/nn.Linear.md
Normal file
@@ -0,0 +1,47 @@
|
||||
### torch.nn.Linear 类的方法详解
|
||||
|
||||
根据 PyTorch 官方文档(torch.nn.Linear),这是一个实现线性变换(全连接层)的模块,数学公式为 \( y = xA^T + b \),其中 \( A \) 是权重矩阵,\( b \) 是偏置(如果启用)。该类继承自 `nn.Module`,因此除了特定方法外,还支持 `nn.Module` 的通用方法(如 `train()`、`eval()` 等),但这里重点讲解文档中明确提到的所有方法,包括 `__init__`、`forward` 和 `extra_repr`。文档中未提及其他特定方法。
|
||||
|
||||
以下是每个方法的详细讲解,包括方法签名、参数、返回值和解释。参数类型基于 Python 标准类型和 PyTorch 张量规范。
|
||||
|
||||
#### 1. `__init__` 方法(初始化方法)
|
||||
- **签名**:`torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)`
|
||||
- **参数**:
|
||||
- `in_features`(int):每个输入样本的大小(输入特征维度)。
|
||||
- `out_features`(int):每个输出样本的大小(输出特征维度)。
|
||||
- `bias`(bool,默认 True):如果为 `False`,则不学习可加偏置项。
|
||||
- `device`(torch.device 或 None,默认 None):指定模块的设备(如 CPU 或 GPU)。
|
||||
- `dtype`(torch.dtype 或 None,默认 None):指定模块的数据类型。
|
||||
- **返回值**:无(这是构造函数,用于初始化模块)。
|
||||
- **解释**:该方法初始化线性变换模块。它会创建权重矩阵 \( A \)(形状为 `(out_features, in_features)`)和可选的偏置 \( b \)(形状为 `(out_features,)`)。权重和偏置使用均匀分布 \(\mathcal{U}(-\sqrt{k}, \sqrt{k})\) 初始化,其中 \( k = \frac{1}{\text{in_features}} \)。这是一个核心方法,用于构建层,例如 `nn.Linear(20, 30)` 创建一个从 20 维输入到 30 维输出的层。
|
||||
- **注意**:模块支持 TensorFloat32(在支持的硬件上加速),并且在某些 ROCm 设备上,float16 输入会转换为 float32 进行计算。
|
||||
|
||||
#### 2. `forward` 方法(前向传播方法)
|
||||
- **签名**:`forward(input)`(输入参数名为 `input`,但文档中未显式列出签名,通常推断自描述)。
|
||||
- **参数**:
|
||||
- `input`(torch.Tensor):输入张量,形状为 `(*, H_in)`,其中 `*` 表示任意数量的维度(包括无维度),`H_in = in_features`(最后一个维度必须匹配 `in_features`)。
|
||||
- **返回值**:torch.Tensor,形状为 `(*, H_out)`,其中前面的维度与输入相同,`H_out = out_features`。
|
||||
- **解释**:这是模块的核心前向传播方法。它对输入应用线性变换 \( y = xA^T + b \)(如果 `bias=True`)。权重 \( A \) 和偏置 \( b \) 是可学习的参数,通过反向传播更新。该方法是 PyTorch 模块的标准接口,在模型构建中调用如 `output = layer(input)` 时隐式执行。
|
||||
- **示例**(来自官方文档):
|
||||
```python
|
||||
import torch.nn as nn
|
||||
m = nn.Linear(20, 30) # 初始化层
|
||||
input = torch.randn(128, 20) # 批量大小 128,特征 20
|
||||
output = m(input) # 前向传播
|
||||
print(output.size()) # 输出: torch.Size([128, 30])
|
||||
```
|
||||
这展示了批量输入如何转换为输出形状。
|
||||
|
||||
#### 3. `extra_repr` 方法(额外字符串表示方法)
|
||||
- **签名**:`extra_repr()`(无参数,继承自 `nn.Module`)。
|
||||
- **参数**:无。
|
||||
- **返回值**:str,一个字符串,总结模块的参数。
|
||||
- **解释**:该方法返回一个字符串,用于增强模块的打印表示(例如,当你 `print(layer)` 时)。它通常包括 `in_features`、`out_features` 和偏置是否启用(如 "Linear(in_features=20, out_features=30, bias=True)")。这是一个辅助方法,帮助调试和可视化模型结构,不是计算核心。
|
||||
- **注意**:这是 `nn.Module` 的标准方法,在 `Linear` 中被覆盖以包含特定参数。没有额外示例,但打印模块时会自动调用。
|
||||
|
||||
### 附加说明
|
||||
- **继承方法**:`torch.nn.Linear` 继承自 `nn.Module`,因此支持所有 `nn.Module` 方法,如 `parameters()`(获取可训练参数)、`named_parameters()`(命名参数迭代)、`zero_grad()`(梯度清零)等。这些不是 `Linear` 特有,而是通用方法。如果需要讲解整个 `nn.Module`,可以进一步查询。
|
||||
- **属性**:模块有 `weight`(权重张量)和 `bias`(偏置张量,如果启用),这些是 `nn.Parameter` 类型,可通过优化器更新。
|
||||
- **使用提示**:在构建神经网络时,`Linear` 常用于 MLP 等。确保输入的最后一个维度匹配 `in_features`,否则会报错。文档强调该模块在 float16 输入时的特殊行为(在 ROCm 上转换为 float32)以避免精度问题。
|
||||
|
||||
如果需要代码示例、数学推导或特定版本的差异,请提供更多细节!
|
101
Pytorch/nn/viFunc/readme.md
Normal file
101
Pytorch/nn/viFunc/readme.md
Normal file
@@ -0,0 +1,101 @@
|
||||
好的 👍
|
||||
`torch.nn` 里面确实包含了很多常用的神经网络模块,你可以把它们理解为深度学习中各种“积木”,主要分为 **层(layers)**、**容器(containers)** 和 **正则化/损失函数** 等几个类别。
|
||||
|
||||
下面我给你整理一份 **值得学习的网络层/模块清单**(重点是 `nn` 里面和建模相关的):
|
||||
|
||||
---
|
||||
|
||||
### 🔹 1. 基础层(Linear & Embedding)
|
||||
|
||||
* `nn.Linear` —— 全连接层(MLP 基础积木)
|
||||
* `nn.Bilinear` —— 双线性层
|
||||
* `nn.Embedding` —— 词嵌入层
|
||||
* `nn.EmbeddingBag` —— 变体,适合处理词袋模型
|
||||
|
||||
---
|
||||
|
||||
### 🔹 2. 卷积层(Convolution Layers)
|
||||
|
||||
* `nn.Conv1d` —— 一维卷积(常用于 NLP、语音)
|
||||
* `nn.Conv2d` —— 二维卷积(图像处理最常用)
|
||||
* `nn.Conv3d` —— 三维卷积(视频、体数据)
|
||||
* `nn.ConvTranspose1d/2d/3d` —— 反卷积(上采样/生成模型常用)
|
||||
|
||||
---
|
||||
|
||||
### 🔹 3. 池化层(Pooling)
|
||||
|
||||
* `nn.MaxPool1d/2d/3d` —— 最大池化
|
||||
* `nn.AvgPool1d/2d/3d` —— 平均池化
|
||||
* `nn.AdaptiveMaxPool1d/2d/3d` —— 自适应池化(固定输出大小)
|
||||
* `nn.AdaptiveAvgPool1d/2d/3d` —— 自适应平均池化
|
||||
|
||||
---
|
||||
|
||||
### 🔹 4. 循环神经网络层(RNN 系列)
|
||||
|
||||
* `nn.RNN` —— 基础循环网络
|
||||
* `nn.LSTM` —— 长短期记忆网络
|
||||
* `nn.GRU` —— 门控循环单元
|
||||
|
||||
---
|
||||
|
||||
### 🔹 5. Transformer 相关
|
||||
|
||||
* `nn.MultiheadAttention` —— 多头注意力机制
|
||||
* `nn.Transformer` —— 整个 Transformer 模型(包含编码器+解码器)
|
||||
* `nn.TransformerEncoder` / `nn.TransformerDecoder`
|
||||
* `nn.TransformerEncoderLayer` / `nn.TransformerDecoderLayer`
|
||||
|
||||
---
|
||||
|
||||
### 🔹 6. 归一化(Normalization)
|
||||
|
||||
* `nn.BatchNorm1d/2d/3d` —— 批量归一化
|
||||
* `nn.LayerNorm` —— 层归一化(Transformer 常用)
|
||||
* `nn.GroupNorm` —— 分组归一化
|
||||
* `nn.InstanceNorm1d/2d/3d` —— 实例归一化(风格迁移常用)
|
||||
* `nn.LocalResponseNorm` —— 局部响应归一化(早期 CNN)
|
||||
|
||||
---
|
||||
|
||||
### 🔹 7. Dropout & 正则化
|
||||
|
||||
* `nn.Dropout` —— 全连接层 Dropout
|
||||
* `nn.Dropout2d/3d` —— 用于卷积层的 Dropout
|
||||
* `nn.AlphaDropout` —— 用于 SELU 激活的变体
|
||||
|
||||
---
|
||||
|
||||
### 🔹 8. 激活函数(很多都在 `torch.nn.functional`,但也有类)
|
||||
|
||||
* `nn.ReLU`, `nn.LeakyReLU`, `nn.PReLU`, `nn.RReLU`
|
||||
* `nn.Sigmoid`, `nn.Tanh`, `nn.ELU`, `nn.CELU`
|
||||
* `nn.SELU`, `nn.GELU`, `nn.SiLU`(=Swish)
|
||||
* `nn.Softmax`, `nn.LogSoftmax`
|
||||
* `nn.Softplus`, `nn.Softsign`
|
||||
|
||||
---
|
||||
|
||||
### 🔹 9. 稀疏与其他层
|
||||
|
||||
* `nn.SparseLinear`(PyTorch 2.5+ 才有)
|
||||
* `nn.PixelShuffle` —— 超分辨率常用(上采样)
|
||||
* `nn.Upsample` —— 上采样
|
||||
* `nn.Unfold / nn.Fold` —— 图像 Patch 提取和恢复
|
||||
|
||||
---
|
||||
|
||||
### 🔹 10. 容器(搭建网络时用)
|
||||
|
||||
* `nn.Sequential` —— 顺序容器
|
||||
* `nn.ModuleList` —— 模块列表
|
||||
* `nn.ModuleDict` —— 模块字典
|
||||
* `nn.ParameterList / ParameterDict` —— 参数容器
|
||||
|
||||
---
|
||||
|
||||
👉 如果你是初学者,推荐学习路径大概是:
|
||||
`Linear → Conv → Pool → BatchNorm/LayerNorm → Dropout → RNN/LSTM/GRU → Transformer → MultiheadAttention`
|
||||
|
||||
要不要我帮你整理一份 **按“难度/应用领域”分层的学习路线图**(比如入门 → 图像 → NLP → 高级网络)?
|
Reference in New Issue
Block a user