当前位置: 首页 > news >正文

人工神经网络(Artificial Neural Network,ANN)详细解释(带示例)

目录

基本概念

神经元模型

激活函数

网络结构

训练过程

示例

Python 案例

代码解释


基本概念

人工神经网络是一种模仿人类神经系统的计算模型,由大量的神经元(也称为节点)相互连接组成。这些神经元按照层次结构排列,通常包括输入层、隐藏层和输出层。信息在网络中从输入层传递到隐藏层,再到输出层,在这个过程中,神经元之间通过加权连接进行信息传递和处理。

神经元模型

神经元是神经网络的基本计算单元,其工作原理类似于生物神经元。每个神经元接收多个输入信号,将这些输入信号乘以对应的权重,然后求和,再经过一个激活函数处理,产生输出。数学表达式为:
y = f\left(\sum_{i = 1}^{n}w_{i}x_{i}+b\right)
其中,x_i 是输入信号,w_i是对应的权重,b 是偏置,f是激活函数,y 是输出。

激活函数

激活函数的作用是引入非线性因素,使得神经网络能够学习复杂的非线性关系。常见的激活函数有:

  • Sigmoid 函数f(x)=\frac{1}{1 + e^{-x}},输出范围在(0, 1)之间,常用于二分类问题。
  • ReLU 函数f(x)=\max(0, x),计算简单,能有效缓解梯度消失问题,在深度学习中广泛应用。
  • Tanh 函数f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}},输出范围在(-1, 1)之间。
网络结构
  • 输入层:接收外部输入数据,神经元的数量通常等于输入特征的数量。
  • 隐藏层:可以有一个或多个,隐藏层中的神经元对输入数据进行特征提取和转换,层数越多,网络的表达能力越强,但也越容易过拟合。
  • 输出层:输出网络的预测结果,神经元的数量根据具体任务而定,例如二分类问题通常有 1 个输出神经元,多分类问题的输出神经元数量等于类别数。
训练过程

神经网络的训练过程主要是通过调整神经元之间的权重和偏置,使得网络的输出尽可能接近真实标签。常用的训练算法是反向传播算法(Backpropagation),其基本步骤如下:

  1. 前向传播:将输入数据传入网络,依次计算各层神经元的输出,直到得到输出层的预测结果。
  2. 计算损失:使用损失函数(如均方误差、交叉熵损失等)计算预测结果与真实标签之间的差异。
  3. 反向传播:根据损失函数的梯度,从输出层开始,逐层计算每个神经元的梯度,以确定权重和偏置的调整方向。
  4. 参数更新:使用优化算法(如随机梯度下降、Adam 等)根据计算得到的梯度更新权重和偏置。

示例

假设我们要构建一个简单的神经网络来识别手写数字(MNIST 数据集)。输入层有 784 个神经元(因为每个手写数字图像是 28x28 像素,展开后是 784 维向量),隐藏层可以设置为 128 个神经元,输出层有 10 个神经元(对应 0 - 9 这 10 个数字类别)。训练过程中,网络通过不断调整权重和偏置,学习如何从输入的图像数据中提取特征,从而准确预测图像对应的数字。

Python 案例

以下是使用 Python 和 Keras 库构建一个简单的全连接神经网络来对 MNIST 手写数字进行分类的示例:

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

# 加载MNIST数据集
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 数据预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images / 255.0
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images / 255.0

# 构建神经网络模型
model = keras.Sequential([
    keras.layers.Dense(128, activation='relu', input_shape=(28 * 28,)),
    keras.layers.Dense(10, activation='softmax')
])

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

# 训练模型
model.fit(train_images, train_labels, epochs=5)

# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")

# 进行预测
predictions = model.predict(test_images)
# 显示预测结果示例
def plot_image(i, predictions_array, true_label, img):
    predictions_array, true_label, img = predictions_array, true_label[i], img[i]
    plt.grid(False)
    plt.xticks([])
    plt.yticks([])

    img = img.reshape(28, 28)
    plt.imshow(img, cmap=plt.cm.binary)

    predicted_label = np.argmax(predictions_array)
    if predicted_label == true_label:
        color = 'blue'
    else:
        color = 'red'

    plt.xlabel(f"{predicted_label} {100 * np.max(predictions_array):2.0f}% ({true_label})",
               color=color)

def plot_value_array(i, predictions_array, true_label):
    predictions_array, true_label = predictions_array, true_label[i]
    plt.grid(False)
    plt.xticks(range(10))
    plt.yticks([])
    thisplot = plt.bar(range(10), predictions_array, color="#777777")
    plt.ylim([0, 1])
    predicted_label = np.argmax(predictions_array)

    thisplot[predicted_label].set_color('red')
    thisplot[true_label].set_color('blue')

num_rows = 5
num_cols = 3
num_images = num_rows * num_cols
plt.figure(figsize=(2 * 2 * num_cols, 2 * num_rows))
for i in range(num_images):
    plt.subplot(num_rows, 2 * num_cols, 2 * i + 1)
    plot_image(i, predictions[i], test_labels, test_images)
    plt.subplot(num_rows, 2 * num_cols, 2 * i + 2)
    plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

代码解释

  1. 数据加载与预处理:使用 keras.datasets.mnist.load_data() 加载 MNIST 数据集,将图像数据从二维矩阵转换为一维向量,并将像素值归一化到 0 - 1 之间。
  2. 模型构建:使用 keras.Sequential 构建一个简单的全连接神经网络,包含一个有 128 个神经元的隐藏层(使用 ReLU 激活函数)和一个有 10 个神经元的输出层(使用 Softmax 激活函数)。
  3. 模型编译:使用 model.compile 配置模型的优化器(Adam)、损失函数(sparse_categorical_crossentropy)和评估指标(准确率)。
  4. 模型训练:使用 model.fit 对模型进行训练,设置训练轮数为 5。
  5. 模型评估:使用 model.evaluate 评估模型在测试集上的性能。
  6. 预测与可视化:使用 model.predict 对测试集进行预测,并通过绘图函数可视化预测结果。

相关文章:

  • 实现两个SWC通过RTE通信(如“传感器SWC”发送数据→“控制算法SWC”处理)
  • DeepSeek R2要来了?“下一代推理王者”能否再掀AI浪潮?
  • C++ 17 允许在 for 循环,if 语句,switch 语句中初始化变量
  • VSCode如何备份与恢复 VSCode 插件
  • 智能图像处理平台:图片管理
  • 网络安全与等保2.0
  • springmvc热点面试题开胃菜
  • Redis 哈希(Hash)
  • Linux基础IO
  • 基于ai技术的视频生成工具
  • Jeecg-Boot 开放接口开发实战:在 Jeecg-Boot 的jeecg-system-biz中添加一个controller 实现免鉴权数据接口
  • 基于Apollo对配置类的热更新优化
  • qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系
  • C语言标准IO是什么?
  • ffmpeg-static 依赖详解
  • 给wordpress仪表盘添加自定义图标
  • B/B+树与mysql索引
  • 什么是“零日漏洞”(Zero-Day Vulnerability)?为何这类攻击被视为高风险威胁?
  • 009 rocketmq延时消息
  • 机器学习:监督学习、无监督学习和强化学习
  • 销售型网站设计/信息流广告接单平台
  • 大型网站建设建站模板/平台推广员是做什么的
  • 建平台跟建网站/搜狗网页版入口
  • 江门公司网站建设/学做网站培训班要多少钱
  • 网络营销策划心得体会/亚马逊seo什么意思
  • 澳环网站设计/如何制作网站教程