比较层权重初始化函数
此示例说明如何使用不同权重初始化函数来训练深度学习网络。
在训练深度学习网络时,层权重和偏置的初始化会对网络训练的效果产生重大影响。初始化函数的选择对没有批量归一化层的网络的影响更大。
根据层的类型,您可以使用 WeightsInitializer
、InputWeightsInitializer
、RecurrentWeightsInitializer
和 BiasInitializer
选项更改权重和偏置初始化。
此示例说明在训练 LSTM 网络时使用以下三种不同权重初始化函数的效果:
格罗洛特初始化函数 - 用格罗洛特初始化函数初始化输入权重。[1]
He 初始化函数 - 用 He 初始化函数初始化输入权重。[2]
窄正态初始化函数 - 通过从零均值和标准差为 0.01 的正态分布中独立采样来初始化输入权重。
加载数据
加载日语元音数据集,该数据集包含不同长度的序列,特征维数为 12,标签分类向量为 1、2、...、9。序列是具有 12 行(每个特征一行)和不同列数(每个时间步一列)的矩阵。
load JapaneseVowelsTrainData load JapaneseVowelsTestData
指定网络架构
指定网络架构。对于每个初始化函数,使用相同的网络架构。
将输入大小指定为 12(输入数据的特征数量)。指定具有 100 个隐含单元的 LSTM 层,并输出序列的最后一个元素。最后,通过包含一个大小为 9 的全连接层,后跟一个 softmax 层,来指定九个类。
numFeatures = 12; numHiddenUnits = 100; numClasses = 9; layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last") fullyConnectedLayer(numClasses) softmaxLayer]
layers = 4x1 Layer array with layers: 1 '' Sequence Input Sequence input with 12 dimensions 2 '' LSTM LSTM with 100 hidden units 3 '' Fully Connected 9 fully connected layer 4 '' Softmax softmax
训练选项
指定训练选项。对于每个初始化函数,使用相同的训练选项来训练网络。
maxEpochs = 30; miniBatchSize = 27; numObservations = numel(XTrain); numIterationsPerEpoch = floor(numObservations / miniBatchSize); options = trainingOptions("adam", ... ExecutionEnvironment="cpu", ... MaxEpochs=maxEpochs, ... InputDataFormats="CTB", ... Metrics="accuracy", ... MiniBatchSize=miniBatchSize, ... GradientThreshold=2, ... ValidationData={XTest,TTest}, ... ValidationFrequency=numIterationsPerEpoch, ... Verbose=false, ... Plots="training-progress");
格罗洛特初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "glorot"
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="glorot") fullyConnectedLayer(numClasses,WeightsInitializer="glorot") softmaxLayer];
使用具有格罗洛特权重初始化函数的 trainnet
函数来训练网络。
[netGlorot,infoGlorot] = trainnet(XTrain,TTrain,layers,"crossentropy",options);
He 初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "he"
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="he") fullyConnectedLayer(numClasses,WeightsInitializer="he") softmaxLayer];
使用具有 He 权重初始化函数的层来训练网络。
[netHe,infoHe] = trainnet(XTrain,TTrain,layers,"crossentropy",options);
窄正态初始化函数
指定在示例前面部分列出的网络架构,并将 LSTM 层的输入权重初始化函数和全连接层的权重初始化函数设置为 "narrow-normal"
。
layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,OutputMode="last",InputWeightsInitializer="narrow-normal") fullyConnectedLayer(numClasses,WeightsInitializer="narrow-normal") softmaxLayer];
使用具有窄正态权重初始化函数的层来训练网络。
[netNarrowNormal,infoNarrowNormal] = trainnet(XTrain,TTrain,layers,"crossentropy",options);
绘制结果
从 trainNetwork
函数的信息结构体输出中提取验证准确度。
validationAccuracy = [ infoGlorot.ValidationHistory.Accuracy,... infoHe.ValidationHistory.Accuracy,... infoNarrowNormal.ValidationHistory.Accuracy];
对于未计算验证准确度的迭代,验证准确度向量包含 NaN
。删除 NaN
值。
idx = all(isnan(validationAccuracy)); validationAccuracy(:,idx) = [];
对于每个初始化函数,绘制轮次编号对验证准确度的图。
figure epochs = 0:maxEpochs; plot(epochs,validationAccuracy) ylim([0 100]) title("Validation Accuracy") xlabel("Epoch") ylabel("Validation Accuracy") legend(["Glorot" "He" "Narrow-Normal"],Location="southeast")
该图显示了不同初始化函数的整体效果,以及每个初始化函数的训练收敛速度。
参考书目
Glorot, Xavier, and Yoshua Bengio."Understanding the difficulty of training deep feedforward neural networks."In Proceedings of the thirteenth international conference on artificial intelligence and statistics, pp. 249-256. 2010.
He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun."Delving deep into rectifiers:Surpassing human-level performance on imagenet classification."In Proceedings of the IEEE international conference on computer vision, pp. 1026-1034. 2015.
另请参阅
trainnet
| trainingOptions
| dlnetwork