趋近智
循环神经网络 (neural network) (RNN)按顺序处理信息,并保持一个内部状态或记忆。这种设计使它们非常适合处理涉及序列的任务,例如文本分析或时间序列预测。然而,与其它神经网络一样,RNN对数值数据进行操作,特别是张量。原始序列数据,无论是充满词语的句子,还是随时间变化的温度读数列表,都需要在RNN处理之前转换为这种数值格式。这一准备步骤对于模型训练成功来说极其重要。
让我们来看看准备两种主要序列数据类型的常见方法:文本和时间序列。
文本数据需要经过几个步骤,才能将句子或文档转换为适合SimpleRNN、LSTM或GRU等RNN层的数值序列。
第一步是分词,它涉及将文本分解成称为词元 (token)的较小单元。这些词元通常是单词,但根据任务和所需的细粒度,它们也可以是字符或子词 (subword)单元。
例如,句子“Keras makes deep learning easy.”可以被分词为单词:["Keras", "makes", "deep", "learning", "easy", "."]。
Keras 提供了一些实用工具,例如在keras.preprocessing.text中(或者在与TensorFlow/PyTorch后端集成的较新Keras版本中可能是keras.layers.TextVectorization)找到的Tokenizer类,用于高效处理此过程。
from keras.preprocessing.text import Tokenizer
sentences = [
"Keras makes deep learning easy.",
"RNNs are great for sequences."
]
# 初始化分词器
# num_words 限制词汇表大小为最常出现的词
tokenizer = Tokenizer(num_words=100)
# 根据句子构建词汇表
tokenizer.fit_on_texts(sentences)
# 分词器现在拥有一个 word_index 字典
print(tokenizer.word_index)
# 输出(示例):{'keras': 1, 'makes': 2, 'deep': 3, 'learning': 4, 'easy': 5,
# 'rnns': 6, 'are': 7, 'great': 8, 'for': 9, 'sequences': 10}
分词 (tokenization)后,我们需要构建一个词汇表:将每个词元 (token)(单词)唯一映射到整数索引。Tokenizer 在 fit_on_texts 步骤中自动处理此项。word_index 属性存储此映射。
一个常见做法是保留索引0用于填充(接下来讨论),并可能保留另一个索引用于“词汇表外”(OOV)词元。这些是在处理过程中遇到的、未出现在用于构建词汇表的训练文本中的词语。
拟合分词器 (tokenizer)后,您可以使用 texts_to_sequences 方法将文本序列转换为整数序列。
# 将句子转换为整数序列
sequences = tokenizer.texts_to_sequences(sentences)
print(sequences)
# 输出(基于之前的示例):[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
# 注意:标点符号的处理方式可能因分词器设置而异。
“循环神经网络 (neural network) (RNN),尤其是在为了提高效率而批量处理时,要求输入序列具有统一的长度。然而,句子或文档很少具有相同数量的单词。我们通过使用填充来解决这个问题。”
填充涉及向较短的序列添加一个特殊的填充词元 (token)(通常用整数0表示),直到它们达到指定的最大长度(maxlen)。您可以在序列的开头(pre)或结尾(post)添加填充。后置填充通常更受青睐,因为它允许RNN首先处理序列的初始部分,而不会被填充值所主导。
Keras 为此提供了 pad_sequences 实用工具。
from keras.preprocessing.sequence import pad_sequences
# 假设 'sequences' 是上一步得到的整数序列列表
# [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
# 定义最大序列长度(可以从数据中确定或手动设置)
maxlen = 8
# 填充序列
padded_sequences = pad_sequences(sequences, maxlen=maxlen, padding='post')
print(padded_sequences)
# 输出:
# [[ 1 2 3 4 5 0 0 0]
# [ 6 7 8 9 10 0 0 0]]
这些填充后的整数序列现在已接近准备完成。通常,模型架构内的下一步是使用 Embedding 层。该层以这些整数序列作为输入,并将每个整数索引转换为固定大小(嵌入 (embedding)维度)的密集向量 (vector) (dense vector)。这些密集向量捕捉词语之间的语义关系,并在模型训练期间进行学习。我们在此不详细说明 Embedding 层,但了解这些填充后的整数序列是大多数使用RNN的自然语言处理模型中此类层的直接输入,这是很重要的。
时间序列数据,例如股票价格、传感器读数或随时间变化的 L气象测量值,需要不同的准备方法。
神经网络 (neural network)通常在输入数值数据特征被缩放到标准范围时表现更好。特征之间的大幅波动或不同尺度会阻碍学习过程。常见方法包含:
您应该仅在训练数据上拟合缩放器(例如,Scikit-learn 中的 MinMaxScaler 或 StandardScaler),然后使用拟合好的缩放器转换训练和验证/测试数据。这可以防止信息从验证/测试集泄漏到训练过程中。
循环神经网络 (neural network) (RNN)从序列中学习。对于时间序列,我们需要将连续数据重构为固定长度的输入序列(窗口)和相应的目标值。
设想一个时间序列 。我们可以通过使用一个过去值的窗口来预测未来值,从而创建监督学习 (supervised learning)示例。如果我们选择3个时间步的窗口大小(或回溯期)来预测下一个时间步的值,我们将生成如下对:
这一过程本质上将时间序列预测问题转换为一个监督学习问题,在该问题中,模型学习将一系列过去的观测值映射到未来的观测值。
使用大小为3的回溯窗口,从时间序列创建输入序列(窗口)和相应目标。
您可以使用简单的Python循环或更高效地使用NumPy或Pandas等库来实现此窗口化逻辑。
准备好后(对于文本数据:分词 (tokenization)/编码/填充;对于时间序列数据:归一化 (normalization)/窗口化),数据需要正确整形以适应Keras RNN层。这些层通常期望输入数据采用3D张量格式:
(batch_size, timesteps, features)
让我们分解一下:
batch_size:在训练或推理 (inference)期间一次性处理的序列数量。在使用fit等方法时,Keras通常会隐式处理此维度。timesteps:每个序列的长度。
最大长度(maxlen)。features:每个时间步表示输入的特征数量。
Embedding层的整数编码文本数据,这通常是1(整数索引本身)。Embedding层随后将其扩展到嵌入 (embedding)维度。例如:
Embedding层,其形状将是(32, 50, 1)。(尽管通常会省略最后一个维度,Keras会推断它,或者Embedding层直接处理(32, 50)的形状)。(64, 10, 3)。理解这种预期的输入形状在构建Keras模型和确保数据管道正确馈送RNN层时非常重要。通过分词、编码、填充、归一化和窗口化正确准备序列数据,为训练有效的循环神经网络 (neural network) (RNN)奠定基础。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•