Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

trainNetwork

深層学習用のニューラル ネットワークの学習

説明

分類および回帰タスクでは、trainNetwork を使用して、イメージ データを畳み込みニューラル ネットワーク (ConvNet、CNN) に学習させたり、シーケンス データを長短期記憶 (LSTM) やゲート付き回帰ユニット (GRU) などの再帰型ニューラル ネットワーク (RNN) に学習させたり、または数値特徴量データを多層パーセプトロン (MLP) ネットワークに学習させたりできます。1 つの CPU または 1 つの GPU で学習させることができます。イメージ分類やイメージ回帰の場合、複数の GPU または並列で学習させることができます。GPU、マルチ GPU、および並列オプションの使用には Parallel Computing Toolbox™ が必要です。深層学習に GPU を使用するには、Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU も必要です。実行環境のオプションを含む学習オプションを指定するには、関数 trainingOptions を使用します。

net = trainNetwork(imds,layers,options) は、イメージ データストア imds のイメージとラベル、および options で定義された学習オプションを使用して、イメージ分類タスク用に layers で指定したネットワークに学習させます。

net = trainNetwork(ds,layers,options) はデータストア ds によって返されるデータを使用してネットワークに学習させます。この構文は、複数の入力をもつネットワークに対し、結合されたデータストアのような、データの複数の列を返すデータストアと共に使用します。

net = trainNetwork(X,Y,layers,options) は、数値配列 X で指定したイメージ データまたは特徴データと、Y で指定したカテゴリカル応答または数値応答を使用してネットワークに学習させます。

net = trainNetwork(sequences,Y,layers,options) は、sequences で指定したシーケンス データと Y で指定した応答を、再帰型ネットワーク (LSTM ネットワークや GRU ネットワークなど) に学習させます。

net = trainNetwork(tbl,layers,options) は、table tbl のデータを使用してネットワークに学習させます。

net = trainNetwork(tbl,responseNames,layers,options) は、table tbl のデータを使用してネットワークに学習させますが、応答を含む table の列も指定します。

[net,info] = trainNetwork(___) は、前述の構文のいずれかを使用して学習に関する情報も返します。

すべて折りたたむ

データを ImageDatastore オブジェクトとして読み込みます。

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet', ...
    'nndemos','nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

データストアには、0 ~ 9 の数字から成る 10,000 個の合成イメージが格納されています。イメージは、さまざまなフォントを使用して作成された数字のイメージにランダム変換を適用して生成されたものです。数字のイメージはそれぞれ 28 x 28 ピクセルです。データストアには、カテゴリごとに同じ数のイメージが含まれます。

データストアのイメージをいくつか表示します。

figure
numImages = 10000;
perm = randperm(numImages,20);
for i = 1:20
    subplot(4,5,i);
    imshow(imds.Files{perm(i)});
    drawnow;
end

データストアを分割して、学習セットの各カテゴリに 750 個のイメージが含まれ、テスト セットに各ラベルの残りのイメージが含まれるようにします。

numTrainingFiles = 750;
[imdsTrain,imdsTest] = splitEachLabel(imds,numTrainingFiles,'randomize');

splitEachLabel は、digitData 内のイメージ ファイルを 2 つの新しいデータストア imdsTrainimdsTest に分割します。

畳み込みニューラル ネットワーク アーキテクチャを定義します。

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    reluLayer
    maxPooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

モーメンタム項付き確率的勾配降下法の既定の設定にオプションを設定します。エポックの最大回数を 20 に設定し、初期学習率 0.0001 で学習を開始します。

options = trainingOptions('sgdm', ...
    'MaxEpochs',20,...
    'InitialLearnRate',1e-4, ...
    'Verbose',false, ...
    'Plots','training-progress');

ネットワークに学習をさせます。

net = trainNetwork(imdsTrain,layers,options);

ネットワークの学習に使用されなかったテスト セットについて学習済みネットワークを実行し、イメージのラベル (数字) を予測します。

YPred = classify(net,imdsTest);
YTest = imdsTest.Labels;

精度を計算します。精度とは、テスト データ内のイメージの数に対する、classify による分類に一致するテスト データ内の真のラベルの数の比率です。

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9420

拡張イメージ データを使用して、畳み込みニューラル ネットワークに学習させます。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

標本データを読み込みます。標本データは、手書き数字の合成イメージで構成されています。

[XTrain,YTrain] = digitTrain4DArrayData;

digitTrain4DArrayData は、数字の学習セットを 4 次元配列データとして読み込みます。XTrain は、28 x 28 x 1 x 5000 の配列です。

  • 28 はイメージの高さと幅。

  • 1 はチャネルの数。

  • 5000 は手書き数字の合成イメージの数。

YTrain は、各観測値のラベルが含まれる categorical ベクトルです。

ネットワークの検証用に 1000 個のイメージを残しておきます。

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
YValidation = YTrain(idx);
YTrain(idx) = [];

サイズ変更、回転、平行移動、反転など、イメージ拡張の前処理オプションを指定する imageDataAugmenter オブジェクトを作成します。イメージを、水平方向および垂直方向に最大 3 ピクセルまでのランダムな平行移動をさせたり、最大 20 度までの回転をさせたりします。

imageAugmenter = imageDataAugmenter( ...
    'RandRotation',[-20,20], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3])
imageAugmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [-20 20]
           RandScale: [1 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [-3 3]
    RandYTranslation: [-3 3]

ネットワーク学習に使用する augmentedImageDatastore オブジェクトを作成し、イメージ出力サイズを指定します。学習中、データストアはイメージ拡張の実行とイメージのサイズ変更を行います。データストアは、イメージをメモリに保存せずに拡張します。trainNetwork は、ネットワーク パラメーターを更新した後、その拡張イメージを破棄します。

imageSize = [28 28 1];
augimds = augmentedImageDatastore(imageSize,XTrain,YTrain,'DataAugmentation',imageAugmenter);

畳み込みニューラル ネットワーク アーキテクチャを指定します。

layers = [
    imageInputLayer(imageSize)
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

モーメンタム項付き確率的勾配降下法の学習オプションを指定します。

opts = trainingOptions('sgdm', ...
    'MaxEpochs',15, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,YValidation});

ネットワークに学習をさせます。検証イメージは拡張されないため、検証精度が学習精度より高くなります。

net = trainNetwork(augimds,layers,opts);

標本データを読み込みます。標本データは、手書き数字の合成イメージで構成されています。3 番目の出力には、各イメージに対応する回転角度 (度単位) が含まれています。

digitTrain4DArrayData を使用して学習イメージを 4 次元配列として読み込みます。出力 XTrain は 28 x 28 x 1 x 5000 の配列で、それぞれは以下を意味します。

  • 28 はイメージの高さと幅。

  • 1 はチャネルの数。

  • 5000 は手書き数字の合成イメージの数。

YTrain には回転角度 (度単位) が含まれます。

[XTrain,~,YTrain] = digitTrain4DArrayData;

imshow を使用して、ランダムに選ばれた 20 枚の学習イメージを表示します。

figure
numTrainImages = numel(YTrain);
idx = randperm(numTrainImages,20);
for i = 1:numel(idx)
    subplot(4,5,i)    
    imshow(XTrain(:,:,:,idx(i)))
    drawnow;
end

畳み込みニューラル ネットワーク アーキテクチャを指定します。回帰問題の場合、ネットワークの最後に回帰層を含めます。

layers = [ ...
    imageInputLayer([28 28 1])
    convolution2dLayer(12,25)
    reluLayer
    fullyConnectedLayer(1)
    regressionLayer];

ネットワーク学習オプションを指定します。初期学習率を 0.001 に設定します。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.001, ...
    'Verbose',false, ...
    'Plots','training-progress');

ネットワークに学習をさせます。

net = trainNetwork(XTrain,YTrain,layers,options);

テスト データの予測精度を評価することによって、ネットワーク性能をテストします。predict を使用して、検証イメージの回転角度を予測します。

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);

回転角度の予測値と実際の値の平方根平均二乗誤差 (RMSE) を計算することによって、モデルの性能を評価します。

rmse = sqrt(mean((YTest - YPred).^2))
rmse = single
    6.0356

sequence-to-label 分類について深層学習 LSTM ネットワークに学習をさせます。

[1] および [2] に記載のある Japanese Vowels データ セットを読み込みます。XTrain は、LPC ケプストラム係数に対応する 12 の特徴をもつ可変長の 270 個のシーケンスが含まれる cell 配列です。Y は、ラベル 1、2、...、9 の categorical ベクトルです。XTrain のエントリは行列で、行数が 12 (特徴ごとに 1 行) で、列数が可変 (タイム ステップごとに 1 列) です。

[XTrain,YTrain] = japaneseVowelsTrainData;

最初の時系列をプロットで可視化します。各ラインは特徴に対応しています。

figure
plot(XTrain{1}')
title("Training Observation 1")
numFeatures = size(XTrain{1},1);
legend("Feature " + string(1:numFeatures),'Location','northeastoutside')

LSTM ネットワーク アーキテクチャを定義します。入力サイズを 12 (入力データの特徴の数) に指定します。100 個の隠れユニットを含み、シーケンスの最後の要素を出力するように LSTM 層を指定します。最後に、サイズが 9 の全結合層を含めることによって 9 個のクラスを指定し、その後にソフトマックス層と分類層を配置します。

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5×1 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
     5   ''   Classification Output   crossentropyex

学習オプションを指定します。ソルバーを 'adam''GradientThreshold' を 1 に指定します。ミニバッチ サイズを 27、エポックの最大回数を 70 に設定します。

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

maxEpochs = 70;
miniBatchSize = 27;

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',maxEpochs, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',1, ...
    'Verbose',false, ...
    'Plots','training-progress');

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

net = trainNetwork(XTrain,YTrain,layers,options);

テスト セットを読み込み、シーケンスを話者別に分類します。

[XTest,YTest] = japaneseVowelsTestData;

テスト データを分類します。学習に使用されるサイズと同じミニバッチ サイズを指定します。

YPred = classify(net,XTest,'MiniBatchSize',miniBatchSize);

予測の分類精度を計算します。

acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9514

数値特徴量のデータ セット (空間次元や時間次元のない数値データの集合など) がある場合、特徴入力層を使用して深層学習ネットワークに学習させることができます。

CSV ファイル "transmissionCasingData.csv" からトランスミッション ケーシング データを読み取ります。

filename = "transmissionCasingData.csv";
tbl = readtable(filename,'TextType','String');

関数 convertvars を使用して、予測のラベルを categorical に変換します。

labelName = "GearToothCondition";
tbl = convertvars(tbl,labelName,'categorical');

カテゴリカル特徴量を使用してネットワークに学習させるには、最初にカテゴリカル特徴量を数値に変換しなければなりません。まず、関数 convertvars を使用して、すべてのカテゴリカル入力変数の名前を格納した string 配列を指定することにより、カテゴリカル予測子を categorical に変換します。このデータ セットには、"SensorCondition""ShaftCondition" という名前の 2 つのカテゴリカル特徴量があります。

categoricalInputNames = ["SensorCondition" "ShaftCondition"];
tbl = convertvars(tbl,categoricalInputNames,'categorical');

カテゴリカル入力変数をループ処理します。各変数について次を行います。

  • 関数 onehotencode を使用して、カテゴリカル値を one-hot 符号化ベクトルに変換する。

  • 関数 addvars を使用して、one-hot ベクトルを table に追加する。対応するカテゴリカル データが含まれる列の後にベクトルを挿入するように指定する。

  • カテゴリカル データが含まれる対応する列を削除する。

for i = 1:numel(categoricalInputNames)
    name = categoricalInputNames(i);
    oh = onehotencode(tbl(:,name));
    tbl = addvars(tbl,oh,'After',name);
    tbl(:,name) = [];
end

関数 splitvars を使用して、ベクトルを別々の列に分割します。

tbl = splitvars(tbl);

table の最初の数行を表示します。カテゴリカル予測子が、カテゴリカル値を変数名として複数の列に分割されていることに注意してください。

head(tbl)
ans=8×23 table
    SigMean     SigMedian    SigRMS    SigVar     SigPeak    SigPeak2Peak    SigSkewness    SigKurtosis    SigCrestFactor    SigMAD     SigRangeCumSum    SigCorrDimension    SigApproxEntropy    SigLyapExponent    PeakFreq    HighFreqPower    EnvPower    PeakSpecKurtosis    No Sensor Drift    Sensor Drift    No Shaft Wear    Shaft Wear    GearToothCondition
    ________    _________    ______    _______    _______    ____________    ___________    ___________    ______________    _______    ______________    ________________    ________________    _______________    ________    _____________    ________    ________________    _______________    ____________    _____________    __________    __________________

    -0.94876     -0.9722     1.3726    0.98387    0.81571       3.6314        -0.041525       2.2666           2.0514         0.8081        28562              1.1429             0.031581            79.931            0          6.75e-06       3.23e-07         162.13                0                1                1              0           No Tooth Fault  
    -0.97537    -0.98958     1.3937    0.99105    0.81571       3.6314        -0.023777       2.2598           2.0203        0.81017        29418              1.1362             0.037835            70.325            0          5.08e-08       9.16e-08         226.12                0                1                1              0           No Tooth Fault  
      1.0502      1.0267     1.4449    0.98491     2.8157       3.6314         -0.04162       2.2658           1.9487        0.80853        31710              1.1479             0.031565            125.19            0          6.74e-06       2.85e-07         162.13                0                1                0              1           No Tooth Fault  
      1.0227      1.0045     1.4288    0.99553     2.8157       3.6314        -0.016356       2.2483           1.9707        0.81324        30984              1.1472             0.032088             112.5            0          4.99e-06        2.4e-07         162.13                0                1                0              1           No Tooth Fault  
      1.0123      1.0024     1.4202    0.99233     2.8157       3.6314        -0.014701       2.2542           1.9826        0.81156        30661              1.1469              0.03287            108.86            0          3.62e-06       2.28e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0275      1.0102     1.4338     1.0001     2.8157       3.6314         -0.02659       2.2439           1.9638        0.81589        31102              1.0985             0.033427            64.576            0          2.55e-06       1.65e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0464      1.0275     1.4477     1.0011     2.8157       3.6314        -0.042849       2.2455           1.9449        0.81595        31665              1.1417             0.034159            98.838            0          1.73e-06       1.55e-07         230.39                0                1                0              1           No Tooth Fault  
      1.0459      1.0257     1.4402    0.98047     2.8157       3.6314        -0.035405       2.2757            1.955        0.80583        31554              1.1345               0.0353            44.223            0          1.11e-06       1.39e-07         230.39                0                1                0              1           No Tooth Fault  

データ セットのクラス名を表示します。

classNames = categories(tbl{:,labelName})
classNames = 2×1 cell
    {'No Tooth Fault'}
    {'Tooth Fault'   }

次に、データ セットを学習用区画とテスト用区画に分割します。データの 15% をテスト用に残しておきます。

各区画の観測数を求めます。

numObservations = size(tbl,1);
numObservationsTrain = floor(0.85*numObservations);
numObservationsTest = numObservations - numObservationsTrain;

観測値に対応するランダムなインデックスの配列を作成し、区画サイズを使用して分割します。

idx = randperm(numObservations);
idxTrain = idx(1:numObservationsTrain);
idxTest = idx(numObservationsTrain+1:end);

インデックスを使用して、データの table を学習用、検証用、およびテスト用の区画に分割します。

tblTrain = tbl(idxTrain,:);
tblTest = tbl(idxTest,:);

特徴入力層を使用してネットワークを定義し、特徴の数を指定します。また、z スコア正規化を使用してデータを正規化するように入力層を構成します。

numFeatures = size(tbl,2) - 1;
numClasses = numel(classNames);
 
layers = [
    featureInputLayer(numFeatures,'Normalization', 'zscore')
    fullyConnectedLayer(50)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

学習オプションを指定します。

miniBatchSize = 16;

options = trainingOptions('adam', ...
    'MiniBatchSize',miniBatchSize, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Verbose',false);

layers、学習データ、および学習オプションによって定義されたアーキテクチャを使用して、ネットワークに学習させます。

net = trainNetwork(tblTrain,layers,options);

学習済みネットワークを使用してテスト データのラベルを予測し、精度を計算します。精度は、ネットワークが正しく予測するラベルの比率です。

YPred = classify(net,tblTest,'MiniBatchSize',miniBatchSize);
YTest = tblTest{:,labelName};

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9688

入力引数

すべて折りたたむ

イメージとラベルが格納されたイメージ データストア。ImageDatastore オブジェクトとして指定します。

関数 imageDatastore を使用してイメージ データストアを作成します。イメージが格納されたフォルダーの名前をラベルとして使用するには、'LabelSource' オプションを 'foldernames' に設定します。あるいは、イメージ データストアの Labels プロパティを使用して手動でラベルを指定します。

関数 trainNetwork は、イメージ分類ネットワーク用のイメージ データストアのみをサポートします。回帰ネットワーク用のイメージ データストアを使用するには、関数 transform および combine を使用して、変換または結合されたデータストアを作成します。詳細については、ds 入力引数を参照してください。

ImageDatastore を使用すると、事前取得を使用して JPG または PNG イメージ ファイルのバッチ読み取りを行うことができます。イメージの読み取りにカスタム関数を使用する場合、ImageDatastore は事前取得を行いません。

ヒント

イメージのサイズ変更を含む深層学習用のイメージの前処理を効率的に行うには、augmentedImageDatastore を使用します。

imageDatastorereadFcn オプションは通常、速度が大幅に低下するため、前処理またはサイズ変更に使用しないでください。

メモリ外のデータおよび前処理用のデータストア。

次の表に、trainNetwork と直接互換性のあるデータストアを示します。関数 transform および combine を使用して、深層学習ネットワークに学習させるための他の組み込みデータストアを使用できます。これらの関数は、データストアから読み取られたデータを、trainNetwork に必要な table または cell 配列形式に変換できます。複数の入力があるネットワークの場合、データストアは結合または変換されたデータストア、またはカスタム ミニバッチ データストアでなければなりません。詳細については、深層学習用のデータストアを参照してください。

データストアのタイプ説明
CombinedDatastore2 つ以上の基になるデータストアから読み取られたデータを水平方向に連結します。
TransformedDatastore基になるデータストアからの読み取りデータのバッチを独自の前処理パイプラインに従って変換します。
AugmentedImageDatastore深層ニューラル ネットワークに学習させるために、サイズ変更、回転、反転、せん断、平行移動を含む、ランダムなアフィン幾何変換を適用します。
PixelLabelImageDatastore (Computer Vision Toolbox)セマンティック セグメンテーション ネットワークに学習させるために、イメージおよび対応するグラウンド トゥルース ラベルに対して、同一のアフィン幾何変換を適用します (Computer Vision Toolbox™ が必要)。
RandomPatchExtractionDatastore (Image Processing Toolbox)イメージまたはピクセル ラベル イメージからランダム パッチのペアを抽出します (Image Processing Toolbox™ が必要)。オプションで、同一のランダムなアフィン幾何変換をパッチのペアに適用できます。
DenoisingImageDatastore (Image Processing Toolbox)ノイズ除去ネットワークに学習させるために、ランダムに生成されたガウス ノイズを適用します (Image Processing Toolbox が必要)。
カスタム ミニバッチ データストアシーケンス、時系列、テキスト、または特徴データのミニバッチを作成します。詳細は、カスタム ミニバッチ データストアの開発を参照してください。

データストアは、table または cell 配列でデータを返さなければなりません。データストア出力の形式は、ネットワーク アーキテクチャによって異なります。

ネットワーク アーキテクチャデータストア出力出力の例
単入力層

2 列の table または cell 配列。

最初の列と 2 番目の列は、それぞれ予測子と応答を指定します。

table の要素は、スカラー、行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。

カスタム ミニバッチ データストアは、table を出力しなければなりません。

data = read(ds)
data =

  4×2 table

        Predictors        Response
    __________________    ________

    {224×224×3 double}       2    
    {224×224×3 double}       7    
    {224×224×3 double}       9    
    {224×224×3 double}       9  
data = read(ds)
data =

  4×2 cell array

    {224×224×3 double}    {[2]}
    {224×224×3 double}    {[7]}
    {224×224×3 double}    {[9]}
    {224×224×3 double}    {[9]}
多入力層

(numInputs + 1) 列の cell 配列。numInputs はネットワーク入力の数です。

最初の numInputs 個の列は各入力の予測子を指定し、最後の列は応答を指定します。

入力の順序は、層グラフ layersInputNames プロパティによって指定します。

data = read(ds)
data =

  4×3 cell array

    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[9]}
    {224×224×3 double}    {128×128×3 double}    {[9]}

予測子の形式は、データのタイプによって異なります。

データ予測子の形式
2 次元イメージ

h x w x c の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。

3 次元イメージ

h x w x d x c の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。

ベクトル シーケンス

c 行 s 列の行列。ここで、c はシーケンスの特徴の数、s はシーケンス長です。

2 次元イメージ シーケンス

h x w x c x s の配列。ここで、h、w、および c はそれぞれイメージの高さ、幅、およびチャネル数に対応します。s はシーケンス長です。

ミニバッチ内の各シーケンスは、同じシーケンス長でなければなりません。

3 次元イメージ シーケンス

h x w x d x c x s の配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数に対応します。s はシーケンス長です。

ミニバッチ内の各シーケンスは、同じシーケンス長でなければなりません。

特徴

c 行 1 列の列ベクトル。c は特徴の数です。

table で返される予測子の場合、要素に、数値スカラー、数値行ベクトルが含まれているか、または数値配列が格納された 1 行 1 列の cell 配列が含まれていなければなりません。

関数 trainNetwork は、複数のシーケンス入力層をもつネットワークをサポートしていません。

応答の形式は、タスクのタイプによって異なります。

タスク応答の形式
分類categorical スカラー
回帰

  • スカラー

  • 数値ベクトル

  • イメージを表す 3 次元数値配列

sequence-to-sequence 分類

カテゴリカル ラベルの 1 行 s 列のシーケンス。ここで、s は対応する予測子シーケンスのシーケンス長です。

sequence-to-sequence 回帰

R 行 s 列の行列。ここで、R は応答の数、s は対応する予測子シーケンスのシーケンス長です。

table で返される応答の場合、要素は、categorical スカラー、数値行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。

イメージ データまたは特徴データ。数値配列として指定します。配列のサイズは入力のタイプによって以下のように異なります。

入力説明
2 次元イメージh x w x c x N の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。N はイメージの数です。
3 次元イメージh x w x d x c x N の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。N はイメージの数です。
特徴N 行 numFeatures 列の数値配列。ここで、N は観測値の数、numFeatures は入力データの特徴の数です。

配列に NaN が含まれる場合、ネットワーク全体に伝播されます。

シーケンス データまたは時系列データ。数値配列の N 行 1 列の cell 配列 (N は観測値の数)、または 1 つのシーケンスを表す数値配列として指定します。

cell 配列入力または数値配列入力の場合、シーケンスが含まれる数値配列の次元は、データのタイプによって異なります。

入力説明
ベクトル シーケンスc 行 s 列の行列。ここで、c はシーケンスの特徴の数、s はシーケンス長です。
2 次元イメージ シーケンスh x w x c x s の配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。s はシーケンス長です。
3 次元イメージ シーケンスh x w x d x c x s。ここで、h、w、d、および c は、それぞれ 3 次元イメージの高さ、幅、深さ、およびチャネル数に対応します。s はシーケンス長です。

データストアを使用してシーケンスを指定するには、ds 入力引数を使用します。

応答。ラベルの categorical ベクトル、数値配列、カテゴリカル シーケンスの cell 配列、または数値シーケンスの cell 配列として指定します。Y の形式は、タスクのタイプによって異なります。応答に NaN が含まれていてはなりません。

分類

タスク形式
イメージ分類または特徴分類ラベルの N 行 1 列の categorical ベクトル。N は観測値の数です。
sequence-to-label 分類
sequence-to-sequence 分類

ラベルのカテゴリカル シーケンスの N 行 1 列の cell 配列。N は観測値の数です。各シーケンスには、対応する予測子シーケンスと同じ数のタイム ステップがなければなりません。

観測値が 1 つの sequence-to-sequence 分類タスクでは、sequences をベクトルにすることもできます。この場合、Y は、ラベルのカテゴリカル シーケンスでなければなりません。

回帰

タスク形式
2 次元イメージ回帰
  • N 行 R 列の行列。ここで、N はイメージの数、R は応答の数です。

  • h x w x c x N の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。N はイメージの数です。

3 次元イメージ回帰
  • N 行 R 列の行列。ここで、N はイメージの数、R は応答の数です。

  • h x w x d x c x N の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。N はイメージの数です。

sequence-to-one 回帰N 行 R 列の行列。ここで、N はシーケンスの数、R は応答の数です。
sequence-to-sequence 回帰

数値シーケンスの N 行 1 列の cell 配列。ここで、N はシーケンスの数です。シーケンスは R 行の行列で、R は応答の数です。各シーケンスには、対応する予測子シーケンスと同じ数のタイム ステップがなければなりません。

観測値が 1 つの sequence-to-sequence 回帰タスクでは、sequences を行列にすることができます。この場合、Y は、応答の行列でなければなりません。

特徴回帰

N 行 R 列の行列。N は観測値の数、R は応答の数です。

応答の正規化は、回帰用のニューラル ネットワークの学習の安定化と高速化に役立つことがよくあります。詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。

入力データ。予測子と応答が格納された table として指定します。table の各行は観測値に対応します。

table の列での予測子と応答の配置は、タスクのタイプによって異なります。

分類

タスク予測子応答
イメージ分類
  • イメージの絶対ファイル パスまたは相対ファイル パス。単一列の文字ベクトルとして指定します。

  • イメージ。3 次元数値配列を含む 1 行 1 列の cell 配列として指定します。

予測子は、table の最初の列に格納されていなければなりません。

カテゴリカル ラベル

sequence-to-label 分類

シーケンス データまたは時系列データを含む MAT ファイルの絶対ファイル パスまたは相対ファイル パス。

MAT ファイルには、行がデータ点に対応し、列がタイム ステップに対応する行列で表される時系列が含まれていなければなりません。

予測子は、table の最初の列に格納されていなければなりません。

カテゴリカル ラベル

sequence-to-sequence 分類

MAT ファイルの絶対ファイル パスまたは相対ファイル パス。MAT ファイルには、エントリが各タイム ステップのラベルに対応する categorical ベクトルで表される時系列が含まれていなければなりません。

特徴分類

数値スカラー。

responseNames 引数を指定しない場合、予測子は table の最初の numFeatures の列になければなりません。numFeatures は入力データの特徴の数です。

カテゴリカル ラベル

イメージまたはシーケンス入力のある分類ネットワークでは、responseNames を指定しない場合、関数は既定で、tbl の最初の列を予測子に使用し、2 番目の列をラベルとして使用します。特徴入力のある分類ネットワークでは、responseNames 引数を指定しない場合、関数は既定で、tbl の最初の (numColumns - 1) 個の列を予測子に使用し、最後の列をラベルに使用します。ここで、numFeatures は入力データの特徴の数です。

回帰

タスク予測子応答
イメージ回帰

  • イメージの絶対ファイル パスまたは相対ファイル パス。文字ベクトルとして指定します。

  • イメージ。3 次元数値配列を含む 1 行 1 列の cell 配列として指定します。

予測子は、table の最初の列に格納されていなければなりません。

  • スカラー値から成る 1 つ以上の列

  • 数値行ベクトル

  • 3 次元数値配列を含む 1 行 1 列の cell 配列

sequence-to-one 回帰

シーケンス データまたは時系列データを含む MAT ファイルの絶対ファイル パスまたは相対ファイル パス。

MAT ファイルには、行がデータ点に対応し、列がタイム ステップに対応する行列で表される時系列が含まれていなければなりません。

予測子は、table の最初の列に格納されていなければなりません。

  • スカラー値から成る 1 つ以上の列

  • 数値行ベクトル

sequence-to-sequence 回帰

MAT ファイルの絶対ファイル パスまたは相対ファイル パス。MAT ファイルには、行が応答に対応し、列がタイム ステップに対応する行列で表される時系列が含まれていなければなりません。

特徴回帰

1 つ以上の列でスカラーとして指定された特徴。

responseNames 引数を指定しない場合、予測子は table の最初の numFeatures の列になければなりません。numFeatures は入力データの特徴の数です。

スカラー値から成る 1 つ以上の列

イメージまたはシーケンス入力のある回帰ネットワークでは、responseNames を指定しない場合、関数は既定で、tbl の最初の列を予測子に使用し、後続の列を応答として使用します。特徴入力のある回帰ネットワークでは、responseNames 引数を指定しない場合、関数は既定で、最初の numFeatures 個の列を予測子に使用し、後続の列を応答に使用します。ここで、numFeatures は入力データの特徴の数です。

応答の正規化は、回帰用のニューラル ネットワークの学習の安定化と高速化に役立つことがよくあります。詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。

応答に NaN を含めることはできません。予測子データに NaN が含まれる場合、学習を経由して伝播されます。ただし、ほとんどの場合に学習が収束しなくなります。

データ型: table

入力テーブルの応答変数の名前。次のいずれかとして指定します。

  • 1 つの応答をもつ分類または回帰タスクの場合、responseNames は、入力テーブルに応答変数が格納された文字ベクトルまたは string スカラーでなければなりません。

    複数の応答をもつ回帰タスクの場合、responseNames は、入力テーブルに応答変数が格納された string 配列または文字ベクトルの cell 配列でなければなりません。

データ型: char | cell | string

ネットワーク層。Layer 配列または LayerGraph オブジェクトとして指定します。

すべての層が順に結合されたネットワークを作成する場合、配列 Layer を入力引数として使用できます。この場合、返されるネットワークは、SeriesNetwork オブジェクトになります。

有向非循環グラフ (DAG) ネットワークは複雑な構造を持ち、層は複数の入出力を持てます。DAG ネットワークを作成するには、ネットワーク アーキテクチャを LayerGraph オブジェクトとして指定して、その層グラフを trainNetwork の入力引数として使用します。

組み込まれている層の一覧については、深層学習層の一覧を参照してください。

学習オプション。関数 trainingOptions によって返される TrainingOptionsSGDMTrainingOptionsRMSProp、または TrainingOptionsADAM オブジェクトとして指定します。

出力引数

すべて折りたたむ

学習済みネットワーク。SeriesNetwork オブジェクトまたは DAGNetwork オブジェクトとして返されます。

Layer 配列を使用してネットワークに学習させる場合、netSeriesNetwork オブジェクトになります。LayerGraph オブジェクトを使用してネットワークに学習させる場合、netDAGNetwork オブジェクトになります。

学習に関する情報。構造体として返されます。ここで、各フィールドは、学習の反復ごとに 1 つの要素を持つスカラーまたは数値ベクトルです。

分類タスクでは、info に次のフィールドが含められます。

  • TrainingLoss — 損失関数値

  • TrainingAccuracy — 学習精度

  • ValidationLoss — 損失関数値

  • ValidationAccuracy — 検証精度

  • BaseLearnRate — 学習率

  • FinalValidationLoss — 最終検証損失

  • FinalValidationAccuracy — 最終検証精度

回帰タスクでは、info に次のフィールドが含められます。

  • TrainingLoss — 損失関数値

  • TrainingRMSE — 学習の RMSE 値

  • ValidationLoss — 損失関数値

  • ValidationRMSE — 検証の RMSE 値

  • BaseLearnRate — 学習率

  • FinalValidationLoss — 最終検証損失

  • FinalValidationRMSE — 最終検証 RMSE

options で検証データが指定されている場合、構造体にはフィールド ValidationLossValidationAccuracyValidationRMSEFinalValidationLossFinalValidationAccuracy、および FinalValidationRMSE のみが含まれます。trainingOptions'ValidationFrequency' オプションは、検証メトリクスの計算が行われる反復を決定します。最終検証メトリクスはスカラーです。構造体の他のフィールドは行ベクトルであり、各要素が学習の反復に対応します。検証メトリクスの計算が行われない反復の場合、構造体の対応する値は NaN になります。

ネットワークにバッチ正規化層が含まれている場合、通常、最終検証メトリクスは学習中に評価される検証メトリクスとは異なります。これは、最終的なネットワークのバッチ正規化層では、学習中とは異なる処理が実行されるためです。詳細については、batchNormalizationLayer を参照してください。

詳細

すべて折りたたむ

チェックポイント ネットワークの保存と学習の再開

Deep Learning Toolbox™ では、学習の際、エポックの終了ごとに、ネットワークを .mat ファイルとして保存できます。この定期的な保存は、ネットワークまたはデータセットが大規模であり、学習に時間がかかる場合に特に便利です。学習が何らかの理由で中断された場合、最後に保存されたチェックポイント ネットワークから学習を再開できます。trainNetwork にチェックポイント ネットワークを保存させる場合は、trainingOptions の名前と値のペアの引数 'CheckpointPath' を使用してパス名を指定しなければなりません。指定したパスが存在していない場合、trainingOptions はエラーを返します。

trainNetwork は、チェックポイント ネットワーク ファイルに一意の名前を自動的に割り当てます。例の名前 net_checkpoint__351__2018_04_12__18_09_52.mat で、351 は反復回数、2018_04_12 は日付、18_09_52trainNetwork がネットワークを保存した時刻を表します。チェックポイント ネットワーク ファイルは、ダブルクリックするか、コマンド ラインで読み込みコマンドを使用すると、読み込むことができます。次に例を示します。

load net_checkpoint__351__2018_04_12__18_09_52.mat
また、ネットワークの層を trainNetwork の入力引数に使用することで、学習を再開できます。次に例を示します。

trainNetwork(XTrain,YTrain,net.Layers,options)
学習オプションと入力データは、チェックポイント ネットワークにこれらの情報が含まれていないため、手動で指定しなければなりません。例については、チェックポイント ネットワークからの学習の再開を参照してください。

浮動小数点演算

Deep Learning Toolbox に含まれる深層学習における学習、予測、検証用のすべての関数は、単精度浮動小数点演算を使用して計算を実行します。深層学習用の関数には trainNetworkpredictclassifyactivations などがあります。CPU と GPU の両方を使用してネットワークに学習させる場合、単精度演算が使用されます。

参照

[1] Kudo, M., J. Toyama, and M. Shimbo. "Multidimensional Curve Classification Using Passing-Through Regions." Pattern Recognition Letters. Vol. 20, No. 11–13, pp. 1103–1111.

[2] Kudo, M., J. Toyama, and M. Shimbo. Japanese Vowels Data Set. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

拡張機能

R2016a で導入