深度学习作为机器学习的一个重要分支,通过模拟人脑神经元网络的结构和工作方式,实现了对复杂数据的高效处理和特征学习。本文将详细介绍深度学习的基础概念、神经网络的构成单元以及其工作原理。
2.1.1 深度学习概述
什么是深度学习
深度学习(Deep Learning)是一类基于深层神经网络的机器学习方法,其核心思想是通过多层非线性变换从数据中自动学习特征表示,而无需人工设计特征提取器。
与传统机器学习相比,深度学习具有以下特点:
- 自动特征学习:从原始数据中自动学习层次化的特征表示
- 深层结构:通常包含多个非线性变换层
- 强大的拟合能力:能够建模复杂的非线性关系
- 数据驱动:性能随着数据量增加而提升
深度学习与传统机器学习的区别
| 特性 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征处理 | 依赖人工设计特征 | 自动学习特征 |
| 模型结构 | 相对简单,层数少 | 复杂,多层结构 |
| 数据需求 | 适用于中小规模数据 | 需大量数据才能发挥优势 |
| 计算需求 | 较低 | 较高,通常需要GPU加速 |
| 可解释性 | 较强 | 较弱,类似"黑箱" |
| 适用场景 | 结构化数据、简单模式 | 非结构化数据、复杂模式 |
深度学习的典型应用领域
- 计算机视觉:图像分类、目标检测、图像分割、人脸识别
- 自然语言处理:机器翻译、文本生成、情感分析、问答系统
- 语音识别:语音转文字、语音合成、声纹识别
- 推荐系统:个性化推荐、内容过滤
- 强化学习:游戏AI、机器人控制、自动驾驶
深度学习的发展里程碑
- 1943年:McCulloch-Pitts神经元模型提出,奠定了神经网络的基础
- 1986年:反向传播算法提出,解决了深层网络的训练问题
- 2006年:Hinton提出深度信念网络和预训练方法,标志深度学习的复兴
- 2012年:AlexNet在ImageNet竞赛中夺冠,深度学习开始广泛关注
- 2014年:生成对抗网络(GAN)提出,推动生成模型发展
- 2017年:Transformer模型提出,革新了自然语言处理领域
- 2020年至今:大型语言模型(LLM)快速发展,如GPT系列、BERT等
深度学习的优势与挑战
优势:
- 强大的自动特征提取能力,减少对领域知识的依赖
- 对高维复杂数据(图像、文本、语音)处理效果优异
- 端到端学习,简化系统设计
- 可迁移性强,预训练模型可在不同任务间迁移
挑战:
- 需要大量标注数据
- 计算资源消耗大
- 模型可解释性差
- 容易过拟合
- 调参复杂,需要经验积累
常见深度学习框架
- PyTorch:动态计算图,灵活性高,适合研究和快速原型开发
- TensorFlow/Keras:静态计算图,部署方便,适合生产环境
- MXNet:兼顾灵活性和效率,支持多种编程语言
- JAX:结合NumPy、自动微分和GPU/TPU加速,适合研究
# PyTorch版本检查与简单示例
import torch
# 检查PyTorch版本和CUDA可用性
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
print(f"CUDA版本: {torch.version.cuda if torch.cuda.is_available() else 'N/A'}")
# 简单的张量操作示例
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
y = torch.tensor([[5.0, 6.0], [7.0, 8.0]])
print("\n张量加法:")
print(x + y)
print("\n张量乘法:")
print(x @ y) # 矩阵乘法
# 在GPU上运行(如果可用)
if torch.cuda.is_available():
x_gpu = x.to('cuda')
y_gpu = y.to('cuda')
print("\nGPU上的张量乘法:")
print((x_gpu @ y_gpu).cpu()) # 结果传回CPU
注意事项
- 深度学习并非万能解决方案,对于简单问题或小数据集,传统机器学习可能更高效
- 不要盲目追求深层网络,过深的网络可能导致梯度消失/爆炸和训练困难
- 数据质量往往比模型复杂度更重要,“垃圾进,垃圾出”
- 深度学习模型需要持续监控和维护,以适应数据分布的变化
2.1.2 神经元与神经网络层(结构 + 激活值计算)
神经网络的基本构建块是人工神经元,它模拟了生物神经元的工作方式。多个神经元按一定规则组织形成神经网络层,而多层网络的堆叠构成了深度神经网络。
生物神经元与人工神经元
生物神经元由细胞体、树突和轴突组成:
- 树突:接收来自其他神经元的信号
- 细胞体:处理信号,当信号超过阈值时产生输出
- 轴突:将信号传递给其他神经元
人工神经元是生物神经元的简化数学模型,主要包含三个部分:
- 输入:接收多个输入信号(通常是前一层神经元的输出)
- 加权求和:对输入信号进行加权求和
- 激活函数:对加权和进行非线性变换,产生输出
人工神经元的数学模型
一个人工神经元的输出计算过程可以表示为:
加权求和:
z=w1x1+w2x2+...+wnxn+b=∑i=1nwixi+bz = w_1x_1 + w_2x_2 + ... + w_nx_n + b = \sum_{i=1}^{n} w_i x_i + bz=w1x1+w2x2+...+wnxn+b=i=1∑nwixi+b
其中:- x1,x2,...,xnx_1, x_2, ..., x_nx1,x2,...,xn 是输入信号
- w1,w2,...,wnw_1, w_2, ..., w_nw1,w2,...,wn 是权重参数
- bbb 是偏置参数
- zzz 是加权和(也称为logit)
激活函数:
a=f(z)a = f(z)a=f(z)
其中:- f(⋅)f(\cdot)f(⋅) 是激活函数
- aaa 是神经元的输出(激活值)
激活函数
激活函数是神经网络中至关重要的组成部分,它为网络引入了非线性,使神经网络能够建模复杂的非线性关系。没有激活函数,无论多少层的神经网络都等价于一个线性模型。
常见激活函数
Sigmoid函数
σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+e−z1- 输出范围:(0, 1)
- 特点:将输入映射到概率区间,适合二分类输出层
- 问题:容易出现梯度消失,输出不是零中心
Tanh函数
tanh(z)=ez−e−zez+e−z\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}tanh(z)=ez+e−zez−e−z- 输出范围:(-1, 1)
- 特点:零中心输出,比sigmoid收敛更快
- 问题:仍然存在梯度消失问题
ReLU函数(Rectified Linear Unit)
ReLU(z)=max(0,z)\text{ReLU}(z) = \max(0, z)ReLU(z)=max(0,z)- 输出范围:[0, +∞)
- 特点:计算简单,缓解梯度消失,收敛快
- 问题:死亡ReLU问题(某些神经元可能永久失活)
Leaky ReLU
Leaky ReLU(z)=max(αz,z)\text{Leaky ReLU}(z) = \max(\alpha z, z)Leaky ReLU(z)=max(αz,z)- 其中α是一个小的正数(通常0.01)
- 特点:解决了死亡ReLU问题
- 问题:α是另一个需要调整的超参数
Softmax函数
softmax(zi)=ezi∑j=1Kezj\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}softmax(zi)=∑j=1Kezjezi- 输出范围:(0, 1),且所有输出之和为1
- 特点:适合多分类问题的输出层,表示类别概率分布
激活函数可视化
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 生成输入值
z = torch.linspace(-5, 5, 100)
# 计算各种激活函数值
sigmoid = torch.sigmoid(z)
tanh = torch.tanh(z)
relu = F.relu(z)
leaky_relu = F.leaky_relu(z, negative_slope=0.01)
# 绘制激活函数
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.plot(z.numpy(), sigmoid.numpy())
plt.title('Sigmoid函数')
plt.grid(alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.subplot(2, 2, 2)
plt.plot(z.numpy(), tanh.numpy())
plt.title('Tanh函数')
plt.grid(alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.subplot(2, 2, 3)
plt.plot(z.numpy(), relu.numpy())
plt.title('ReLU函数')
plt.grid(alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.subplot(2, 2, 4)
plt.plot(z.numpy(), leaky_relu.numpy())
plt.title('Leaky ReLU函数')
plt.grid(alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.tight_layout()
plt.savefig('activation_functions.png', dpi=300)
plt.show()
神经网络层
神经网络层是由多个神经元组成的集合,层内神经元通常共享相同的输入,但有各自独立的权重参数。
基本网络层类型
输入层(Input Layer)
- 神经网络的第一层,接收原始数据
- 没有计算,仅传递输入数据到下一层
- 神经元数量等于输入特征的维度
全连接层(Fully Connected Layer)/稠密层(Dense Layer)
- 层中每个神经元与前一层的所有神经元相连
- 是最基本的神经网络层
- 数学表示:a[l]=f(z[l])=f(W[l]a[l−1]+b[l])a^{[l]} = f(z^{[l]}) = f(W^{[l]}a^{[l-1]} + b^{[l]})a[l]=f(z[l])=f(W[l]a[l−1]+b[l])
- a[l−1]a^{[l-1]}a[l−1]:前一层输出
- W[l]W^{[l]}W[l]:权重矩阵,形状为(当前层神经元数, 前一层神经元数)
- b[l]b^{[l]}b[l]:偏置向量,形状为(当前层神经元数, 1)
- f(⋅)f(\cdot)f(⋅):激活函数
- a[l]a^{[l]}a[l]:当前层输出
隐藏层(Hidden Layer)
- 输入层和输出层之间的所有层
- 负责学习数据的中间特征表示
- 网络的"深度"通常指隐藏层的数量
输出层(Output Layer)
- 神经网络的最后一层,产生最终预测结果
- 神经元数量通常等于输出维度(如分类问题的类别数)
- 激活函数选择取决于任务类型:
- 二分类:sigmoid
- 多分类:softmax
- 回归:无激活函数或ReLU
全连接层的矩阵运算
对于包含mmm个样本的批次数据,全连接层的计算可以表示为矩阵运算:
Z[l]=W[l]A[l−1]+b[l]Z^{[l]} = W^{[l]}A^{[l-1]} + b^{[l]}Z[l]=W[l]A[l−1]+b[l]
A[l]=f(Z[l])A^{[l]} = f(Z^{[l]})A[l]=f(Z[l])
其中:
- A[l−1]A^{[l-1]}A[l−1]:前一层输出,形状为(前一层神经元数, mmm)
- W[l]W^{[l]}W[l]:权重矩阵,形状为(当前层神经元数, 前一层神经元数)
- b[l]b^{[l]}b[l]:偏置向量,形状为(当前层神经元数, 1),通过广播机制与矩阵相加
- Z[l]Z^{[l]}Z[l]:当前层加权和,形状为(当前层神经元数, mmm)
- A[l]A^{[l]}A[l]:当前层输出,形状为(当前层神经元数, mmm)
这种矩阵运算表示使得计算更高效,并且可以利用GPU进行并行加速。
PyTorch实现神经元与网络层
import torch
import torch.nn as nn
# 1. 单个神经元实现
class Neuron(nn.Module):
def __init__(self, input_size, activation=nn.Sigmoid()):
super(Neuron, self).__init__()
self.weights = nn.Parameter(torch.randn(input_size)) # 权重
self.bias = nn.Parameter(torch.randn(1)) # 偏置
self.activation = activation # 激活函数
def forward(self, x):
# x形状: (batch_size, input_size)
z = torch.matmul(x, self.weights) + self.bias # 加权求和
a = self.activation(z) # 激活函数
return a
# 测试单个神经元
neuron = Neuron(input_size=3, activation=nn.ReLU())
x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) # 2个样本,每个3个特征
output = neuron(x)
print("单个神经元输出:", output)
print("输出形状:", output.shape)
# 2. 全连接层实现(等价于nn.Linear + 激活函数)
class DenseLayer(nn.Module):
def __init__(self, input_size, output_size, activation=nn.ReLU()):
super(DenseLayer, self).__init__()
self.linear = nn.Linear(input_size, output_size) # 线性变换
self.activation = activation # 激活函数
def forward(self, x):
# x形状: (batch_size, input_size)
z = self.linear(x) # 等价于 Wx + b
a = self.activation(z) # 激活函数
return a
# 测试全连接层
dense = DenseLayer(input_size=3, output_size=2, activation=nn.ReLU())
x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
output = dense(x)
print("\n全连接层输出:", output)
print("输出形状:", output.shape)
# 3. 查看层参数
print("\n全连接层权重:")
print(dense.linear.weight) # 形状: (output_size, input_size)
print("\n全连接层偏置:")
print(dense.linear.bias) # 形状: (output_size,)
注意事项与易错点
激活函数选择
- 隐藏层:通常优先选择ReLU或其变体(计算高效)
- 输出层:根据任务类型选择(sigmoid/softmax/线性)
- 避免在深层网络中使用sigmoid和tanh(容易梯度消失)
权重初始化
- 随机初始化很重要,不当的初始化会导致梯度消失或爆炸
- PyTorch的nn.Linear默认使用Xavier初始化
- 对于ReLU激活函数,Kaiming初始化通常更合适
维度匹配
- 确保相邻层的维度匹配(当前层输入尺寸=前一层输出尺寸)
- 注意批次维度的位置(PyTorch默认是(batch_size, features))
计算效率
- 全连接层参数量大(input_size × output_size),不适合高维输入
- 对于图像等高维数据,通常使用卷积层替代全连接层
2.1.3 神经网络工作原理与推理流程
神经网络通过多层非线性变换实现从输入到输出的映射,其工作过程主要包括训练和推理两个阶段。训练阶段通过优化算法调整网络参数,推理阶段则使用训练好的参数对新数据进行预测。
神经网络的基本结构
一个典型的神经网络由以下部分组成:
- 输入层:接收原始数据
- 多个隐藏层:逐步提取高级特征
- 输出层:产生最终预测结果
- 参数:权重(W)和偏置(b),通过训练学习得到
- 激活函数:引入非线性,使网络能够建模复杂关系
神经网络的工作原理
神经网络的核心工作原理是分层特征学习和参数化非线性映射:
分层特征学习:
- 浅层(靠近输入层)学习简单特征(如边缘、纹理)
- 深层(靠近输出层)学习复杂特征(如部件、整体)
- 这种层次化特征表示与人类认知过程相似
参数化非线性映射:
- 网络通过权重和偏置参数化输入到输出的映射关系
- 激活函数引入非线性,使网络能够拟合任意复杂的函数(在理论条件下)
- 通过调整参数,使网络输出尽可能接近真实值
前向传播(Forward Propagation)
前向传播是神经网络进行推理(预测)的核心过程,指输入数据从输入层经过各隐藏层传递到输出层,最终产生预测结果的过程。
前向传播的数学描述
对于一个包含LLL层的神经网络,前向传播过程可以描述为:
- 输入层:a[0]=xa^{[0]} = xa[0]=x(xxx为输入数据)
- 第1层到第L-1层(隐藏层):
z[l]=W[l]a[l−1]+b[l]z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]}z[l]=W[l]a[l−1]+b[l]
a[l]=f[l](z[l])a^{[l]} = f^{[l]}(z^{[l]})a[l]=f[l](z[l]) - 输出层(第L层):
z[L]=W[L]a[L−1]+b[L]z^{[L]} = W^{[L]}a^{[L-1]} + b^{[L]}z[L]=W[L]a[L−1]+b[L]
a[L]=f[L](z[L])=y^a^{[L]} = f^{[L]}(z^{[L]}) = \hat{y}a[L]=f[L](z[L])=y^(y^\hat{y}y^为预测结果)
其中:
- lll:层索引(从1到L)
- W[l]W^{[l]}W[l]和b[l]b^{[l]}b[l]:第lll层的权重和偏置
- z[l]z^{[l]}z[l]:第lll层的加权和
- a[l]a^{[l]}a[l]:第lll层的激活值(输出)
- f[l]f^{[l]}f[l]:第lll层的激活函数
前向传播示例
以一个简单的神经网络为例,展示前向传播过程:
- 输入层:2个神经元(输入特征)
- 隐藏层:3个神经元,使用ReLU激活函数
- 输出层:2个神经元,使用Softmax激活函数(多分类)
import torch
import torch.nn as nn
import torch.nn.functional as F
# 定义一个简单的神经网络
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.hidden = nn.Linear(2, 3) # 输入层→隐藏层:2→3
self.output = nn.Linear(3, 2) # 隐藏层→输出层:3→2
def forward(self, x):
# 前向传播步骤
z1 = self.hidden(x) # 隐藏层加权和
a1 = F.relu(z1) # 隐藏层激活值
z2 = self.output(a1) # 输出层加权和
a2 = F.softmax(z2, dim=1) # 输出层激活值(概率分布)
return a2, (z1, a1, z2)
# 创建网络实例
model = SimpleNN()
# 随机初始化输入(3个样本,每个2个特征)
x = torch.randn(3, 2)
print("输入数据:")
print(x)
# 前向传播
y_pred, intermediates = model(x)
z1, a1, z2 = intermediates
print("\n隐藏层加权和 (z1):")
print(z1)
print("隐藏层激活值 (a1):")
print(a1)
print("\n输出层加权和 (z2):")
print(z2)
print("输出层激活值 (y_pred):")
print(y_pred)
print("输出概率和:", y_pred.sum(dim=1)) # 验证softmax输出和为1
神经网络推理流程
推理(Inference)是指使用训练好的神经网络对新的、未见过的数据进行预测的过程,主要包括以下步骤:
数据预处理:
- 将输入数据转换为网络所需的格式(如张量)
- 应用与训练数据相同的预处理(标准化、归一化等)
- 确保输入数据的维度与网络期望的输入维度匹配
前向传播:
- 将预处理后的输入数据送入神经网络
- 数据通过各层传递,计算每一层的加权和与激活值
- 得到输出层的预测结果
后处理:
- 对输出结果进行解释(如将概率转换为类别标签)
- 根据应用场景进行必要的后处理(如阈值过滤、非极大值抑制等)
返回结果:
- 将最终结果以合适的形式返回
推理流程示例(图像分类)
import torch
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image
import numpy as np
# 定义一个简单的图像分类网络
class ImageClassifier(nn.Module):
def __init__(self, num_classes=10):
super(ImageClassifier, self).__init__()
# 假设输入是32x32的RGB图像
self.flatten = nn.Flatten() # 将图像展平
self.fc1 = nn.Linear(32*32*3, 512) # 全连接层1
self.fc2 = nn.Linear(512, 256) # 全连接层2
self.fc3 = nn.Linear(256, num_classes) # 输出层
def forward(self, x):
x = self.flatten(x)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.softmax(self.fc3(x), dim=1)
return x
# 推理函数
def predict_image(model, image_path, device='cpu'):
# 1. 数据预处理
transform = transforms.Compose([
transforms.Resize((32, 32)), # 调整尺寸
transforms.ToTensor(), # 转换为张量
transforms.Normalize( # 标准化(与训练时一致)
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
# 加载图像并预处理
image = Image.open(image_path).convert('RGB')
image_tensor = transform(image).unsqueeze(0) # 添加批次维度
image_tensor = image_tensor.to(device)
# 2. 前向传播(推理模式)
model.eval() # 设置为评估模式
with torch.no_grad(): # 禁用梯度计算,节省内存和计算
outputs = model(image_tensor)
# 3. 后处理
probabilities = outputs[0].cpu().numpy()
predicted_class = np.argmax(probabilities)
return predicted_class, probabilities
# 模拟推理过程(假设模型已训练好)
if __name__ == "__main__":
# 创建模型并加载预训练权重(这里使用随机权重作为示例)
model = ImageClassifier(num_classes=10)
# model.load_state_dict(torch.load('pretrained_model.pth')) # 实际应用中加载权重
# 模拟图像路径(实际应用中替换为真实图像路径)
image_path = "test_image.jpg"
# 进行预测
predicted_class, probabilities = predict_image(model, image_path)
print(f"预测类别: {predicted_class}")
print(f"类别概率: {probabilities}")
训练与推理的区别
| 特性 | 训练阶段 | 推理阶段 |
|---|---|---|
| 目的 | 学习最优参数 | 使用学到的参数进行预测 |
| 计算内容 | 前向传播+反向传播 | 仅前向传播 |
| 批量处理 | 通常使用mini-batch | 可使用单个样本或批量 |
| 随机性 | 可能包含dropout、数据增强等随机操作 | 禁用随机性操作 |
| 梯度计算 | 需要计算梯度 | 不需要计算梯度 |
| 模型状态 | train模式 | eval模式 |
| 计算资源 | 通常需要GPU加速 | 可在CPU上进行,或使用轻量级设备 |
推理优化技术
为了提高推理效率,特别是在资源受限的设备上,可以采用以下优化技术:
- 模型量化:将32位浮点数参数转换为16位甚至8位整数,减少内存占用和计算量
- 模型剪枝:移除不重要的神经元或连接,减小模型规模
- 知识蒸馏:将大型模型的知识转移到小型模型
- 推理引擎优化:使用专门的推理引擎(如TensorRT、ONNX Runtime)进行优化
- 批处理:对多个样本同时进行推理,提高计算效率
# 模型量化示例
def quantize_model(model):
"""将模型量化为INT8精度"""
# 动态量化示例
quantized_model = torch.quantization.quantize_dynamic(
model,
{nn.Linear}, # 指定要量化的层类型
dtype=torch.qint8 # 量化类型
)
return quantized_model
# 量化前后推理时间对比
import time
# 创建模型
model = ImageClassifier()
quantized_model = quantize_model(model)
# 生成测试数据
test_input = torch.randn(1, 3, 32, 32)
# 原始模型推理时间
start = time.time()
with torch.no_grad():
model.eval()
model(test_input)
end = time.time()
print(f"原始模型推理时间: {end - start:.6f}秒")
# 量化模型推理时间
start = time.time()
with torch.no_grad():
quantized_model.eval()
quantized_model(test_input)
end = time.time()
print(f"量化模型推理时间: {end - start:.6f}秒")
# 模型大小对比(估计)
import numpy as np
def estimate_model_size(model):
"""估计模型参数大小(MB)"""
total_params = sum(p.numel() for p in model.parameters())
# 假设每个参数是32位浮点数(4字节)
return total_params * 4 / (1024 **2)
print(f"原始模型大小: {estimate_model_size(model):.2f} MB")
print(f"量化模型大小: {estimate_model_size(quantized_model)/4:.2f} MB") # INT8是32位的1/4
注意事项与常见错误
1.推理模式设置 :务必在推理前调用model.eval(),否则dropout层和批量归一化层会表现异常
- 推理时使用
torch.no_grad()禁用梯度计算,可显著提高速度并减少内存占用
2.输入数据预处理: 推理时的预处理必须与训练时完全一致(相同的均值、标准差等)
- 确保输入数据的维度和类型正确
3.设备一致性:确保输入数据和模型在同一设备上(都在CPU或都在GPU上)
- 跨设备操作会导致错误或性能下降
4.数值稳定性:注意输入数据的范围,避免极端值导致的数值不稳定
- 对于使用softmax的输出层,注意处理数值溢出问题
5.模型保存与加载:保存模型时建议只保存参数(state_dict)而非整个模型
- 加载模型时确保网络结构与保存时一致
小结
深度学习通过深层神经网络实现了自动特征学习和复杂模式建模,其核心构建块是人工神经元,通过加权求和与非线性激活函数实现输入到输出的映射。多个神经元组成神经网络层,层与层之间的连接形成了深度神经网络的整体结构。
神经网络的工作过程包括训练和推理两个阶段,其中前向传播是推理的核心流程,通过输入数据在网络各层的传递,最终产生预测结果。理解神经网络的基本结构、工作原理和推理流程,是深入学习更复杂深度学习模型的基础。
在实际应用中,需要注意激活函数的选择、网络参数的初始化、输入数据的预处理等细节,同时掌握推理优化技术,以提高模型的效率和部署能力。
浙公网安备 33010602011771号