目录
基于 MATLAB 的循环神经网络(RNN)实例,用于序列分类任务。我们将使用一个简单的文本分类任务来演示如何构建和训练一个 RNN 模型。
步骤概述
- 加载数据集
- 数据预处理
- 定义网络结构
- 设置训练选项
- 训练模型
- 测试模型
详细步骤
1. 加载数据集
首先,我们需要加载一个文本分类数据集。假设我们有一个包含文本序列和标签的数据集 text_data.csv
。
Matlab
深色版本
% 加载数据集
data = readtable('text_data.csv');
sequences = data.Sequence;
labels = data.Label;
2. 数据预处理
对数据进行预处理,包括划分训练集和测试集、编码序列和标签等。
Matlab
深色版本
% 划分训练集和测试集
cvp = cvpartition(height(data), 'HoldOut', 0.2);
idx = cvp.test;
sequencesTrain = sequences(~idx);
labelsTrain = labels(~idx);
sequencesTest = sequences(idx);
labelsTest = labels(idx);
% 编码序列和标签
encoder = string2 categorical(sequencesTrain);
sequencesTrain = categorical(sequencesTrain, encoder);
sequencesTest = categorical(sequencesTest, encoder);
uniqueLabels = unique(labelsTrain);
labelsTrain = categorical(labelsTrain, uniqueLabels, 1:numel(uniqueLabels));
labelsTest = categorical(labelsTest, uniqueLabels, 1:numel(uniqueLabels));
3. 定义网络结构
接下来,我们定义一个简单的 RNN 结构。我们将使用 GRU(Gated Recurrent Unit)层,这是一种常用的 RNN 变体。
Matlab
深色版本
% 定义网络结构
inputSize = 1; % 输入特征数
numHiddenUnits = 200;
numClasses = numel(unique(labelsTrain));
layers = [
sequenceInputLayer(inputSize)
gruLayer(numHiddenUnits)
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer
];
4. 设置训练选项
定义训练选项,包括最大迭代次数、批量大小、初始学习率等。
Matlab
深色版本
options = trainingOptions('adam', ...
'MaxEpochs', 10, ...
'MiniBatchSize', 27, ...
'InitialLearnRate', 0.01, ...
'GradientThreshold', 1, ...
'Verbose', false, ...
'Plots', 'training-progress');
5. 训练模型
使用 trainNetwork
函数训练模型。
Matlab
深色版本
% 训练模型
net = trainNetwork(sequencesTrain, labelsTrain, layers, options);
6. 测试模型
加载测试数据并评估模型的性能。
Matlab
深色版本
% 进行预测
YPred = classify(net, sequencesTest);
% 计算准确率
accuracy = sum(YPred == labelsTest) / numel(labelsTest);
disp(['Test Accuracy: ', num2str(100 * accuracy), '%']);
完整代码
将上述代码段组合在一起,形成一个完整的 MATLAB 脚本:
Matlab
深色版本
% 加载数据集
data = readtable('text_data.csv');
sequences = data.Sequence;
labels = data.Label;
% 划分训练集和测试集
cvp = cvpartition(height(data), 'HoldOut', 0.2);
idx = cvp.test;
sequencesTrain = sequences(~idx);
labelsTrain = labels(~idx);
sequencesTest = sequences(idx);
labelsTest = labels(idx);
% 编码序列和标签
encoder = string2 categorical(sequencesTrain);
sequencesTrain = categorical(sequencesTrain, encoder);
sequencesTest = categorical(sequencesTest, encoder);
uniqueLabels = unique(labelsTrain);
labelsTrain = categorical(labelsTrain, uniqueLabels, 1:numel(uniqueLabels));
labelsTest = categorical(labelsTest, uniqueLabels, 1:numel(uniqueLabels));
% 定义网络结构
inputSize = 1; % 输入特征数
numHiddenUnits = 200;
numClasses = numel(unique(labelsTrain));
layers = [
sequenceInputLayer(inputSize)
gruLayer(numHiddenUnits)
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer
];
% 设置训练选项
options = trainingOptions('adam', ...
'MaxEpochs', 10, ...
'MiniBatchSize', 27, ...
'InitialLearnRate', 0.01, ...
'GradientThreshold', 1, ...
'Verbose', false, ...
'Plots', 'training-progress');
% 训练模型
net = trainNetwork(sequencesTrain, labelsTrain, layers, options);
% 进行预测
YPred = classify(net, sequencesTest);
% 计算准确率
accuracy = sum(YPred == labelsTest) / numel(labelsTest);
disp(['Test Accuracy: ', num2str(100 * accuracy), '%']);
数据集准备
假设你的 text_data.csv
文件内容如下:
深色版本
Sequence,Label
"hello world",positive
"good morning",positive
"bad day",negative
"not good",negative
...
运行代码
将上述代码保存为一个 .m
文件(例如 rnn_example.m
),然后在 MATLAB 中运行该文件。MATLAB 将加载数据集,训练模型,并评估模型在测试数据上的性能。
结果解释
- 训练进度图:MATLAB 会在训练过程中绘制训练进度图,显示训练损失和验证损失的变化。
- 测试准确率:训练完成后,代码会输出模型在测试数据上的准确率。
通过这个示例,你可以了解如何在 MATLAB 中构建和训练一个简单的循环神经网络(RNN)模型。