PyTorc与深度学习

深度学习 (Deep Learning) 的本质,就是通过模仿人脑的“多层神经网络”架构,让机器拥有自动提取复杂特征的能力。

PyTorch框架

PyTorch 是一个基于 Python 的深度学习框架,核心数据结构是张量(Tensor)。

PyTorch特点 :张量计算、自动求导(autograd)、搭建方便(torch.nn)、动态图机制、CUDA 支持

张量(Tensor)

张量(Tensor)是 PyTorch 里最核心的数据结构,可以把它理解成一种多维数组:0 维是标量,1 维是向量(Vector),2 维是矩阵(Matrix),更高维也都可以继续表示。

  • 和 NumPy 很像:基础用法接近 NumPy 数组。
  • 能力更强:可以通过 CUDA 放到 GPU 上加速。

基本操作

data = torch.tensor(10) # 创建张量标量
data = torch.tensor([11,22,33]) #整数默认是int64a
data = torch.tensor([1.1, 2.2, 3.3]) #浮点数默认是float32
data_3 = torch.rand(2,3) # 创建2行3列的随机值张量。元素值区间在[0,1)之间
data_3 = torch.randn(2,3) # 创建2行3列的随机值张量。元素值符合标准正态分布
data = torch.zeros(2, 3) # 1. 创建指定形状2行3列,值全0张量
data = torch.ones(2, 3) # 1. 创建指定形状全1张量
data_4 = torch.full(size=(2,3),fill_value=99) # 创建全为指定值张量

## 转换张量类型
data_1 = data.type(torch.float32) # 转换为神经网络中要求的float32类型
data_1 = data.type(torch.int64) # 转换为int64类型
arr_2 = t_1.numpy().copy() # 转换为NumPy数组并复制,#copy()后不共享内存
t_1 = torch.from_numpy(arr) # 转张量,共享内存
t_2 = torch.tensor(arr)# 转张量,不共享内存
value = t_1.item() # 转换为标量


## 进行张量计算
t1.add(10) # 加法
t1.sub(100) # 减法
t1.mul(100) # 乘法
t2.mul([[1, 2], [3, 4]]) # 点乘,对应元素相乘,结果与输入相同,支持广播
torch.matmul(A, B) # 或@    结果:(m, n) @ (n, p) → (m, p) 矩阵乘法
t1.div(100) # 除法
t1.neg() # 取反,正数变负数、负数变正数

# 运算函数
tensor.mean(dim=) #平均值
tensor.sum(dim=) #求和。**掌握**
tensor.min/max(dim=) #最小值/最大值
tensor.pow(exponent=) #幂次方 $x^n$
tensor.sqrt() #平方根
tensor.exp() #指数 $e^x$
tensor.log() #对数 以e为底

## 张量索引
t1 = torch.randint(1, 10, (4,5)) # 创建张量 # 4行5列 1~9随机整数张量
# 1---- 行列索引 ----
t1[0] # 获取第一行
t1[:, 0] # 获取第一列
t1[2,4] # 获取 第3行和第5列的元素
t1[[0,2], [3,4]]  # 返回(0, 3), (2,4)两个位置的元素.
t1[:3, :2] #前3行, 前2列
t1[2:, :2] # 第2行到最后, 前2列

## 张量形状操作
data.reshape(1, 6) #reshape(1, 6) 表示重塑成 1 行 6 列
data.reshape(1, -1) # reshape(1, -1) 表示第一维固定为 1,第二维让 PyTorch 自动推导

## squeeze降维
t3.squeeze() # squeeze删除所有形状为1的维度

## unsqueeze升维
t1.unsqueeze(dim=0) # 1行5列 # unsqueeze增加形状为1的维度

## 拼接
#torch.cat 和 torch.concat 没有区别、别名
cat_1 = torch.cat([t1,t2],dim=0) # 按行拼接
cat_2 = torch.cat([t1,t2],dim=1) # 按列拼接
cat_3 = torch.cat([t1,t2],dim=2) # 维度拼接,需要指定dim维度,否则会报错

# stack 在一个新的维度上连接一系列张量,这会增加一个新维度,并且所有输入张量的形状必须完全相同。
stack_1 = torch.stack([t1,t2],dim=0) #t1,t2: 5行6列
print(stack_1,stack_1.shape) # [2,5,6]

dim 与 keepdim

  • dim 表示按哪个维度聚合;支持负索引,-1 表示最后一个维度
  • dim 可为元组,一次性对多个维度求和
  • keepdim=True 会保留被聚合维度(形状变为 1),便于后续广播运算

人工神经网络

人工神经网络(ANN)是一种模仿生物神经网络的计算模型,由多个相互连接的人工神经元组成,擅长学习复杂的非线性模式,也是深度学习的基础。

构建神经网络

神经网络的基本单元是神经元:先做加权求和 $z=w\cdot x+b$,再经激活函数完成非线性变换 $(a=f(z))$,结果传向下一层。

网络按输入层→隐藏层→输出层连接,分别负责接收特征、提取特征、输出结果。

全连接神经网络(MLP)每层接收上一层全部输出,权重与偏置决定信息流向。

激活函数

激活函数是神经网络引入非线性的关键。使网络具备非线性表达能力,能拟合复杂关系并处理线性不可分问题。若无激活函数,无论网络多深本质上仍是线性变换。

常见的激活函数有:Sigmoid、Tanh、ReLU、LeakyReLU、PReLU、ELU、Softmax

参数初始化

我们在构建网络之后,网络中的参数是需要初始化的。我们需要初始化的参数主要有权重偏置偏置一般初始化为0即可,而对权重的初始化通常会选择xavier或kaiming。

神经网络搭建

深度学习神经网络在 PyTorch 中通过继承 nn.Module 并实现以下两个方法构建:

  • __init__:定义并初始化网络层结构(如全连接层)。
  • forward:定义前向传播逻辑,模型调用时自动执行,将数据依次传入各层完成计算。

自动微分模块

自动微分模块(torch.autograd) 在前向传播时自动记录运算构建计算图,在调用反向传播(backward) 时基于该图反向回传梯度,通过“前向记图、反向算梯”实现自动微分。

梯度计算

backward() 触发反向传播,自动计算梯度

pytorch不支持向量张量向量张量的求导,只支持标量张量向量张量的求导。
所以计算梯度: y.backward(), y是一个标量张量

获取x点的梯度值: x.grad, 会累加上一次的梯度值

损失函数

损失函数是用来量化预测值与真实值差异的函数,用来衡量模型预测效果(或拟合程度)、指导优化。

多分类任务损失函数

多分类任务使用交叉熵损失函数

在多分类任务通常使用softmaxlogits转换为概率的形式,所以多分类的交叉熵损失也叫做softmax损失。在PyTorch中使用nn.CrossEntropyLoss()实现。

二分类任务损失函数

二分类任务使用二分类交叉熵损失函数。使用sigmoid激活函数。在PyTorch中实现时使用nn.BCELoss() 实现。

回归任务损失函数

回归任务使用 nn.L1Loss()nn.MSELLoss()nn.L3Loss() 实现,被称为L1 LossL2 LossL3 Loss

网络优化方法

多层神经网络实际中最常用的方法就是 BP(反向传播)。

实现过程
前向传播 先算出预测值,和真实值比较得到误差。反向传播根据误差从后往前计算各层参数的梯度,再根据梯度下降算法更新权重和偏置,循环迭代让预测越来越接近真实值。

前向算损失 → 反向算梯度 → 梯度下降更新参数 → 循环迭代

梯度下降优化方法
梯度下降优化算法中,可能会碰到平缓区域、“鞍点”、局部最小值。所以有一些优化方法。

  • Momentum:动量算法用指数加权平均来平滑梯度方向(引入动量)。
  • AdaGradRMSProp:根据历史梯度变化,自动调整每个参数的学习率(自适应学习率)。
  • Adam:把前两类思路结合起来。
    • 一边用指数加权平均修正梯度(一阶矩/动量)。
    • 一边根据梯度平方的指数加权平均动态调整学习率(二阶矩/自适应)。
  • AdamW:Adam 的修复升级版(当前大模型和主流网络的绝对标配)。
    • 在 Adam 的基础上,将权重衰减(Weight Decay)从梯度计算中解耦
    • 修复了 Adam 中 L2 正则化失效的缺陷,让权重衰减真正生效,显著提升模型的泛化能力。

正则化

正则化的目的就是让模型在新样本上也表现稳定、防止过拟合。

Dropout正则化 就是训练时随机"关掉"一部分神经元,强迫网络不依赖任何单个神经元,从而减轻过拟合;预测时再让所有神经元一起上阵,保证输出稳定。