主要内容

メモリ外のシ,ケンスデ,タを使用したネットワ,クの学習

この例では,データストアの変換と組み合わせによってメモリ外のシーケンスデータで深層学習ネットワークに学習させる方法を説明します。

変換されたデ,タストアは,基となるデ,タストアから読み取ったデ,タを変換または処理します。変換されたデータストアは,深層学習アプリケーションの学習データセット,検証データセット,テストデータセット,および予測データセットのソースとして使用できます。変換されたデータストアを使用して,メモリ外のデータを読み取るか,データのバッチを読み取る際に特定の前処理演算を実行します。予測子とラベルを含む個別のデータストアがある場合,これらのデータストアを組み合わせて深層学習ネットワークにデータを入力できます。

ネットワークの学習時に,入力データのパディング,切り捨て,または分割が行われ,同じ長さのシーケンスのミニバッチが作成されます。メモリ内のデ,タの場合,関数trainingOptionsに入力シーケンスのパディングと切り捨てを自動的に行うオプションが用意されていますが,メモリ外のデータの場合は,シーケンスのパディングと切り捨てを手動で行わなければなりません。

学習デ,タの読み込み

[1]および[2]に記載のある日语元音デ,タセットを読み込みます。Zipファ电子邮箱ルjapaneseVowels.zipには可変長のシ,ケンスが含まれています。シケンスは2のフォルダ火车测试に分割されています。これらのフォルダ,には,学習シ,ケンスとテストシ,ケンスがそれぞれ含まれています。これらの各フォルダ,では,シ,ケンスが1から9まで番号が付けられたサブフォルダ,に分割されています。これらのサブフォルダ,の名前はラベル名です。垫子ファ@ルは各シ@ケンスを表します。各シーケンスは行列で,行数が12(特徴ごとに1行)で,列数が可変(タイムステップごとに1列)です。行数はシ,ケンス次元で,列数はシ,ケンス長です。

シ,ケンスデ,タを解凍します。

文件名=“japaneseVowels.zip”;outputFolder = fullfile(tempdir,“japaneseVowels”);解压缩(文件名,outputFolder);

学習予測子用にファ负载に指定します。関数负载はmatファルから構造体配列にデタを読み込みます。学習フォルダ,内のサブフォルダ,からファ,“IncludeSubfolders”オプションを真正的に設定します。

folderTrain = fullfile(输出文件夹,“训练”);fdsPredictorTrain = fileDatastore(文件夹火车,...“ReadFcn”@load,...“IncludeSubfolders”,真正的);

デ,タストアをプレビュ,します。返される構造体は,最初のファ。

预览(fdsPredictorTrain)
ans =带字段的结构:X: [12×20 double]

ラベル用にファreadLabel(この例の最後に定義)になるように指定します。関数readLabelは,サブフォルダ,名からラベルを抽出します。

classNames = string(1:9);fdsLabelTrain = fileDatastore(文件夹火车,...“ReadFcn”@(文件名)readLabel(文件名,类名),...“IncludeSubfolders”,真正的);

デ,タストアをプレビュ,します。出力は最初のファ@ @ルのラベルに対応しています。

预览(fdsLabelTrain)
ans =分类1

デ,タストアの変換と統合

シーケンスデータを予測子のデータストアから深層学習ネットワークに入力するには,シーケンスのミニバッチが同じ長さでなければなりません。シケンスの長さが20になるようにパディングまたは切り捨てを行う関数padSequence(デ,タストアの最後に定義)を使用して,デ,タストアを変換します。

sequenceLength = 20;tdsTrain = transform(fdsPredictorTrain,@(data) padSequence(data,sequenceLength));

変換されたデ,タストアをプレビュ,します。出力は最初のファ▪▪ルのパディングされたシ▪▪ケンスに対応しています。

X =预览(tdsTrain)
X =1×1单元格数组{12×20双}

両方のデ,タストアの予測子とラベルを深層学習ネットワ,クに入力するには,関数结合を使用してこれらを組み合わせます。

cdsTrain = combine(tdsTrain,fdsLabelTrain);

デ,タストアの組み合わせをプレビュ,します。デ,タストアは1行2列のcell配列を返します。最初の要素は予測子に対応しています。2番目の要素はラベルに対応しています。

预览(cdsTrain)
ans =1×2单元格数组{12×20 double} {[1]}

LSTMネットワ,クア,キテクチャの定義

LSTMネットワ,クア,キテクチャを定義します。入力デタの特徴の数を入力サズとして指定します。100 個の隠れユニットを持つ LSTM 層を指定して、シーケンスの最後の要素を出力します。最後に、出力サイズがクラスの数に等しい全結合層を指定し、その後にソフトマックス層と分類層を配置します。

numFeatures = 12;numClasses = numel(classNames);numHiddenUnits = 100;层= [...sequenceInputLayer numFeatures lstmLayer (numHiddenUnits,“OutputMode”“最后一次”) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

学習オプションを指定します。ソルバ,を“亚当”に設定し,“GradientThreshold”を2に設定します。ミニバッチサ▪▪ズを27,エポックの最大回数を75に設定します。このデ,タストアはシャッフルをサポ,トしていないため,“洗牌”“永远”に設定します。

ミニバッチが小さく、シ、ケンスが短いため、学習にはCPUが適しています。“ExecutionEnvironment”“cpu”に設定します。Gpuが利用できる場合,Gpuで学習を行うには,“ExecutionEnvironment”“汽车”(既定値)に設定します。

miniBatchSize = 27;选项= trainingOptions(“亚当”...“ExecutionEnvironment”“cpu”...“MaxEpochs”, 75,...“MiniBatchSize”miniBatchSize,...“GradientThreshold”2,...“洗牌”“永远”...“详细”0,...“阴谋”“训练进步”);

学習オプションを指定してLSTMネットワ,クに学習させます。

net = trainNetwork(cdsTrain,layers,options);

ネットワ,クのテスト

学習データの場合と同じ手順に従って,ホールドアウトされたテストデータを含む変換されたデータストアを作成します。

folderTest = fullfile(输出文件夹,“测试”);fdsPredictorTest = fileDatastore(文件夹测试,...“ReadFcn”@load,...“IncludeSubfolders”,真正的);tdsTest = transform(fdsPredictorTest,@(data) padSequence(data,sequenceLength));

学習済みネットワクを使用して,テストデタにいて予測を実行します。

YPred =分类(net,tdsTest,“MiniBatchSize”, miniBatchSize);

テストデ,タに対する分類精度を計算します。テストセットのラベルを取得するには,読み取り関数readLabelを使用してファルデタストアを作成し,サブフォルダを含むように指定します。“UniformRead”オプションを真正的に設定して,出力が垂直に連結されるように指定します。

fdsLabelTest = fileDatastore(文件夹测试,...“ReadFcn”@(文件名)readLabel(文件名,类名),...“IncludeSubfolders”,真的,...“UniformRead”,真正的);YTest = readall(fdsLabelTest);
accuracy = mean(YPred == YTest)
准确度= 0.9351

関数

関数readLabelは,一会のカテゴリで指定されたファ@ @ル名からラベルを抽出します。

函数label = readLabel(文件名,classNames) filepath = fileparts(文件名);[~,label] = fileparts(filepath);label = categorical(string(label),classNames);结束

関数padSequenceは,シ,ケンスが指定された長さになるように数据。Xでシ,ケンスのパディングと切り捨てを行い,結果を1行1列のcellで返します。

函数sequence = padSequence(data,sequenceLength) sequence = data. x;[C,S] = size(sequence);如果S < sequenceLength padding = 0 (C, sequencelengs);序列=[序列填充];其他的sequence = sequence(:,1:sequenceLength);结束序列={序列};结束

参考

|||||

関連するトピック