【机器学习笔记 Ⅱ】4 神经网络中的推理

推理(Inference)是神经网络在训练完成后利用学到的参数对新数据进行预测的过程。与训练阶段不同,推理阶段不计算梯度也不更新权重,仅执行前向传播。以下是其实现原理和代码示例的完整解析:


1. 推理的核心步骤

  1. 加载训练好的模型参数(权重和偏置)。
  2. 前向传播:输入数据逐层计算,得到输出。
  3. 后处理:根据任务类型解析输出(如分类取概率最大值,回归直接输出)。

2. 代码实现(Python + NumPy)

(1) 定义模型结构

假设有一个简单的2层神经网络(输入→隐藏层→输出):

python 复制代码
import numpy as np

# 定义激活函数
def relu(z):
    return np.maximum(0, z)

def softmax(z):
    exp_z = np.exp(z - np.max(z, axis=1, keepdims=True))
    return exp_z / np.sum(exp_z, axis=1, keepdims=True)

(2) 加载训练好的参数

假设已训练好的参数保存在字典中:

python 复制代码
params = {
    "W1": np.random.randn(784, 128) * 0.01,  # 输入层→隐藏层权重
    "b1": np.zeros((1, 128)),                # 隐藏层偏置
    "W2": np.random.randn(128, 10) * 0.01,   # 隐藏层→输出层权重
    "b2": np.zeros((1, 10))                  # 输出层偏置
}

(3) 推理函数实现

python 复制代码
def inference(X, params):
    # 隐藏层计算
    z1 = np.dot(X, params["W1"]) + params["b1"]
    a1 = relu(z1)
    
    # 输出层计算
    z2 = np.dot(a1, params["W2"]) + params["b2"]
    y_pred = softmax(z2)
    
    return y_pred

# 示例输入(1张784维的MNIST图像)
X_test = np.random.randn(1, 784)  # 形状:(batch_size, input_dim)
probabilities = inference(X_test, params)
predicted_class = np.argmax(probabilities, axis=1)
print("预测类别:", predicted_class)

3. 实际应用中的优化技巧

(1) 批量推理

一次性处理多个样本以提高效率:

python 复制代码
X_batch = np.random.randn(100, 784)  # 100张图像
batch_probabilities = inference(X_batch, params)
batch_predictions = np.argmax(batch_probabilities, axis=1)

(2) 使用深度学习框架

TensorFlow/Keras
python 复制代码
from tensorflow.keras.models import load_model

# 加载已训练模型
model = load_model('mnist_model.h5')  # 假设模型已保存

# 推理
y_pred = model.predict(X_test)       # 自动调用前向传播
predicted_class = np.argmax(y_pred, axis=1)
PyTorch
python 复制代码
import torch

model = torch.load('mnist_model.pth')  # 加载模型
model.eval()                          # 切换为推理模式

with torch.no_grad():                 # 禁用梯度计算
    X_test_tensor = torch.from_numpy(X_test).float()
    y_pred = model(X_test_tensor)
    predicted_class = torch.argmax(y_pred, dim=1)

4. 不同任务的后处理

任务类型 输出层激活函数 后处理方式 示例输出解析
二分类 Sigmoid 概率 > 0.5 判为正类 [0.7] → 1
多分类 Softmax 取概率最大的类别 [0.1, 0.8, 0.1] → 1
回归 无(线性输出) 直接输出数值 [3.2] → 3.2

5. 生产环境中的推理优化

(1) 模型轻量化

  • 剪枝(Pruning):移除不重要的神经元。
  • 量化(Quantization):将浮点参数转为低精度(如INT8),减少内存占用。

(2) 硬件加速

  • 使用GPU/TensorRT加速推理。
  • 移动端部署(如TensorFlow Lite、Core ML)。

(3) 服务化部署

  • REST API

    python 复制代码
    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route('/predict', methods=['POST'])
    def predict():
        data = request.json['data']  # 接收输入数据
        X = np.array(data).reshape(1, -1)
        y_pred = model.predict(X)
        return {'class': int(np.argmax(y_pred))}
    
    app.run(port=5000)
  • gRPC:高性能远程调用。


6. 常见问题与解决

问题 原因 解决方案
推理结果与训练时不一致 未切换模型到推理模式 PyTorch中调用 model.eval()
内存溢出(OOM) 输入数据过大 减小batch_size或优化模型
预测速度慢 未启用硬件加速 使用GPU或模型量化

7. 总结

  • 推理本质:前向传播 + 后处理。
  • 关键步骤
    1. 加载模型参数。
    2. 执行前向计算(无梯度更新)。
    3. 解析输出(如argmax、阈值判断)。
  • 最佳实践
    • 批量处理提升效率。
    • 生产环境使用专用框架(如TensorRT)。
    • 注意模型模式和硬件加速。

通过高效实现推理,训练好的模型可以快速应用于实际场景(如实时分类、自动驾驶决策等)。

相关推荐
Uzuki1 小时前
LLM 指标 | PPL vs. BLEU vs. ROUGE-L vs. METEOR vs. CIDEr
深度学习·机器学习·llm·vlm
暗流者3 小时前
AAA 服务器与 RADIUS 协议笔记
运维·服务器·笔记
西猫雷婶3 小时前
神经网络|(十二)概率论基础知识-先验/后验/似然概率基本概念
人工智能·神经网络·机器学习·回归·概率论
Ro Jace4 小时前
科研笔记:博士生手册
笔记
#include>4 小时前
【Golang】有关垃圾收集器的笔记
笔记·golang
Godspeed Zhao5 小时前
Tesla自动驾驶域控制器产品(AutoPilot HW)的系统化梳理
人工智能·机器学习·自动驾驶
Qlittleboy5 小时前
手机、电脑屏幕的显示坏点检测和成像原理
经验分享·笔记
fsnine6 小时前
机器学习案例——预测矿物类型(模型训练)
人工智能·机器学习
重启的码农8 小时前
llama.cpp 分布式推理介绍(7) 远程后端缓冲区 (RPC Buffer)
c++·人工智能·神经网络
Magnetic_h9 小时前
【iOS】SDWebImage第三方库源码学习笔记
笔记·学习·ios·objective-c·cocoa