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

news/2025/9/20 9:24:48/文章来源:https://www.cnblogs.com/tlnshuju/p/19102019

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

2025-09-20 09:24  tlnshuju  阅读(0)  评论(0)    收藏  举报

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

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

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

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

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

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

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

1.2 神经网络的主要分类

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

按网络结构分类

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

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

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

Transformer 网络:

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

按学习范式分类

监督学习神经网络:

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

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

无监督学习神经网络:

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

强化学习神经网络:

  • 通过与环境的交互进行学习,根据环境反馈的奖励信号调整自身行为
  • 常用于机器人控制、游戏 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 具有以下核心优势:

在开始使用 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 ImageDataGenerator
train_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.mzph.cn/news/908224.shtml

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

相关文章

Web3 开发者修炼全图谱:从 Web2 走向 Web3 的实用的系统性学习指南

Web3 开发者修炼全图谱:从 Web2 走向 Web3 的实用的系统性学习指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

强化学习之父 Richard Sutton: 如今AI正进入“经验时代” - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 注解 - 实践

Java 注解 - 实践2025-09-20 08:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

安规对变压器的绝缘系统要求

安规对变压器的绝缘系统要求2025-09-20 08:54 斑鸠,一生。 阅读(0) 评论(0) 收藏 举报

嵌入式笔记系列——UART:TTL-UART、RS-232、RS-422、RS-485 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:医院高值耗材智能化管理路径分析(下)

实用指南:医院高值耗材智能化管理路径分析(下)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

Flutter应用自动更新系统:生产环境的挑战与解决方案

Flutter应用自动更新系统:生产环境的挑战与解决方案本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨Android应用自动更新的完整实现,包括GitHub Releases集成、APK安装、R8混淆问题处理等核心技术难点。项目…

.NET Core中使用SignalR

.NET Core中使用SignalR基本介绍 1.什么是signalRSignalR 是微软开发的一个开源库,它可以让服务器端代码能够即时推送内容到连接的客户端,用来简化向客户端应用程序添加实时功能的过程。大白话的意思就是微软搞了一个…

Django + Vue3 前后端分离工艺实现自动化测试平台从零到有系列 <第一章> 之 注册登录完成

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【保姆级教程】TEXTurePaper运行环境搭建与Stable Diffusion模型本地化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:修复Conda连接异常:CondaHTTPError HTTP 000 CONNECTION FAILED故障排除指南

实用指南:修复Conda连接异常:CondaHTTPError HTTP 000 CONNECTION FAILED故障排除指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

高级数据结构手册

LCA //exam:P3379 【模板】最近公共祖先(LCA) #include <iostream> #include <cstdio> #include <vector> #define int long long using namespace std; const int MAXN=5e5+5,MAXM=25; void dfs…

3634501 - [CVE-2025-42944] Insecure Deserialization vulnerability in SAP Netweaver (RMI-P4)

3634501 - [CVE-2025-42944] Insecure Deserialization vulnerability in SAP Netweaver (RMI-P4)Symptom Due to a deserialization vulnerability in SAP NetWeaver, an unauthenticated attacker could exploit the…

【无人艇协同】基于matlab面向海事安全的双体无人艇分布式协同任务规划(目标函数:总时间满意度)【含Matlab源码 14161期】博士论文 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:Unity 打包 iOS,Xcode 构建并上传 App Store

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:GitHub 热榜项目 - 日榜(2025-09-09)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:【Fiora深度解析】手把手教你用固定公网IP搭建专属聊天系统!

深入解析:【Fiora深度解析】手把手教你用固定公网IP搭建专属聊天系统!2025-09-20 08:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

使用JavaScript和CSS创建动态高亮导航栏

本文详细介绍了两种实现动态高亮导航栏的技术方案:第一种使用getBoundingClientRect方法精确计算元素位置和尺寸,第二种利用新兴的View Transition API简化动画实现。文章包含完整的代码示例和实际演示,适合前端开发…

wxt 开发浏览器插件的框架

wxt 开发浏览器插件的框架wxt 开发浏览器插件的框架 支持的特性支持所有浏览器 支持mv2 以及mv3 协议 开发模式支持热更新 基于文件的entrypoints 基于ts 开发 支持自动导入 自动发布 支持vue,react,svelte 等框架说…

Gridspech 全通关

You made it to the end of Gridspech. Thank you for playing!!A1A2A3A4A5A6A7A8A9A10A11A12A13A14