ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

sequenceInputLayer

説明

シーケンス入力層は、ネットワークにシーケンス データを入力します。

作成

説明

layer = sequenceInputLayer(inputSize) は、シーケンス入力層を作成し、InputSize プロパティを設定します。

layer = sequenceInputLayer(inputSize,Name,Value) は、名前と値のペアを使用して、オプションの NormalizationMean、および Name の各プロパティを設定します。複数の名前と値のペアを指定できます。各プロパティ名を一重引用符で囲みます。

プロパティ

すべて展開する

イメージ入力

入力のサイズ。正の整数または正の整数のベクトルとして指定します。

  • ベクトル シーケンス入力の場合、InputSize は特徴の数に対応するスカラーです。

  • 2 次元イメージ シーケンス入力の場合、InputSize は 3 要素から成るベクトル [h w c] です。ここで、h はイメージの高さ、w はイメージの幅、c はイメージのチャネル数です。

  • 3 次元イメージ シーケンス入力の場合、InputSize は 4 要素から成るベクトル [h w d c] です。ここで、h はイメージの高さ、w はイメージの幅、d はイメージの深さ、c はイメージのチャネル数です。

例: 100

データが入力層を通じて順伝播されるたびに適用するデータ変換。次のいずれかに指定します。

  • 'none' — 入力データを変換しません。

  • 'zerocenter'Mean プロパティによって指定された平均を減算します。関数 trainNetwork によって、学習時に平均が自動的に計算されます。

ゼロ中心正規化に使用される平均。数値配列または空として指定します。

  • ベクトル シーケンス入力の場合、Mean はチャネルごとの平均から成る InputSize 行 1 列のベクトルでなければなりません。

  • 2 次元イメージ シーケンス入力の場合、MeanInputSize と同じサイズであるか、チャネルごとの平均から成る 1 x 1 x C の配列でなければなりません。ここで、C は入力のチャネル数です。この場合、入力のチャネル数は InputSize(3) です。

  • 3 次元イメージ シーケンス入力の場合、MeanInputSize と同じサイズであるか、チャネルごとの平均から成る 1 x 1 x 1 x C の配列でなければなりません。ここで、C は入力のチャネル数です。この場合、入力のチャネル数は InputSize(4) です。

学習を行わずにネットワークを作成する場合 (assembleNetwork を使用してネットワークを組み立てる場合など)、このプロパティを設定できます。そうでない場合、関数 trainNetwork によって、学習時に平均が再計算されます。平均を指定するときには、さらに Normalization プロパティを 'zerocenter' に設定しなければなりません。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

層の名前。文字ベクトルまたは string スカラーとして指定します。層グラフに層を含めるには、空ではない一意の層の名前を指定しなければなりません。この層が含まれる系列ネットワークに学習させて Name'' に設定すると、学習時に層に名前が自動的に割り当てられます。

データ型: char | string

層の入力の数。この層には入力がありません。

データ型: double

層の入力名。この層には入力がありません。

データ型: cell

層の出力の数。この層には単一の出力のみがあります。

データ型: double

層の出力名。この層には単一の出力のみがあります。

データ型: cell

すべて折りたたむ

名前が 'seq1'、入力サイズが 12 のシーケンス入力層を作成します。

layer = sequenceInputLayer(12,'Name','seq1')
layer = 
  SequenceInputLayer with properties:

             Name: 'seq1'
        InputSize: 12

   Hyperparameters
    Normalization: 'none'
             Mean: []

Layer 配列に LSTM 層を含めます。

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

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

名前が 'seq1' の 224 行 224 列の RGB イメージのシーケンスに対して、シーケンス入力層を作成します。

layer = sequenceInputLayer([224 224 3], 'Name', 'seq1')
layer = 
  SequenceInputLayer with properties:

             Name: 'seq1'
        InputSize: [224 224 3]

   Hyperparameters
    Normalization: 'none'
             Mean: []

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

[1] および [2] の説明に従って、Japanese Vowels データセットを読み込みます。XTrain は、特徴次元 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 = 
  5x1 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、エポックの最大回数を 100 に設定します。

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

maxEpochs = 100;
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.9351

sequence-to-label 分類用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、ソフトマックス層、および分類出力層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズをクラスの数に設定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード 'last' を指定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-label 分類について LSTM ネットワークに学習をさせ、新しいデータを分類する方法の例については、深層学習を使用したシーケンスの分類を参照してください。

sequence-to-sequence 分類用の LSTM ネットワークを作成するには、sequence-to-label 分類の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを 'sequence' に設定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-one 回帰用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、および回帰出力層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズを応答の数に設定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード 'last' を指定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numResponses)
    regressionLayer];

sequence-to-sequence 回帰用の LSTM ネットワークを作成するには、sequence-to-one 回帰の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを 'sequence' に設定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','sequence')
    fullyConnectedLayer(numResponses)
    regressionLayer];

sequence-to-sequence 回帰について LSTM ネットワークに学習をさせて、新しいデータを予測する方法の例については、深層学習を使用した sequence-to-sequence 回帰を参照してください。

出力モードが 'sequence' の追加の LSTM 層を LSTM 層の前に挿入すると、LSTM ネットワークを深くできます。過適合を防止するために、LSTM 層の後にドロップアウト層を挿入できます。

sequence-to-label 分類ネットワークでは、最後の LSTM 層の出力モードは 'last' でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','last')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

sequence-to-sequence 分類ネットワークでは、最後の LSTM 層の出力モードは 'sequence' でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,'OutputMode','sequence')
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,'OutputMode','sequence')
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

ビデオや医用画像データなどのイメージのシーケンスを含むデータ用の深層学習ネットワークを作成します。

  • イメージのシーケンスをネットワークに入力するには、シーケンス入力層を使用します。

  • 畳み込み演算を各タイム ステップに個別に適用するには、まずシーケンス折りたたみ層を使用してイメージのシーケンスをイメージの配列に変換します。

  • これらの演算の実行後にシーケンス構造を復元するには、シーケンス展開層を使用してこのイメージの配列をイメージ シーケンスに変換し直します。

  • イメージを特徴ベクトルに変換するには、フラット化層を使用します。

その後、ベクトル シーケンスを LSTM 層と BiLSTM 層に入力できます。

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

28 x 28 のグレースケール イメージのシーケンスを 10 個のクラスに分類する分類用の LSTM ネットワークを作成します。

次のネットワーク アーキテクチャを定義します。

  • 入力サイズ [28 28 1] のシーケンス入力層。

  • 20 個の 5 行 5 列のフィルターを持つ、畳み込み層、バッチ正規化層、および ReLU 層のブロック。

  • 最後のタイム ステップのみを出力する、200 個の隠れユニットを持つ LSTM 層。

  • サイズが 10 (クラス数) の全結合層と、その後に配置するソフトマックス層と分類層。

畳み込み演算をタイム ステップごとに個別に実行するには、畳み込み層の前にシーケンス折りたたみ層を含めます。LSTM 層はベクトル シーケンス入力を想定しています。シーケンス構造を復元し、畳み込み層の出力を特徴ベクトルのシーケンスに形状変更するには、畳み込み層と LSTM 層の間にシーケンス展開層とフラット化層を挿入します。

inputSize = [28 28 1];
filterSize = 5;
numFilters = 20;
numHiddenUnits = 200;
numClasses = 10;

layers = [ ...
    sequenceInputLayer(inputSize,'Name','input')
    
    sequenceFoldingLayer('Name','fold')
    
    convolution2dLayer(filterSize,numFilters,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    
    sequenceUnfoldingLayer('Name','unfold')
    flattenLayer('Name','flatten')
    
    lstmLayer(numHiddenUnits,'OutputMode','last','Name','lstm')
    
    fullyConnectedLayer(numClasses, 'Name','fc')
    softmaxLayer('Name','softmax')
    classificationLayer('Name','classification')];

層を層グラフに変換し、シーケンス折りたたみ層の miniBatchSize 出力をシーケンス展開層の対応する入力に結合します。

lgraph = layerGraph(layers);
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');

関数 plot を使用して最終的なネットワーク アーキテクチャを表示します。

figure
plot(lgraph)

参照

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

[2] UCI Machine Learning Repository: Japanese Vowels Dataset. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

R2017b で導入