CNN-RNN 通用分类 MATLAB 试用版

试用版功能限制：
- 最多处理100条样本，超限直接停止，不会截断后继续训练。
- 最多两层卷积，rnnHidden最大64，maxEpochs最大30。
- 试用版开放LSTM和GRU；BiLSTM及更多训练能力在完整版开放。
- 五张结果图均带“试用版@khsci.com/docs”中央水印。

一、运行环境

试用版 .p 文件按 R2022a 兼容格式生成，需使用 MATLAB R2022a 或更新版本；推荐 R2024a。需要 Deep Learning Toolbox。
在 MATLAB 中打开本文件夹，将其设为当前文件夹后即可运行 demo。

二、程序文件

1. demoCNNRNNClassIris.m
一维数组分类案例。输入 X 为“样本数×特征长度”，使用 Iris 三分类数据。

2. demoCNNRNNClassHAR.m
多通道序列分类案例。输入 X 为“样本数×通道数×时间长度”，使用 UCI HAR 六种人体活动数据。训练、验证、测试按照受试者隔离，避免同一个人的相似片段同时出现在不同集合。

3. demoCNNRNNClassMNIST.m
二维灰度图分类案例。输入 X 为“样本数×高度×宽度”，把图像沿宽度方向逐列读入 CNN-RNN。试用数据演示数字0/1/2三分类，完整函数可处理更多类别。

4. FunClassCNNRNN.m
核心封装函数。一行调用完成输入适配、分层划分、训练集标准化、CNN-RNN搭建、训练与早停、三集合预测、分类指标和五张结果图。

5. EvaClassEffect.m
分类评价函数，计算 Accuracy、宏平均 Precision/Recall/F1、逐类别指标、样本数和混淆矩阵。

三、快速开始

任选一个 demo 脚本直接运行。例如：

[foreData, foreDataTrain, net, info] = FunClassCNNRNN(X, Y, options);

运行时会弹出结果图，同时自动保存到 figure 文件夹。想替换自己的数据，建议复制最接近数据形状的 demo，再修改 X、Y 和 options。

四、输入与输出

X：任意维度有限数值数组，必须有一维是样本维。常见格式：
- 一维数组：[样本数, 长度]
- 多通道序列：[样本数, 通道数, 时间长度]
- 灰度图：[样本数, 高度, 宽度]
- 彩色图：[样本数, 高度, 宽度, 通道数]

Y：类别标签，长度等于样本数。支持数值、categorical、string 和 cellstr。

foreData：测试集预测标签。
foreDataTrain：训练集预测标签。
net：训练好的网络。
info：包括三集合索引和真实标签、验证集预测、三集合类别得分与评价指标、训练过程、标准化参数、适配后尺寸、类别顺序和完整 options。

五、核心函数 options 参数说明

1. 输入适配

sampleDimension：样本维。默认 'auto'，优先识别第一维，再兼容最后一维；也可填写从1开始的维度编号。

sequenceAxis：单条样本内部的序列轴，按1开始编号，默认 -1 表示最后一维。一维数组设1；[通道,时间]设2；[高度,宽度]逐列读图设2。CNN-RNN会按该轴读取先后顺序，不能随意选择。

2. 数据划分

splitLabels：预定义划分，长度与Y一致。1=训练集、2=验证集、3=测试集。适合按人员、设备或批次隔离；设置后随机划分比例不生效。

rTrain：训练+验证数据占全部样本的比例，默认0.80。它不是纯训练集比例；剩余20%是最终测试集。

validationRatio：验证集占训练+验证数据的比例，默认0.15。训练集更新参数，验证集负责早停和模型选择，测试集只在训练结束后评估。

shuffle：是否在分层划分前打乱独立样本，默认 true。严格时间序列或分组数据建议自行提供 splitLabels。

seed：随机种子，默认42。相同种子使划分和初始化尽量一致；设0表示不固定。

3. 网络结构

networkType：循环网络类型，默认 'LSTM'。试用版支持 'LSTM'、'GRU'；完整版增加BiLSTM。GRU更精简。

convChannels：每层一维卷积的输出通道，默认 [32,64]。数组长度就是卷积层数。通道越多能学到更多局部模式，也更慢、更易过拟合。

kernelSize：卷积核长度，默认5，必须为正奇数。越大一次观察的位置越多；短序列通常使用3。

poolSize：最大池化窗口，默认2。设1表示不池化。不能超过序列长度；短序列过度池化会丢信息。

rnnHidden：LSTM/GRU隐藏单元数，默认64。增大可提高记忆容量，同时增加训练时间和过拟合风险。

dropout：分类层前随机失活比例，默认0.20，范围[0,1)。数据少或过拟合时可适当增加。

4. 训练过程

solverName：求解器，默认 'adam'，还可选 'sgdm'、'rmsprop'。

maxEpochs：最大训练轮数，试用版默认30且最大30。只是上限，可能因验证集早停提前结束；完整版默认40且不受试用版上限约束。

learnRate：初始学习率，默认0.001。太大容易震荡，太小会收敛缓慢。

batchSize：批尺寸，默认64。增大通常更稳定但更占显存或内存，小数据可设16或32。

earlyStoppingPatience：验证损失连续多少次不改善后停止，默认8。设0关闭早停。

learnRateSchedule：学习率计划，默认 'none'；设 'piecewise' 后按固定轮数衰减。

learnRateDropPeriod：piecewise模式下每隔多少轮衰减，默认15。

learnRateDropFactor：每次学习率乘以的因子，默认0.5，范围(0,1]。

classWeight：类别权重，默认 'auto'，只根据训练集类别频数自动计算；'none'不加权；也可输入与类别数相同的正数数组。

executionEnvironment：训练设备，默认 'auto'；可选 'cpu'、'gpu'。

5. 数据处理与输出

mapflag：默认 'on'。on进行标准化，均值与标准差只由训练集计算，再应用到验证集和测试集；off不标准化。

figflag：默认 'on'。on生成并保存结果图；批量调参时可设off。

showFigures：默认 'on'。on在运行时弹出图窗；设off时只保存图片。

caseName：图片文件名前缀，默认 'CNN-RNN'。多个demo使用不同名称可避免覆盖。

classNames：绘图显示的类别名称，数量和顺序必须与排序后的真实类别一致。

六、自动输出图片

每个案例会在 figure 文件夹生成五张独立PNG：收敛过程、测试集混淆矩阵、各类别指标、测试集真实/预测类别对比、训练/验证/测试指标对比。

七、数据使用注意事项

标准化只能使用训练集拟合。本程序已经自动处理。若同一人员、设备或批次产生多条相似样本，建议使用 splitLabels 分组隔离，不能简单随机拆分，否则测试指标可能虚高。

数据来源和许可见“数据来源与许可.txt”。

获取无水印、无100样本/30轮限制并开放BiLSTM的完整版：www.khsci.com/docs
