mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

深度学习作为机器学习的一个重要分支,通过模拟人脑神经元网络的结构和工作方式,实现了对复杂数据的高效处理和特征学习。本文将详细介绍深度学习的基础概念、神经网络的构成单元以及其工作原理。

2.1.1 深度学习概述

什么是深度学习

深度学习(Deep Learning)是一类基于深层神经网络的机器学习方法,其核心思想是通过多层非线性变换从数据中自动学习特征表示,而无需人工设计特征提取器。

与传统机器学习相比,深度学习具有以下特点:

  • 自动特征学习:从原始数据中自动学习层次化的特征表示
  • 深层结构:通常包含多个非线性变换层
  • 强大的拟合能力:能够建模复杂的非线性关系
  • 数据驱动:性能随着数据量增加而提升

深度学习与传统机器学习的区别

特性传统机器学习深度学习
特征处理依赖人工设计特征自动学习特征
模型结构相对简单,层数少复杂,多层结构
数据需求适用于中小规模数据需大量数据才能发挥优势
计算需求较低较高,通常需要GPU加速
可解释性较强较弱,类似"黑箱"
适用场景结构化数据、简单模式非结构化数据、复杂模式

深度学习的典型应用领域

  1. 计算机视觉:图像分类、目标检测、图像分割、人脸识别
  2. 自然语言处理:机器翻译、文本生成、情感分析、问答系统
  3. 语音识别:语音转文字、语音合成、声纹识别
  4. 推荐系统:个性化推荐、内容过滤
  5. 强化学习:游戏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 神经元与神经网络层(结构 + 激活值计算)

神经网络的基本构建块是人工神经元,它模拟了生物神经元的工作方式。多个神经元按一定规则组织形成神经网络层,而多层网络的堆叠构成了深度神经网络。

生物神经元与人工神经元

生物神经元由细胞体、树突和轴突组成:

  • 树突:接收来自其他神经元的信号
  • 细胞体:处理信号,当信号超过阈值时产生输出
  • 轴突:将信号传递给其他神经元

人工神经元是生物神经元的简化数学模型,主要包含三个部分:

  1. 输入:接收多个输入信号(通常是前一层神经元的输出)
  2. 加权求和:对输入信号进行加权求和
  3. 激活函数:对加权和进行非线性变换,产生输出

人工神经元的数学模型

一个人工神经元的输出计算过程可以表示为:

  1. 加权求和
    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=1nwixi+b
    其中:

    • x1,x2,...,xnx_1, x_2, ..., x_nx1,x2,...,xn 是输入信号
    • w1,w2,...,wnw_1, w_2, ..., w_nw1,w2,...,wn 是权重参数
    • bbb 是偏置参数
    • zzz 是加权和(也称为logit)
  2. 激活函数
    a=f(z)a = f(z)a=f(z)
    其中:

    • f(⋅)f(\cdot)f() 是激活函数
    • aaa 是神经元的输出(激活值)

激活函数

激活函数是神经网络中至关重要的组成部分,它为网络引入了非线性,使神经网络能够建模复杂的非线性关系。没有激活函数,无论多少层的神经网络都等价于一个线性模型。

常见激活函数
  1. Sigmoid函数
    σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+ez1

    • 输出范围:(0, 1)
    • 特点:将输入映射到概率区间,适合二分类输出层
    • 问题:容易出现梯度消失,输出不是零中心
  2. Tanh函数
    tanh⁡(z)=ez−e−zez+e−z\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}tanh(z)=ez+ezezez

    • 输出范围:(-1, 1)
    • 特点:零中心输出,比sigmoid收敛更快
    • 问题:仍然存在梯度消失问题
  3. ReLU函数(Rectified Linear Unit)
    ReLU(z)=max⁡(0,z)\text{ReLU}(z) = \max(0, z)ReLU(z)=max(0,z)

    • 输出范围:[0, +∞)
    • 特点:计算简单,缓解梯度消失,收敛快
    • 问题:死亡ReLU问题(某些神经元可能永久失活)
  4. 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问题
    • 问题:α是另一个需要调整的超参数
  5. 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()

神经网络层

神经网络层是由多个神经元组成的集合,层内神经元通常共享相同的输入,但有各自独立的权重参数。

基本网络层类型
  1. 输入层(Input Layer)

    • 神经网络的第一层,接收原始数据
    • 没有计算,仅传递输入数据到下一层
    • 神经元数量等于输入特征的维度
  2. 全连接层(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[l1]+b[l])
      • a[l−1]a^{[l-1]}a[l1]:前一层输出
      • W[l]W^{[l]}W[l]:权重矩阵,形状为(当前层神经元数, 前一层神经元数)
      • b[l]b^{[l]}b[l]:偏置向量,形状为(当前层神经元数, 1)
      • f(⋅)f(\cdot)f():激活函数
      • a[l]a^{[l]}a[l]:当前层输出
  3. 隐藏层(Hidden Layer)

    • 输入层和输出层之间的所有层
    • 负责学习数据的中间特征表示
    • 网络的"深度"通常指隐藏层的数量
  4. 输出层(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[l1]+b[l]
A[l]=f(Z[l])A^{[l]} = f(Z^{[l]})A[l]=f(Z[l])

其中:

  • A[l−1]A^{[l-1]}A[l1]:前一层输出,形状为(前一层神经元数, 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,)

注意事项与易错点

  1. 激活函数选择

    • 隐藏层:通常优先选择ReLU或其变体(计算高效)
    • 输出层:根据任务类型选择(sigmoid/softmax/线性)
    • 避免在深层网络中使用sigmoid和tanh(容易梯度消失)
  2. 权重初始化

    • 随机初始化很重要,不当的初始化会导致梯度消失或爆炸
    • PyTorch的nn.Linear默认使用Xavier初始化
    • 对于ReLU激活函数,Kaiming初始化通常更合适
  3. 维度匹配

    • 确保相邻层的维度匹配(当前层输入尺寸=前一层输出尺寸)
    • 注意批次维度的位置(PyTorch默认是(batch_size, features))
  4. 计算效率

    • 全连接层参数量大(input_size × output_size),不适合高维输入
    • 对于图像等高维数据,通常使用卷积层替代全连接层

2.1.3 神经网络工作原理与推理流程

神经网络通过多层非线性变换实现从输入到输出的映射,其工作过程主要包括训练推理两个阶段。训练阶段通过优化算法调整网络参数,推理阶段则使用训练好的参数对新数据进行预测。

神经网络的基本结构

一个典型的神经网络由以下部分组成:

  • 输入层:接收原始数据
  • 多个隐藏层:逐步提取高级特征
  • 输出层:产生最终预测结果
  • 参数:权重(W)和偏置(b),通过训练学习得到
  • 激活函数:引入非线性,使网络能够建模复杂关系

神经网络的工作原理

神经网络的核心工作原理是分层特征学习参数化非线性映射

  1. 分层特征学习

    • 浅层(靠近输入层)学习简单特征(如边缘、纹理)
    • 深层(靠近输出层)学习复杂特征(如部件、整体)
    • 这种层次化特征表示与人类认知过程相似
  2. 参数化非线性映射

    • 网络通过权重和偏置参数化输入到输出的映射关系
    • 激活函数引入非线性,使网络能够拟合任意复杂的函数(在理论条件下)
    • 通过调整参数,使网络输出尽可能接近真实值

前向传播(Forward Propagation)

前向传播是神经网络进行推理(预测)的核心过程,指输入数据从输入层经过各隐藏层传递到输出层,最终产生预测结果的过程。

前向传播的数学描述

对于一个包含LLL层的神经网络,前向传播过程可以描述为:

  • 输入层:a[0]=xa^{[0]} = xa[0]=xxxx为输入数据)
  • 第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[l1]+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[L1]+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)是指使用训练好的神经网络对新的、未见过的数据进行预测的过程,主要包括以下步骤:

  1. 数据预处理

    • 将输入数据转换为网络所需的格式(如张量)
    • 应用与训练数据相同的预处理(标准化、归一化等)
    • 确保输入数据的维度与网络期望的输入维度匹配
  2. 前向传播

    • 将预处理后的输入数据送入神经网络
    • 数据通过各层传递,计算每一层的加权和与激活值
    • 得到输出层的预测结果
  3. 后处理

    • 对输出结果进行解释(如将概率转换为类别标签)
    • 根据应用场景进行必要的后处理(如阈值过滤、非极大值抑制等)
  4. 返回结果

    • 将最终结果以合适的形式返回
推理流程示例(图像分类)
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上进行,或使用轻量级设备

推理优化技术

为了提高推理效率,特别是在资源受限的设备上,可以采用以下优化技术:

  1. 模型量化:将32位浮点数参数转换为16位甚至8位整数,减少内存占用和计算量
  2. 模型剪枝:移除不重要的神经元或连接,减小模型规模
  3. 知识蒸馏:将大型模型的知识转移到小型模型
  4. 推理引擎优化:使用专门的推理引擎(如TensorRT、ONNX Runtime)进行优化
  5. 批处理:对多个样本同时进行推理,提高计算效率
# 模型量化示例
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)而非整个模型

  • 加载模型时确保网络结构与保存时一致

小结

深度学习通过深层神经网络实现了自动特征学习和复杂模式建模,其核心构建块是人工神经元,通过加权求和与非线性激活函数实现输入到输出的映射。多个神经元组成神经网络层,层与层之间的连接形成了深度神经网络的整体结构。

神经网络的工作过程包括训练和推理两个阶段,其中前向传播是推理的核心流程,通过输入数据在网络各层的传递,最终产生预测结果。理解神经网络的基本结构、工作原理和推理流程,是深入学习更复杂深度学习模型的基础。

在实际应用中,需要注意激活函数的选择、网络参数的初始化、输入数据的预处理等细节,同时掌握推理优化技术,以提高模型的效率和部署能力。

posted on 2025-11-07 20:35  mthoutai  阅读(96)  评论(0)    收藏  举报