PyTorch 深度学习基础
PyTorch 深度学习基础 01
2.4 神经网络常见层与数据处理流程
本阶段主要学习 PyTorch 中常见的神经网络组件,包括卷积层、池化层、激活函数、循环层以及全连接层。
学习重点不是简单记忆 API,而是理解:
- 数据在神经网络中的流动过程
- 每一层对 Tensor 形状和数据内容产生的变化
- 不同网络结构适合处理的数据类型
预处理的流程大概是:plt读取,灰度化再转numpy,tensor,其次通过卷积或者池化得到特征,接着使用激活函数。
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
img=Image.open("temp_1.jpg")
print(type(img))#<class 'PIL.JpegImagePlugin.JpegImageFile'>
gray=img.convert("L")
gray=gray.resize((512,512))
img_array=np.array(gray,
dtype=np.float32)
print(img_array.shape)
print(img_array.dtype)
#(512, 512)
#float32
plt.imshow(img_array,cmap="gray")
plt.axis("off")
plt.show()
H,W=img_array.shape
x=torch.from_numpy(img_array.reshape(1,1,H,W))
print(f"input shape {x.shape} ")#input shape torch.Size([1, 1, 512, 512])
maxpool2=nn.MaxPool2d(kernel_size=2,
stride=2)
y=maxpool2(x)
print(f"output shape {y.shape}")#output shape torch.Size([1, 1, 256, 256])
out=y.squeeze()
plt.imshow(out,cmap="gray")
plt.axis("off")
plt.show()
整体流程:
输入数据
↓
Tensor
↓
神经网络层
↓
特征表示
↓
输出结果
2.4.1 卷积层 Conv2d
基本概念
卷积层是 CNN(Convolutional Neural Network)的核心,用于从图像中提取局部特征。
图像本质上是一个二维数字矩阵:
Height × Width
其中每一个数字代表像素亮度。
卷积层通过卷积核(Kernel)在图像上滑动,对局部区域进行计算,从而提取:
- 边缘
- 纹理
- 形状
- 局部结构
Conv2d 输入格式
PyTorch 中:
nn.Conv2d()
要求输入格式:
这里因为比如卷积的conv2d要求的输入就是4的参数
[N, C, H, W]
分别表示:
| 参数 | 含义 |
|---|---|
| N | batch size,输入图片数量 |
| C | channel,通道数 |
| H | height,高度 |
| W | width,宽度 |
例如灰度图片:
torch.Size([1,1,512,512])
表示:
- 1张图片
- 1个灰度通道
- 高512
- 宽512
手动实现卷积
使用:
kernel = torch.tensor([
[1,0],
[0,1]
])
模拟卷积核。
卷积过程:
输入区域:
1 2
3 4
卷积核:
1 0
0 1
计算:
1×1 + 2×0 + 3×0 + 4×1
=5
通过滑动窗口,可以得到完整的 Feature Map。
Conv2d 参数
| 参数 | 作用 |
|---|---|
| in_channels | 输入通道数 |
| out_channels | 输出特征图数量 |
| kernel_size | 卷积核大小 |
| stride | 步长 |
| padding | 边缘填充 |
| bias | 是否加入偏置 |
2.4.2 池化层 Pooling
为什么需要池化?
池化层用于降低特征图尺寸,主动压缩特征图,更稳定的特征,减少计算量,本质是采样。
常见:
nn.MaxPool2d()
nn.AvgPool2d()
作用:
- 降低计算量
- 减少无关细节
- 提高模型鲁棒性
CNN 中:
图片
↓
Conv2d
↓
Feature Map
↓
Pooling
↓
更小的 Feature Map
MaxPool2d
最大池化:
在窗口范围内选择最大值。
例如:
输入:
1 2
5 6
结果:
max(1,2,5,6)=6
代码:
nn.MaxPool2d(
kernel_size=2,
stride=2
)
含义:
- kernel_size=2
使用 2×2 窗口
- stride=2
每次移动两个像素
AvgPool2d
平均池化:
计算窗口内平均值。
例如:
1 2
5 6
结果:
(1+2+5+6)/4=3.5
区别:
| 类型 | 操作 |
|---|---|
| MaxPool | 取最大值 |
| AvgPool | 取平均值 |
池化尺寸变化
输出公式:
[
H_
\left\lfloor
\frac{H_{in}+2P-K}{S}
\right\rfloor+1
]
例如:
输入:
512×512
使用:
kernel=2
stride=2
输出:
256×256
图片预处理流程
CNN 输入图片前,需要进行数据转换:
图片文件
↓
PIL.Image
↓
灰度化
↓
numpy数组
↓
Tensor
↓
[N,C,H,W]
↓
CNN
示例:
img = Image.open("temp.png")
gray = img.convert("L")
array = np.array(
gray,
dtype=np.float32
)
tensor = torch.from_numpy(
array.reshape(1,1,H,W)
)
2.4.3 激活函数 Activation Function
为什么需要激活函数?
如果神经网络只有:
Linear
Linear
Linear
无论多少层,本质仍然是线性变换。
如果没有激活函数,多层相当于一层,都是Wx+b
激活函数提供:
非线性能力
使网络可以学习复杂模式:
- 图像分类
- 语音识别
- NLP任务
ReLU
最常见激活函数:
[
f(x)=max(0,x)
]
输入:
[-3,-1,0,5]
输出:
[0,0,0,5]
作用:
- 删除负响应
- 保留有效特征
- 加快训练
注意:
ReLU 修改的是:
Feature Map
不是原始图片。
CNN过程:
图片
↓
Conv2d
↓
Feature Map
↓
ReLU
卷积后的数字表示:
某种特征出现的强度
而不是像素亮度。
常见激活函数
| 函数 | 特点 |
|---|---|
| Sigmoid | 输出0~1 |
| Tanh | 输出-1~1 |
| ReLU | CNN最常用 |
| Softplus | ReLU平滑版本 |
2.4.4 循环层 RNN
为什么需要循环网络?
CNN主要处理空间关系:
例如:
图片中的像素关系
但是很多数据具有顺序:
- 文本
- 语音
- 时间序列
例如:
我 喜欢 吃 苹果
词语顺序影响含义。
RNN
RNN:
Recurrent Neural Network
循环神经网络。
核心思想:
网络保存过去的信息。
公式:
[
h_t=f(x_t,h_{t-1})
]
其中:
- x_t:当前输入
- h_(t-1):之前隐藏状态
- h_t:当前隐藏状态
隐状态 Hidden State
隐藏状态可以理解为:
神经网络的记忆。
例如:
小明今天去银行,因为他需要取钱
读到:
他
模型需要知道:
"他" 指的是小明。
这种上下文信息就是:
hidden state
LSTM
Long Short-Term Memory
普通 RNN 的问题:
长距离信息容易丢失。
LSTM 引入门机制:
- 遗忘门
- 输入门
- 输出门
控制:
- 什么信息保留
- 什么信息删除
- 什么信息输出
GRU
Gated Recurrent Unit
GRU 是 LSTM 的简化版本。
特点:
- 参数更少
- 训练更快
PyTorch 对应层
| 结构 | PyTorch |
|---|---|
| RNN | nn.RNN() |
| LSTM | nn.LSTM() |
| GRU | nn.GRU() |
常见参数:
| 参数 | 意义 |
|---|---|
| input_size | 每个时间步输入维度 |
| hidden_size | 隐藏状态维度 |
| num_layers | 循环层数量 |
| batch_first | 是否batch优先 |
学习总结
本阶段理解了神经网络中的数据流动:
图片
↓
Tensor [N,C,H,W]
↓
Conv2d
↓
Feature Map
↓
Activation
↓
Pooling
↓
更高级特征
序列数据:
↓
RNN/LSTM/GRU
↓
Hidden State
↓
序列预测
核心理解:
- Conv2d 负责提取局部特征
- Pooling 负责压缩特征
- Activation 提供非线性能力
- RNN 负责处理具有顺序关系的数据
- Hidden State 保存历史信息
深度学习模型本质:
数据
↓
数学变换
↓
越来越抽象的特征表示
↓
最终预测结果
posted on 2026-08-09 12:02 tintin7790 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号