神经网络构成框架-理论学习

一、神经网络的基本组成与分类

1.1 神经网络的核心组成部分

神经网络是现代人工智能的基石,其设计灵感来源于生物神经系统的信息处理方式。作为工程师,了解神经网络的基本组成部分对于构建和优化模型至关重要。一个典型的神经网络主要由以下几个关键部分组成:
神经元: 也称为节点或单元,是神经网络的基本计算单元。每个神经元接收输入信号,通过加权求和和激活函数产生输出信号。神经元是神经网络的最小功能单位,通过不同的连接方式构成复杂的网络结构
层(Layers): 由多个神经元组成的集合,是神经网络的基本结构单元。神经网络通常由三种类型的层组成:

  • 输入层(Input Layer): 接收外部数据输入的神经元集合,输入层的神经元数目通常与输入数据的特征数目相同。输入层不包含任何权重或激活函数,其主要任务是接收原始输入数据并将其传递给神经网络的第一个隐藏层
  • 隐藏层(Hidden Layers): 位于输入层和输出层之间,负责对输入数据进行特征提取和转换。隐藏层可以有多层(构成深度神经网络),每层包含多个神经元。隐藏层是神经网络的核心部分,负责学习数据中的复杂模式和特征
  • 输出层(Output Layer): 生成最终预测结果的神经元集合。输出层的神经元数目取决于具体任务,如分类问题中类的数目。输出层使用特定的激活函数(如 softmax用于分类,线性激活用于回归)将神经网络的内部表示转换为最终预测结果

权重(Weights): 表示神经元之间连接的强度。每个连接都有一个权重,表示输入信号的重要性。权重是通过训练过程调整的关键参数,它们决定了神经网络从数据中学习到的知识
偏置(Biases): 每个神经元都有一个偏置项,用于调整激活函数的输入,从而控制输出信号。偏置有助于模型在没有输入信号时也能产生非零输出,增加了模型的灵活性
激活函数(Activation Functions): 将神经元的加权和输入转换为输出信号的函数,增加网络的非线性表达能力。常见的激活函数包括:

  • ReLU(Rectified Linear Unit): 当输入大于 0 时输出输入值,否则输出 0。ReLU 是深度学习中最常用的激活函数之一,能够有效缓解梯度消失问题

  • Sigmoid: 将输入映射到 (0, 1) 区间,常用于二分类问题的输出层

  • Tanh: 将输入映射到 (-1, 1) 区间,输出值以 0 为中心,通常比 sigmoid 表现更好

  • Softmax: 常用于多分类问题的输出层,将多个神经元的输出转换为概率分布

损失函数(Loss Function): 衡量神经网络预测输出与实际目标之间差异的函数。损失函数是优化过程的核心,常见的损失函数包括:

  • 均方误差(MSE,Mean Squared Error):常用于回归任务

  • 交叉熵(Cross Entropy)损失:常用于分类任务

  • 二进制交叉熵(Binary Cross Entropy):用于二分类任务

优化器(Optimizers): 用于调整神经网络权重和偏置的算法,以最小化损失函数。常见的优化器包括:

  • 梯度下降(Gradient Descent)及其变体(如随机梯度下降 SGD)

  • Adam:一种自适应学习率的优化器,是深度学习中最常用的优化器之一

  • RMSprop:另一种自适应学习率的优化器

前向传播(Forward Propagation): 数据从输入层经过隐藏层到输出层的过程。每层的神经元将输入信号进行加权求和,通过激活函数生成输出信号,传递到下一层。
反向传播(Backward Propagation): 通过计算损失函数相对于每个权重和偏置的梯度,逐层调整网络参数的过程。反向传播结合优化器,使得神经网络能够学习和改进。
正则化(Regularization): 防止过拟合的一些技术,如 L1 和 L2 正则化、Dropout 等,通过增加模型泛化能力提高性能。

1.2 神经网络的主要分类

神经网络可以根据不同的标准进行分类。以下是几种常见的分类方式:

按网络结构分类

前馈神经网络(Feedforward Neural Network, FNN):

  • 数据只能从输入层向前传播到输出层,没有反馈环路
  • 每层的神经元只与下一层的神经元相连,没有层内连接或跨层连接
  • 是最基础的神经网络类型,包括多层感知机(MLP)
  • 优点:结构简单,易于实现和训练;缺点:无法捕捉数据中的时序依赖关系

循环神经网络(Recurrent Neural Network, RNN):

  • 具有反馈环路,允许信息在网络中循环流动,使得网络可以记住之前的输入信息
  • 特别适合处理序列数据(如文本、语音、时间序列),能够捕捉数据中的时序依赖关系
  • 常见的变体包括长短期记忆网络(LSTM)和门控循环单元(GRU)
  • 缺点:训练过程中可能遇到梯度消失或爆炸问题,难以捕捉长距离依赖关系

卷积神经网络(Convolutional Neural Network, CNN):

  • 主要用于处理网格结构数据(如图像、音频),通过卷积层提取数据中的局部特征
  • 包含卷积层、池化层和全连接层等组件
  • 具有参数共享和局部连接的特点,大大减少了模型参数数量,提高了训练效率
  • 广泛应用于计算机视觉任务,如图像识别、目标检测、图像分割等

Transformer 网络:

  • 专为处理序列数据设计,特别是自然语言处理任务
  • 核心创新在于注意力机制,能够并行处理数据并捕捉长距离依赖关系
  • 与循环神经网络不同,Transformer 因并行处理数据而天然缺失词序理解能力,因此需要位置编码来提供序列中各词元的位置信息
  • 采用多头注意力机制,能够在不同语义维度上施加差异化关注,增强模型理解力
  • 广泛应用于机器翻译、文本摘要、语言模型等任务

状态空间模型(State Space Models, SSM):

  • 一种新兴的序列建模方法,结合了循环神经网络和状态空间建模的优势
  • 通过状态随时间演化的过程捕捉序列数据中的时序特征,能够有效建模长距离依赖,同时保持线性计算复杂度
  • 与传统 RNN 相比,具有更好的训练稳定性和更长的记忆能力
  • 代表性模型包括 Mamba、S4 等,在长序列任务中表现出色

按学习范式分类

监督学习神经网络:

  • 使用带标签的训练数据进行学习,模型的目标是最小化预测结果与真实标签之间的差异

  • 包括分类任务(如图像分类、文本分类)和回归任务(如房价预测、股票价格预测)

无监督学习神经网络:

  • 使用无标签的训练数据进行学习,模型的目标是发现数据中的潜在结构或模式
  • 常见任务包括聚类、降维、异常检测等

强化学习神经网络:

  • 通过与环境的交互进行学习,根据环境反馈的奖励信号调整自身行为
  • 常用于机器人控制、游戏 AI 等领域

按网络深度分类

浅层神经网络:

  • 通常指只有一个隐藏层的神经网络,也称为单层感知机
  • 表达能力有限,只能解决简单的线性可分问题

深层神经网络:

  • 具有多个隐藏层的神经网络,能够学习数据中的复杂非线性关系
  • 需要更复杂的训练技术和更多的数据,但具有更强的表达能力

1.3 神经网络的关键组件详解

神经元与感知机
神经元是神经网络的基本计算单元,灵感来源于生物神经元。感知机是最早的人工神经元模型,其计算方式为对输入特征进行加权求和后,再加上一个偏置值,最后通过激活函数输出。其数学表达式可写作:
在这里插入图片描述
其中,x_i为输入特征,w_i为权重,b为偏置,f为激活函数

层类型详解

输入层(Input Layer):

  • 接收外部数据输入的神经元集合
  • 输入层的神经元数目通常与输入数据的特征数目相同
  • 不包含任何权重或激活函数,仅负责将原始输入数据传递给下一层

全连接层(Fully Connected Layer/Dense Layer):

  • 每个神经元与上一层的每个神经元相连接,是最基本的神经网络层

  • 每个连接都有一个权重,通过激活函数进行非线性转换

  • 常用于深度神经网络的中间层,用于学习复杂的非线性关系,适用于图像分类、自然语言处理等任务

卷积层(Convolutional Layer):

  • 包含卷积核,用于在图像或序列数据上执行卷积操作,以检测局部特征

  • 通过参数共享和局部连接减少模型参数数量,提高计算效率

  • 主要用于计算机视觉任务,如图像识别、对象检测、图像分割。也可应用于序列数据处理,如文本分类

池化层(Pooling Layer):

  • 用于减小特征图的尺寸,通常采用最大池化或平均池化
  • 有助于减少计算量和提取重要特征
  • 在卷积神经网络(CNN)中,池化层常用于减少维度,改善模型的稳健性

循环层(Recurrent Layer):

  • 用于处理序列数据,可以捕获时间依赖性,包括简单循环层、LSTM 和 GRU

  • 特别适合处理文本、语音、时间序列等序列数据

  • 适用于自然语言处理、时间序列分析等需要考虑时间信息的任务

长短时记忆层(LSTM Layer)和门控循环单元层(GRU Layer):

  • 特殊类型的循环层,具有记忆单元和门控机制,可更好地处理长序列依赖性

  • LSTM 通过遗忘门、输入门和输出门控制信息流动,能够长期保存重要信息

  • GRU 是 LSTM 的简化版本,合并了遗忘门和输入门,结构更简单

  • 适用于文本生成、机器翻译、语音识别等任务

转置卷积层(Transpose Convolution Layer/Deconvolution Layer):

  • 用于将特征图的尺寸扩大,通常用于图像分割、图像生成和超分辨率任务

  • 在生成对抗网络(GAN)和语义分割网络中广泛应用

规范化层(Normalization Layer):

  • 用于规范神经元的输出,包括批量归一化(Batch Normalization)和层归一化(Layer Normalization)等
  • 有助于提高训练稳定性,加速收敛,并减少梯度消失问题
  • 广泛用于深度神经网络中

注意力层(Attention Layer):

  • 计算输入序列中各元素之间的注意力权重,使模型能够关注输入的不同部分

  • 是 Transformer 架构的核心组件,分为自注意力(Self-Attention)和交叉注意力(Cross-Attention)

  • 有助于模型捕捉长距离依赖关系,提高对关键信息的关注能力

多头注意力层(Multi-Head Attention Layer):

  • 并行运行多个注意力头,每个头捕捉数据中不同的关联模式

  • 突破单维注意力限制,使模型在处理数据时能基于不同语义维度施加差异化关注

  • 增强了模型的表达能力和理解能力

位置前馈网络(Position-wise Feed-Forward Network):

  • 由两个线性变换层及 ReLU 激活函数组成,独立作用于序列各位置

  • 精炼各位置的编码表征,提高模型的非线性表达能力

损失层(Loss Layer):

  • 用于计算神经网络的损失函数,衡量模型的性能并用于反向传播

  • 在训练神经网络时,损失层用于监督学习任务,如分类、回归和生成任务

二、使用 Keras 快速搭建神经网络

2.1 Keras 简介与环境设置

Keras 是一个高级神经网络 API,由 Python 语言编写,最初由 François Chollet 开发。它的设计理念是 “为人类设计的深度学习 API”,旨在提供一种简洁、直观且高效的方式来构建和训练神经网络模型。
Keras 具有以下核心优势:

  • 简洁的 API: Keras 的 API 设计简洁直观,大大降低了深度学习的入门门槛,使得用户可以快速实现想法。
  • 模块化设计: 模型由各种可配置的模块(层)组成,用户可以像搭积木一样轻松构建复杂的神经网络。
  • 多后端支持: Keras 3.0 版本支持 TensorFlow、PyTorch 和 JAX 三种不同的深度学习框架作为后端,用户可以根据需求选择最适合的框架。
  • 跨平台兼容性: 模型可以在 CPU、GPU、移动端和嵌入式设备上运行,具有良好的跨平台性能。
  • 丰富的文档和社区支持: Keras 拥有完善的官方文档和活跃的社区,用户可以轻松获取帮助和资源。

在开始使用 Keras 之前,需要先安装必要的软件包。推荐的安装方式是使用 pip 包管理器:

pip install tensorflow==2.13.0  # 选择稳定版本

2.2 使用 Keras 构建简单神经网络

Keras 提供了两种主要的模型构建方式:Sequential APIFunctional API。以下将分别介绍这两种方法。
Sequential API:线性堆叠模型
Sequential API 是构建简单线性堆叠模型的首选方式,适用于大多数前馈神经网络结构。
步骤 1:导入必要的库

from tensorflow.keras import models, layers

步骤 2:创建 Sequential 模型

model = models.Sequential(name="我的第一个神经网络")

步骤 3:添加网络层

# 添加输入层和第一个隐藏层
model.add(layers.Dense(64, activation='relu', input_shape=(28, 28)))# 添加第二个隐藏层
model.add(layers.Dense(32, activation='relu'))# 添加输出层(假设是一个10类分类任务)
model.add(layers.Dense(10, activation='softmax'))

步骤 4:编译模型
在训练模型之前,需要指定优化器损失函数评估指标

model.compile(optimizer='adam',#指定优化器loss='sparse_categorical_crossentropy',#损失函数metrics=['accuracy']#评估指标
)

步骤 5:训练模型

history = model.fit(x_train, y_train,#输入数据,目标值epochs=10,#训练集被遍历的次数batch_size=32,#每次模型更新所使用的样本数量validation_split=0.2#划分出 20% 的数据作为验证集
)

步骤 6:评估模型

test_loss, test_accuracy = model.evaluate(x_test, y_test)
print(f"测试损失: {test_loss:.4f}")
print(f"测试准确率: {test_accuracy:.4f}")

步骤 7:使用模型进行预测

predictions = model.predict(x_test)
predicted_class = tf.argmax(predictions, axis=-1).numpy()
print("预测结果:", predicted_class)

Functional API:复杂网络结构
当需要构建更复杂的网络结构(如多输入、多输出、分支结构等)时,Functional API 提供了更大的灵活性。

步骤 1:定义输入层

from tensorflow.keras import Input# 定义输入层,假设输入数据是28x28的图像
input_layer = Input(shape=(28, 28), name="输入层")

步骤 2:添加网络层

# 第一个隐藏层
x = layers.Dense(64, activation='relu')(input_layer)# 第二个隐藏层
x = layers.Dense(32, activation='relu')(x)# 输出层
output_layer = layers.Dense(10, activation='softmax', name="输出层")(x)

步骤 3:创建模型

model = models.Model(inputs=input_layer, outputs=output_layer, name="我的复杂模型")

步骤 4:编译、训练和评估模型

编译、训练和评估步骤与 Sequential API 类似。
Functional API 的优势在于可以创建更复杂的网络结构,例如:

  • 多输入模型:
# 定义两个输入
input1 = Input(shape=(100,))
input2 = Input(shape=(200,))# 处理每个输入
x1 = layers.Dense(64, activation='relu')(input1)
x2 = layers.Dense(32, activation='relu')(input2)# 合并两个输入的特征
merged = layers.concatenate([x1, x2])# 添加输出层
output = layers.Dense(10, activation='softmax')(merged)# 创建模型
model = models.Model(inputs=[input1, input2], outputs=output)
  • 多输出模型:
# 定义输入
input_layer = Input(shape=(28, 28))# 共享隐藏层
x = layers.Dense(64, activation='relu')(input_layer)
x = layers.Dense(32, activation='relu')(x)# 两个不同的输出层
output1 = layers.Dense(10, activation='softmax', name="分类输出")(x)
output2 = layers.Dense(1, activation='sigmoid', name="回归输出")(x)# 创建模型
model = models.Model(inputs=input_layer, outputs=[output1, output2])

2.3 Keras 常用层详解

Keras 提供了丰富的层类型,以下是一些最常用的层及其应用场景:

核心层

Dense 层: 全连接层,每个神经元与上一层的每个神经元相连,是最基础的神经网络层。常用于处理向量数据,如分类、回归任务的隐藏层或输出层。

# 创建一个具有64个神经元,使用ReLU激活函数的全连接层
dense_layer = layers.Dense(units=64, activation='relu')

Input 层: 定义模型的输入,通常不需要显式创建,而是通过Input()函数定义输入形状。

# 定义一个形状为(28, 28)的输入层
input_layer = Input(shape=(28, 28))

Flatten 层: 将多维输入展平为一维,常用于从卷积层过渡到全连接层。

# 创建展平层
flatten_layer = layers.Flatten()

卷积层

Conv2D 层: 二维卷积层,主要用于处理图像数据,通过卷积操作提取局部特征。

# 创建一个具有32个3x3卷积核的卷积层
conv_layer = layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu')

MaxPooling2D 层: 二维最大池化层,通过取窗口内的最大值来下采样特征图。

# 创建2x2的最大池化层
pool_layer = layers.MaxPooling2D(pool_size=(2, 2))

Conv1D 层: 一维卷积层,用于处理序列数据,如文本或时间序列。
Conv3D 层: 三维卷积层,用于处理体积数据,如医学图像或视频。

循环层

LSTM 层: 长短期记忆网络层,用于处理序列数据,能够学习长期依赖关系。

# 创建一个具有128个单元的LSTM层
lstm_layer = layers.LSTM(units=128, return_sequences=True)

GRU 层: 门控循环单元层,是 LSTM 的简化版本,结构更简单但仍能有效捕捉序列中的长期依赖。
SimpleRNN 层: 简单循环神经网络层,适用于简单的序列任务,但难以捕捉长距离依赖。

规范化和正则化层

BatchNormalization 层: 批量归一化层,对前一层的输出进行批量归一化,加速训练并提高模型稳定性。

# 创建批量归一化层
bn_layer = layers.BatchNormalization()

Dropout 层: 随机失活层,训练过程中随机将部分神经元输出设为 0,防止过拟合。

# 创建一个丢弃率为0.5的Dropout层
dropout_layer = layers.Dropout(rate=0.5)

LSTM 层: 长短期记忆网络层,用于处理序列数据,能够学习长期依赖关系。

特殊用途层

Embedding 层: 嵌入层,将正整数(索引)转换为固定大小的密集向量,常用于自然语言处理任务。

# 创建嵌入层,词汇表大小为1000,输出维度为64
embedding_layer = layers.Embedding(input_dim=1000, output_dim=64)

GlobalAveragePooling2D 层: 全局平均池化层,对特征图的每个通道取平均值,将空间维度压缩为 1,常用于替代 Flatten 层。
Concatenate 层: 拼接层,将多个张量在某个维度上拼接,用于合并不同分支的特征。
Lambda 层: 自定义层,允许用户定义任意可微分的操作作为一个层,增加了模型的灵活性。

2.4 模型编译与训练技巧

在 Keras 中,模型的编译和训练是模型开发过程中的关键步骤。以下详细介绍相关参数和技巧:

编译模型

在编译模型时,需要指定优化器、损失函数和评估指标:

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy']
)

优化器选择:

  • Adam: 默认的优化器选择,适用于大多数情况,具有自适应学习率的特点。
  • SGD: 随机梯度下降,需要手动调整学习率和动量参数,适用于大规模数据集和复杂模型。
  • RMSprop: 均方根传播,适用于循环神经网络和某些类型的卷积神经网络。
  • Adagrad和Adadelta: 自适应学习率优化器,适用于数据稀疏的情况。

损失函数选择:

  • 分类任务: 使用交叉熵损失,如sparse_categorical_crossentropy(适用于整数标签)或categorical_crossentropy(适用于独热编码标签)。
  • 二分类任务: 使用binary_crossentropy。
  • 回归任务: 使用均方误差(MSE)或平均绝对误差(MAE)。

评估指标:

  • 分类任务: 常用accuracy作为评估指标。
  • 回归任务: 常用mae(平均绝对误差)或mse(均方误差)。
  • 多标签分类: 可以使用precision、recall和AUC等指标。

训练模型

训练模型的主要函数是model.fit(),其关键参数包括:

history = model.fit(x_train, y_train,epochs=10,batch_size=32,validation_split=0.2,callbacks=[...],verbose=1
)

训练数据参数:
x_train: 输入数据,可以是 NumPy 数组、TensorFlow 数据集或其他兼容格式。
y_train: 目标数据,与输入数据对应。
batch_size: 每次迭代使用的样本数量。较大的 batch_size 可能会加快训练速度,但会消耗更多内存;较小的 batch_size 可能会导致训练不稳定,但能更有效地利用内存。
训练配置参数:
epochs: 训练的轮数,即整个数据集被训练的次数。需要注意的是,过多的训练轮数可能导致过拟合。
validation_split: 从训练数据中划分出的验证集比例(0 到 1 之间的浮点数)。
validation_data: 显式指定验证数据(x_val, y_val),如果指定了该参数,validation_split将被忽略。

回调函数(Callbacks):

回调函数是在训练过程中执行的一系列操作,可以用于监控训练过程、提前终止训练、保存模型等。常用的回调函数包括:
EarlyStopping: 当验证损失在指定的轮数内不再改善时,自动停止训练,防止过拟合。

tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)

ModelCheckpoint: 在训练过程中保存模型,通常保存验证损失最低的模型。

tf.keras.callbacks.ModelCheckpoint('best_model.h5', save_best_only=True)

TensorBoard: 用于可视化训练过程中的各种指标和模型结构。

tf.keras.callbacks.TensorBoard(log_dir='./logs')

LearningRateScheduler: 动态调整学习率,根据训练进度自动调整学习率大小。

tf.keras.callbacks.LearningRateScheduler(schedule)

ReduceLROnPlateau: 当验证损失停止改善时,自动降低学习率。

tf.keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=3)

训练技巧:

  1. 数据预处理: 对输入数据进行标准化或归一化处理,有助于加速训练过程并提高模型性能。对于图像数据,通常将像素值缩放到 [0, 1] 区间;对于数值特征,通常进行标准化处理。
  2. 过拟合处理:
    • 添加 Dropout 层,随机失活部分神经元。
    • 使用 L1 或 L2 正则化,约束模型参数的大小。
    • 增加训练数据量或使用数据增强技术(针对图像数据)。
    • 提前终止训练(EarlyStopping)。
  3. 学习率调整: 使用自适应学习率优化器(如 Adam)或动态调整学习率的回调函数,有助于找到更优的参数空间。
  4. 批量归一化: 在网络中添加 BatchNormalization 层,有助于加速训练并提高模型的泛化能力。
  5. 使用预训练模型: 在大规模数据集上预训练的模型可以作为当前任务的起点,特别是在数据有限的情况下,迁移学习可以显著提高模型性能。

三、神经网络应用实战

3.1 图像识别实战:MNIST 数字识别

MNIST 是一个经典的图像识别数据集,包含手写数字 0-9 的灰度图像,常用于图像识别任务的入门示例。以下是使用 Keras 实现 MNIST 数字识别的完整步骤。
步骤 1:导入必要的库

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt

步骤 2:加载和预处理数据

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 数据预处理
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0  # 归一化并增加通道维度
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0# 转换标签为独热编码
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

步骤 3:构建 CNN 模型
使用卷积神经网络(CNN)构建 MNIST 识别模型:

model = models.Sequential([layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(64, activation='relu'),layers.Dense(10, activation='softmax')
])

其结构如下

输入层 (28, 28, 1)  →  卷积层132(3,3)卷积核,ReLU激活↓池化层1(2,2)最大池化  →  卷积层264(3,3)卷积核,ReLU激活↓池化层2(2,2)最大池化  →  卷积层364(3,3)卷积核,ReLU激活↓扁平化(Flatten)  →  全连接层164个神经元,ReLU激活↓输出层:10个神经元,softmax激活(对应10类分类)

步骤 4:编译模型

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy']
)

步骤 5:训练模型

history = model.fit(x_train, y_train,epochs=5,batch_size=64,validation_split=0.2
)

步骤 6:评估模型

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"测试损失: {test_loss:.4f}")
print(f"测试准确率: {test_acc:.4f}")

步骤 7:可视化结果

# 显示训练过程中的损失和准确率变化
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('训练和验证损失')
plt.xlabel('轮数')
plt.ylabel('损失')
plt.legend()
plt.show()plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('训练和验证准确率')
plt.xlabel('轮数')
plt.ylabel('准确率')
plt.legend()
plt.show()# 显示部分测试图像及其预测结果
predictions = model.predict(x_test[:10])
for i in range(10):plt.subplot(2, 5, i+1)plt.imshow(x_test[i].reshape(28, 28), cmap='gray')plt.title(f"预测: {tf.argmax(predictions[i])}")plt.axis('off')
plt.show()

在 MNIST 数据集上,一个设计良好的 CNN 模型通常可以达到 99% 以上的测试准确率,显著优于传统的机器学习方法。

3.2 自然语言处理实战:IMDb 影评分类

IMDb 影评分类是一个经典的文本分类任务,需要将影评分为正面和负面两类。以下是使用 Keras 实现 IMDb 影评分类的完整步骤。
步骤 1:导入必要的库

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences

步骤 2:加载和预处理数据

# 加载IMDb数据集,只保留最常见的10000个单词
vocab_size = 10000
max_len = 500  # 每个影评最多保留500个单词
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=vocab_size)# 对序列进行填充,使所有序列长度一致
x_train = pad_sequences(x_train, maxlen=max_len)
x_test = pad_sequences(x_test, maxlen=max_len)

步骤 3:构建 LSTM 模型
使用循环神经网络(LSTM)构建影评分类模型:

model = models.Sequential([layers.Embedding(vocab_size, 128),layers.LSTM(64, dropout=0.2, recurrent_dropout=0.2),layers.Dense(64, activation='relu'),layers.Dropout(0.5),layers.Dense(1, activation='sigmoid')
])

其结构如下

输入数据(文本序列)↓
【Embedding 层】
- 输入维度:vocab_size(词汇表大小)
- 输出维度:128(词向量维度)↓
【LSTM 层】
- 隐藏单元数:64
- dropout:0.2(输入 dropout)
- recurrent_dropout:0.2(循环状态 dropout)↓
【Dense 层】
- 神经元数:64
- 激活函数:relu↓
【Dropout 层】
- 丢弃率:0.5↓
【输出 Dense 层】
- 神经元数:1
- 激活函数:sigmoid(用于二分类输出,输出值在 0-1 之间)↓
输出结果(二分类概率)

步骤 4:编译模型

model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy']
)

步骤 5:训练模型

history = model.fit(x_train, y_train,epochs=5,batch_size=64,validation_split=0.2
)

步骤 6:评估模型

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"测试损失: {test_loss:.4f}")
print(f"测试准确率: {test_acc:.4f}")

步骤 7:可视化结果

# 显示训练过程中的损失和准确率变化
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('训练和验证损失')
plt.xlabel('轮数')
plt.ylabel('损失')
plt.legend()
plt.show()plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('训练和验证准确率')
plt.xlabel('轮数')
plt.ylabel('准确率')
plt.legend()
plt.show()

在 IMDb 影评分类任务中,使用 LSTM 网络通常可以达到 85% 以上的测试准确率。如果使用更复杂的模型(如 Transformer)或进行更精细的超参数调优,性能还可以进一步提高。

3.3 时间序列预测实战:股票价格预测

时间序列预测是另一个重要的应用领域,以下以股票价格预测为例,展示如何使用 Keras 构建时间序列预测模型。
步骤 1:导入必要的库

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers, models
from sklearn.preprocessing import MinMaxScaler

步骤 2:加载和预处理数据

# 加载股票数据(假设数据保存在CSV文件中,包含'date'和'close'列)
df = pd.read_csv('stock_data.csv', parse_dates=['date'], index_col='date')
data = df[['close']].values# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(data)# 创建时间序列数据集
def create_dataset(data, lookback=60):X, Y = [], []for i in range(lookback, len(data)):X.append(data[i-lookback:i, 0])Y.append(data[i, 0])return np.array(X), np.array(Y)lookback = 60  # 使用过去60天的数据预测下一天的价格
X, Y = create_dataset(data_scaled, lookback)# 划分训练集和测试集
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
Y_train, Y_test = Y[:train_size], Y[train_size:]# 调整输入形状以适应LSTM层的要求(样本数,时间步数,特征数)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

步骤 3:构建 LSTM 模型

model = models.Sequential([layers.LSTM(50, activation='relu', input_shape=(lookback, 1)),layers.Dense(1)
])

步骤 4:编译模型

model.compile(optimizer='adam',loss='mean_squared_error'
)

步骤 5:训练模型

history = model.fit(X_train, Y_train,epochs=20,batch_size=32,validation_split=0.2
)

步骤 6:评估模型

test_loss = model.evaluate(X_test, Y_test)
print(f"测试损失(MSE): {test_loss:.4f}")

步骤 7:进行预测

# 预测测试集
predictions = model.predict(X_test)# 反归一化预测结果
predictions = scaler.inverse_transform(predictions)
Y_test_actual = scaler.inverse_transform([Y_test])# 计算均方根误差(RMSE)
rmse = np.sqrt(np.mean((predictions - Y_test_actual)**2))
print(f"RMSE: {rmse:.4f}")

步骤 8:可视化结果

# 绘制实际值和预测值的对比
plt.figure(figsize=(10, 6))
plt.plot(Y_test_actual[0], label='实际价格')
plt.plot(predictions, label='预测价格')
plt.title('股票价格预测')
plt.xlabel('时间')
plt.ylabel('价格')
plt.legend()
plt.show()

时间序列预测是一个具有挑战性的任务,股票价格预测尤其困难,因为市场受到多种因素的影响。上述模型只是一个简单的示例,可以通过增加模型复杂度、调整超参数或添加更多特征来提高预测性能。

3.4 高级应用:使用预训练模型进行迁移学习

迁移学习是深度学习中一种强大的技术,它允许我们使用在大规模数据集上预训练好的模型作为起点,然后针对特定任务进行微调。以下以图像分类为例,展示如何使用 Keras 中的预训练模型进行迁移学习。
步骤 1:导入必要的库

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

步骤 2:加载预训练模型

# 加载预训练的ResNet50模型,不包含顶层的全连接层
base_model = ResNet50(weights='imagenet',include_top=False,input_shape=(224, 224, 3)
)# 冻结基础模型的参数,使其在训练过程中不被更新
base_model.trainable = False

步骤 3:添加自定义分类头

# 在基础模型上添加自定义的分类头
model = models.Sequential([base_model,layers.GlobalAveragePooling2D(),layers.Dense(256, activation='relu'),layers.Dropout(0.5),layers.Dense(10, activation='softmax')  # 假设是10类分类任务
])

步骤 4:编译模型

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy']
)

步骤 5:准备数据
假设我们有一个自定义的图像数据集,需要将其预处理为模型所需的格式:

# 假设数据集已经按照类别组织在不同的文件夹中
# 使用ImageDataGenerator进行数据增强和预处理
from tensorflow.keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True
)val_datagen = ImageDataGenerator(preprocessing_function=preprocess_input)train_generator = train_datagen.flow_from_directory('train_dir',target_size=(224, 224),batch_size=32,class_mode='categorical'
)val_generator = val_datagen.flow_from_directory('val_dir',target_size=(224, 224),batch_size=32,class_mode='categorical'
)

步骤 6:训练模型

history = model.fit(train_generator,epochs=10,validation_data=val_generator
)

步骤 7:评估模型

test_generator = val_datagen.flow_from_directory('test_dir',target_size=(224, 224),batch_size=32,class_mode='categorical',shuffle=False
)test_loss, test_acc = model.evaluate(test_generator)
print(f"测试损失: {test_loss:.4f}")
print(f"测试准确率: {test_acc:.4f}")

步骤 8:微调模型(可选)
在初步训练完成后,可以选择解冻部分基础模型的层进行微调,以进一步提高性能:

# 解冻基础模型的顶层
base_model.trainable = True
fine_tune_at = 100  # 从第100层开始解冻for layer in base_model.layers[:fine_tune_at]:layer.trainable = False# 重新编译模型,使用较低的学习率
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),loss='categorical_crossentropy',metrics=['accuracy']
)# 继续训练模型
history_fine = model.fit(train_generator,epochs=20,initial_epoch=history.epoch[-1],validation_data=val_generator
)

通过迁移学习,可以在较小的数据集上取得比从头训练更好的性能,特别是在数据有限的情况下。Keras 提供了多种预训练模型,包括 ResNet、VGG、Inception 等,可以根据任务需求选择合适的模型。

四、小结

神经网络作为深度学习的核心技术,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性进展。从简单的感知机到复杂的 Transformer 网络,神经网络的发展历程展示了人类对智能系统的不懈探索。
Keras 作为一个简洁、高效的深度学习 API,大大降低了神经网络开发的门槛,使得更多人能够参与到 AI 技术的研究和应用中。通过 Keras,工程师可以快速构建和训练各种类型的神经网络模型,实现从研究到生产的快速迭代。
学习神经网络是一个持续的过程,需要我们坚定不移的持续努力向前推进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96337.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0开始开发app(AI助手版)-架构及环境搭建

架构选择 前端React Native 后端Firebase 原因 环境准备 安装node 安装JDK 命令行工具:Node.js command prompt命令行查询Javav版本:javac -version使用nrm工具切换淘宝源:npx nrm use taobao安装yarn,替代npm下载工具&#x…

【性能测试】Jmeter工具快速上手-搭建压力测试脚本

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 概念 性能测试是软件测试的重要分支,核心目标是通过模拟真实业务场景和负载压力,评估系统在不同条件下的性能表现,发现系统性…

oracle里的int类型

oracle里的int类型 在 ANSI SQL 标准 中,INTEGER 和 SMALLINT 是定义好的精确数值类型,但它们的 “长度”或“大小”并不是通过 (N) 括号来指定的(如 INT(4)),这一点与 MySQL 等数据库的非标准扩展完全不同。 SMALLI…

前端学习之后端java小白(二)-sql约束/建表

一、约束SQL约束(Constraints)是用于限制表中数据的规则,确保数据的完整性和准确性。以下是主要的SQL约束类型: 主要约束类型: 1. NOT NULL 约束: 确保列不能包含空值 CREATE TABLE users (id INT NOT NULL,name VARC…

OpenCV:图像金字塔

文章目录一、什么是图像金字塔?二、图像金字塔的核心操作:采样与逆采样1. 向下采样(pyrDown):从高分辨率到低分辨率步骤1:高斯滤波步骤2:删除偶数行与偶数列OpenCV实战代码效果特点2. 向上采样&…

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS?二、四层(L4)负载均衡的最佳解决方案是什么?2.1解决方案分类与对比(负载均衡的三种方式介绍)2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker:如果将kafka比喻成数据仓库网络,那么Broker就是网络中的仓库节点,比如快递站,在该节点内可以独立运行,并且多个Broker可以连接起来,构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置,往往决定成败。在软件开发的世界里,环境变量就像是一位无声的指挥家,默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言,正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示,基于示例代码逻辑,结合格式兼容性、功能实现步骤及多样化显示方式,适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树(排序树)1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…

LeetCode 刷题【73. 矩阵置零】

73. 矩阵置零 自己做 解&#xff1a;标记消除 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {vector<bool> x(matrix.size(), false); //要置0的行vector<bool> y(matrix[0].size(), false); //…

Unity学习----【进阶】TextMeshPro学习(一)--基础知识点

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.导入TextMeshPro 对于新创建的工程&#xff0c;可以直接在这里导入TMP必要的资源&#xff08;上面&#xff09;&#xff0c;以及TMP的实例和扩展&#xff08;下面&#xff09; 导入之…

BigDecimal(用于处理超出double范围的浮点数)

BigDecimal 是 Java 中 java.math 包提供的高精度十进制浮点数类&#xff0c;专为解决基本类型&#xff08;float/double&#xff09;的精度缺陷而设计&#xff0c;广泛用于金融、科学计算等对精度要求极高的场景。以下从核心特性、使用方法、常见问题对比、注意事项等方面详细…

Nginx 优化

文章目录1、隐藏版本号2、修改用户与组3、缓存时间4、日志切割5、连接超时6、更改进程数7、配置网页8、防盗链1、隐藏版本号 隐藏nginx的版本号&#xff0c;为了防止恶意用户利用已知漏洞进行攻击 ## 查看版本号 curl -I http://192.168.10.23方法一&#xff1a;修改配置文件…

基于多模态与主动学习的车船飞机图像识别系统研究与应用技术方案

技术方案 一、技术背景与研究现状 图像识别是计算机视觉的核心任务之一&#xff0c;随着深度学习的发展&#xff0c;基于 卷积神经网络&#xff08;CNN&#xff09; 与 视觉Transformer&#xff08;ViT&#xff09; 的图像分类方法已成为主流。 根据《图像分类技术选型——截止…

Word2Vec词嵌入技术和动态词嵌入技术

Word2Vec&#xff08;Word to Vector&#xff09;是 2013 年由 Google 团队提出的无监督词嵌入模型&#xff0c;是一种静态词嵌入技术&#xff0c;核心目标是将自然语言中的离散词汇映射为低维、稠密的实数向量&#xff08;即 “词向量”&#xff09;&#xff0c;让向量空间的距…

Netty从0到1系列之Netty逻辑架构【上】

文章目录一、Netty逻辑架构【上】1.1 网络通信层1.1.1 BootStrap & ServerBootStrap1. ✅核心方法链与配置2. ✅ 架构与流程3. ✅ 底层实现与原理分析4. ✅ 实践经验与总结1.1.2 Channel1.2 事件调度层1.2.1 事件调度层概述1.2.2 EventLoop【事件循环】1.2.3 EventLoopGrou…

Spring Cloud 高频面试题详解(含代码示例与深度解析)

文章目录Spring Cloud 高频面试题详解&#xff08;含代码示例与深度解析&#xff09;1. 什么是 Spring Cloud&#xff1f;它与 Spring Boot 有什么关系&#xff1f;2. 服务发现&#xff1a;Eureka 和 Nacos 的区别与选型&#xff1f;Eureka 示例与原理Eureka vs Nacos 对比表3.…

Ascend310B重构驱动run包

在Atlas 200I AI加速模块(Ascend310B)移植过程中如需要将自己编译的Image、dt.img及内核模块打包到启动镜像包中需要对"Ascend-hdk-310b-npu-driver-soc_<version>_linux-aarch64.run"(下面统称驱动run包)进行重构。下面将介绍如何重构run包。 重构驱动run包需…

Leecode hot100 - 287. 寻找重复数

题目描述 287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…