Pytorch Added

This commit is contained in:
e2hang
2025-09-09 15:10:57 +08:00
parent a74884a555
commit a5fdeaf70e
20 changed files with 1307 additions and 2 deletions

216
Pytorch/nn/readme.md Normal file
View File

@@ -0,0 +1,216 @@
好嘞 😃,那我给你系统、详细地讲一下 **`torch.nn`** ——它基本上是 PyTorch 搭建神经网络的核心模块。
---
# 🔹 1. `torch.nn` 是什么?
* `torch.nn` = **neural network神经网络** 的缩写。
* 作用:提供了构建神经网络的各种**模块**layers、**容器**、**损失函数**、**工具函数**。
* 核心思想:把网络看成一组 **模块Module** 的组合,每个模块都可以包含参数(权重、偏置),也可以嵌套其他模块。
---
# 🔹 2. 核心类:`nn.Module`
所有神经网络的基础类,几乎所有东西(层、模型、损失函数)都继承自它。
### 常见用法
```python
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 20) # 输入10维 -> 输出20维
self.fc2 = nn.Linear(20, 1) # 输入20维 -> 输出1维
def forward(self, x): # 定义前向传播
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = MyModel()
```
👉 所有模型都需要定义 `__init__``forward` 方法。
---
# 🔹 3. 常用层Layers
`torch.nn` 提供了很多常用的层,常见的分类:
### 1全连接层Linear
```python
nn.Linear(in_features, out_features)
```
* 就是矩阵乘法 + bias
* 常用于 MLP
---
### 2卷积层CNN
```python
nn.Conv1d, nn.Conv2d, nn.Conv3d
```
* 卷积神经网络的核心
* 用于提取空间/时序特征
---
### 3循环神经网络RNN / LSTM / GRU
```python
nn.RNN, nn.LSTM, nn.GRU
```
* 用于处理序列数据(文本、时间序列)
---
### 4归一化层
```python
nn.BatchNorm1d, nn.BatchNorm2d, nn.LayerNorm
```
* 让训练更稳定,加速收敛
---
### 5正则化层
```python
nn.Dropout(p=0.5)
```
* 随机“丢弃”神经元,防止过拟合
---
# 🔹 4. 常用容器Containers
用于把多个层组合在一起。
### 1Sequential
```python
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1)
)
```
* 顺序堆叠层,适合简单模型。
### 2ModuleList / ModuleDict
```python
self.layers = nn.ModuleList([nn.Linear(10, 20), nn.Linear(20, 30)])
self.dict = nn.ModuleDict({
"fc1": nn.Linear(10, 20),
"fc2": nn.Linear(20, 1)
})
```
* 更灵活,可以动态组合模块。
---
# 🔹 5. 常用损失函数Loss functions
`torch.nn` 提供了很多常用的 loss
* **回归**
```python
nn.MSELoss() # 均方误差
nn.L1Loss() # 绝对值误差
```
* **分类**
```python
nn.CrossEntropyLoss() # 多分类交叉熵
nn.BCELoss() # 二分类交叉熵
nn.NLLLoss() # 负对数似然
```
* **其他**
```python
nn.SmoothL1Loss() # Huber loss
```
---
# 🔹 6. 激活函数
激活函数也在 `torch.nn` 里,分为 **类** 和 **函数式** 两种:
* 类形式(模块)
```python
nn.ReLU(), nn.Sigmoid(), nn.Tanh()
```
* 函数形式(函数接口)
```python
torch.relu(x), torch.sigmoid(x), torch.tanh(x)
```
👉 一般在 `nn.Sequential` 里用类形式,在 `forward` 里用函数形式。
---
# 🔹 7. 使用流程(套路)
一个典型训练流程:
```python
import torch
import torch.nn as nn
import torch.optim as optim
# 1. 定义模型
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 1)
)
# 2. 定义损失函数
criterion = nn.MSELoss()
# 3. 定义优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 4. 前向传播 + 反向传播 + 更新
x = torch.randn(5, 10) # 输入 (batch=5, features=10)
y = torch.randn(5, 1) # 目标
output = model(x) # 前向
loss = criterion(output, y) # 计算损失
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 参数更新
```
---
# 🔹 8. 记忆小技巧
* **所有层、损失函数、网络结构都是 `nn.Module` 的子类**
* **训练流程三步走forward → loss → backward**
* **组合模块时,先想清楚输入输出 shape**
---
要不要我帮你整理一个 **torch.nn 思维导图(层 → 容器 → 损失函数 → 激活函数 → 用法套路)**,这样你一张图就能记住?