
Matlab深度学习:使用CNN-LSTM进行猫狗图像分类的实践指南
最近在折腾Matlab的CNN-LSTM图像分类,发现网上的教程不是太老就是跑不通。自己踩了半个月坑
终于搞定了基础版,虽然准确率有点拉胯(毕竟为了演示随便搭的结构),但好歹能跑起来给各位打个样。
先看数据准备部分。猫狗各500张直接塞进ImageDatastore,注意文件路径的猫狗分类得用不同文
件夹存好:
```matlab
imds = imageDatastore('pet_images','IncludeSubfolders',true,'LabelSource','foldernam
es');
[imdsTrain,imdsTest] = splitEachLabel(imds,0.8,'randomized');
```
这里有个坑:Matlab的splitEachLabel如果数据量少可能会分不匀,建议用countEachLabel检查下
分布。如果发现训练集猫狗数量不对,得手动调整随机种子重分。
网络结构才是重头戏。咱们用CNN抽特征,再把特征序列喂给LSTM。注意输入层必须用sequenceInpu
tLayer,卷积层后面要接sequenceFolding强制转序列:
```matlab
layers = [
sequenceInputLayer([227 227 3],'Name','input') % 输入必须带sequence
convolution2dLayer(3,8,'Padding','same','Name','conv1')
batchNormalizationLayer('Name','bn1')
reluLayer('Name','relu1')
maxPooling2dLayer(2,'Stride',2,'Name','pool1')
sequenceFoldingLayer('Name','fold') % 关键转换层
lstmLayer(32,'OutputMode','last','Name','lstm')
fullyConnectedLayer(2,'Name','fc')
softmaxLayer('Name','softmax')
classificationLayer('Name','classOutput')];
```
这里lstmLayer的OutputMode要设成'last',因为咱们是要整个序列的最终状态做分类。如果遇到
维度报错,八成是sequenceFolding的位置没放对,得确保卷积操作在折叠之前完成。
训练配置别手贱开太大batchsize,显存分分钟爆炸。建议先用小学习率试水: