目前看来,Deep learning的两大用途是classification和regression. 以LSTM为例,它的优势在于对时序数据(sequence data)强大的处理能力,简单来说,可以用作:
(1). sequence-to-label classification
(2). sequence-to-sequence classification
(3). sequence-to-label regression
(4). sequence-to-sequence regression
在不同应用场景下构建训练数据的输入XTrain是关键的一步。下面分别以上述三个应用场景为例,描述所需构建的XTrain结构。
1. sequence-to-label classification
1.1 构建网络的输入XTrain和输出YTrain
以Janpanese Vowels data 为例,在matlab中加载数据
[XTrain,YTrain] = japaneseVowelsTrainData;
XTrain是一个270-by-1的cell array. 每一个cell是一个12-by-N的矩阵,其中每个cell的N可以不一样。
XTrain可以描述如下:XTrain包含了270个sequences,每个sequence的长度是变化的,sequence的feature dimension是12(XTrain is a cell array containing 270 sequences of varying length with a feature dimension of 12).
XTrain的物理意义可以解释如下:采集了270匹狼嚎的声音样本,每一个声音样本的时间长度不一样,每一个声音样本提取了一个12维的特征向量。因此,对每一个声音样本来说(也就是每一个cell),每一列数据代表某一个时间点上的feature vector,其长度为12。将每一列数据沿行方向排列,构成时间尺度。以XTrain的第一个元素为例,将它展开,如下图
在sequence-to-label classification应用场景下,YTrain需要是category类型的数据,在该例子中,YTrain是一个270-by-1的category cell.
1.2 设计LSTM网络架构
用作sequence-to-label classification的LSTM网络,需要至少包含一个sequence input layer,一个lstm layer,一个fullyconnected layer, 一个softmax layer和一个classification output layer。关于如何创建每一个layer,在mathworks官网->support->documentation里检索‘layer’。LSTM网络的创建相对程序化,比较简单。
inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;
% 参数说明:
% 1. inputSize是sequenceInputLayer函数的实参。它是
% 特征的维度,也就是每一个cell里面矩阵的行数。
% 2. numHiddenUnits 是lstmLayer函数的参数,它设定LSTM网路包含的隐藏单元数目
% numClass是fullyConnectedLayer的实参,它是label的个数,对于该例子,就是所要识别的狼的种类数。
layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(numHiddenUnits,'OutputMode','last')
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer];
注意:在sequence-to-label classification场景下,lstmLayer函数的’OutputMode’参数的值需要设定为’last’。而在sequence-to-sequence classification场景下,使用相同的网络架构,但是’OutputMode’的值需要设定为’sequence’。
1.3 设置训练option
使用trainingOptions函数设置training options。
主要有:
(1) 求解器设置为’adam’
(2) 执行环境选’cpu’,如果在GPU上训练,则 ExecutionEnvironment的值设置为’auto’
(3) 设置mini-batch size 为27
(4) maximum number of epochs 设置为100
maxEpochs = 100;
miniBatchSize = 27;
options = trainingOptions('adam', ...
'ExecutionEnvironment','cpu', ...
'MaxEpochs',maxEpochs, ...
'MiniBatchSize',miniBatchSize, ...
'GradientThreshold',1, ...
'Verbose',false, ...
'Plots','training-progress');
设置好后使用trainNetwork函数训练网络,该函数需要馈入四个参数,分别是
(1) 训练数据的输入XTrain
(2) 训练数据的输出YTrain
(3) 网络架构layers
(4) 训练的training options
net=trainNetwork(XTrain,YTrain,layers, options)
后面的test等等不再赘述。
以上参考:mathworks官网->support->documentation->检索sequenceInputLayer
下一篇记录如何使用LSTM 进行sequence-to-sequence classification