神经网络训练和推理流程

神经网络训练和推理流程

神经网络的训练和推理是两个不同的阶段,每个阶段有不同的目标和步骤。以下是对这两个阶段的详细解释和对比:

1. 训练阶段(Training Phase)

目标:调整模型的参数(权重和偏置),使模型的预测值尽可能接近真实值,从而提高模型的性能。

主要步骤

  1. 数据准备

    • 收集和预处理训练数据,包括数据清洗、归一化、数据增强等。
    • 将数据分为训练集、验证集和测试集。
  2. 模型定义

    • 定义神经网络的结构,包括输入层、隐藏层和输出层。
    • 选择合适的激活函数,如 ReLU、Sigmoid、Tanh 等。
    • 定义损失函数,如均方误差(MSE)、交叉熵损失等。
    • 选择优化器,如梯度下降(SGD)、Adam 等。
  3. 前向传播

    • 将输入数据通过网络进行前向传播,计算模型的输出。
    • 使用激活函数对每个神经元的输出进行非线性变换。
  4. 计算损失

    • 使用损失函数衡量模型的预测值与真实值之间的差异。
    • 计算损失值,通常是一个标量。
  5. 反向传播

    • 计算损失函数对每个参数的梯度。
    • 使用链式法则逐层计算梯度,从输出层向输入层反向传播。
  6. 参数更新

    • 使用优化器根据计算得到的梯度更新模型的参数。
    • 例如,梯度下降优化器会根据梯度和学习率更新权重和偏置。
  7. 评估和调整

    • 在验证集上评估模型的性能,如准确率、召回率、F1 分数等。
    • 根据评估结果调整模型的超参数,如学习率、批量大小等。
    • 重复训练过程,直到模型性能不再提升或达到预定的训练轮数。

2. 推理阶段(Inference Phase)

目标:使用训练好的模型对新的输入数据进行预测或分类。

主要步骤

  1. 数据准备

    • 收集和预处理新的输入数据,确保数据格式和预处理步骤与训练阶段一致。
    • 例如,归一化、标准化等。
  2. 模型加载

    • 加载训练好的模型,包括模型结构和参数。
    • 确保模型在推理时使用与训练时相同的激活函数和网络结构。
  3. 前向传播

    • 将新的输入数据通过网络进行前向传播,计算模型的输出。
    • 使用激活函数对每个神经元的输出进行非线性变换。
  4. 输出预测结果

    • 将模型的输出转换为最终的预测结果。
    • 例如,对于分类问题,使用 argmax 函数将概率分布转换为类别标签。
    • 对于回归问题,直接使用模型的输出作为预测值。

神经网络的前向传播是神经网络计算输出的过程,以下是对其原理的详细解释:

基本概念

  • 神经元:神经网络的基本单元,类似于生物神经元。每个神经元接收输入信号,经过一定的处理后产生输出信号。输入信号通常是前一层神经元的输出,或者是网络的输入数据。
  • 权重:连接神经元之间的参数,表示输入信号在传递过程中的重要程度。权重的初始值通常是随机赋予的,在训练过程中会不断调整,以使网络能够更好地拟合数据。
  • 偏置:每个神经元的另一个重要参数,可以看作是神经元的一个固有属性,它允许神经元的输出不为零,即使所有输入都为零。偏置的引入增加了神经网络的灵活性,使其能够更好地拟合复杂的函数。
  • 激活函数:神经元在计算加权输入和偏置之和后,通过激活函数来引入非线性因素。常见的激活函数有sigmoid函数、ReLU函数、tanh函数等。激活函数使得神经网络能够学习和模拟复杂的非线性关系,如果没有激活函数,无论神经网络有多少层,其本质上仍然是一个线性模型。

前向传播过程

​ 神经网络的计算过程被称为“前向传播”,主要是因为信息在神经网络中的流动方向是从输入层到输出层,呈现出一种向前推进的特性。

  • 输入层:输入数据直接传递给输入层的神经元。假设输入数据是一个向量[x = (x_1, x_2, \ldots, x_n)],输入层有(n)个神经元,每个神经元接收一个输入数据分量。
  • 隐藏层
    • 权重和偏置的作用:对于第一个隐藏层中的每个神经元,它会接收来自输入层所有神经元的输出。假设第一个隐藏层有(m)个神经元,输入层有(n)个神经元,那么第一个隐藏层的每个神经元都有(n)个权重与输入层神经元相连,还有1个偏置。例如,第一个隐藏层的第一个神经元的权重为[w_{11}, w_{12}, \ldots, w_{1n}],偏置为(b_1)。
    • 加权求和:第一个隐藏层的第一个神经元计算加权输入和偏置之和,即[z_1 = w_{11}x_1 + w_{12}x_2 + \ldots + w_{1n}x_n + b_1]。类似地,第一个隐藏层的其他神经元也会计算各自的加权输入和偏置之和。
    • 激活函数处理:计算得到的加权输入和偏置之和再经过激活函数的处理,得到该神经元的输出。假设激活函数为(f),则第一个隐藏层的第一个神经元的输出为[a_1 = f(z_1)]。第一个隐藏层的所有神经元都按照这种方式计算输出,形成第一个隐藏层的输出向量。
    • 传递到下一层:第一个隐藏层的输出向量作为第二个隐藏层的输入,重复上述过程。即第二个隐藏层的每个神经元会接收第一个隐藏层所有神经元的输出,计算加权输入和偏置之和,再经过激活函数处理得到输出。这个过程一直持续到所有隐藏层都完成计算。
  • 输出层:最后一个隐藏层的输出向量传递到输出层。输出层的神经元数量通常与任务的目标相关,例如在二分类问题中,输出层可能只有一个神经元;在多分类问题中,输出层神经元的数量通常与类别数相同。输出层神经元同样会计算加权输入和偏置之和,然后经过激活函数处理得到最终的输出结果。对于回归问题,输出层的激活函数可能是线性函数;对于分类问题,输出层的激活函数可能是softmax函数等。

3. 示例代码

训练阶段示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 784).astype('float32') / 255.0
x_test = x_test.reshape(-1, 784).astype('float32') / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 定义模型
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, batch_size=100, epochs=10, validation_split=0.1)

# 评估模型
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_accuracy:.4f}")

推理阶段示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 加载训练好的模型
model = tf.keras.models.load_model('path_to_saved_model')

# 新的输入数据
new_input_data = ... # 假设这是已经预处理好的输入数据

# 前向传播,计算模型的输出
predictions = model.predict(new_input_data)

# 将输出转换为最终的预测结果
predicted_classes = tf.argmax(predictions, axis=1)

# 输出预测结果
print(predicted_classes)

总结

  • 训练阶段

    • 目标:调整模型参数,提高模型性能。
    • 主要步骤:数据准备、模型定义、前向传播、计算损失、反向传播、参数更新、评估和调整。
    • 需要的组件:激活函数、损失函数、优化器。
  • 推理阶段

    • 目标:使用训练好的模型进行预测。
    • 主要步骤:数据准备、模型加载、前向传播、输出预测结果。
    • 需要的组件:激活函数、训练好的模型参数。

在实际应用中,训练阶段和推理阶段的步骤和目标不同,但都需要确保数据预处理步骤一致,以保证模型的预测结果准确。


神经网络训练和推理流程
http://blog.uanet.cn/AI/神经网络训练和推理流程.html
作者
dnsnat
发布于
2025年2月13日
许可协议