Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

sequenceInputLayer

説明

シーケンス入力層は、シーケンス データをニューラル ネットワークに入力し、データ正規化を適用します。

作成

説明

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

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

プロパティ

すべて展開する

シーケンス入力

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

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

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

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

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

入力データの最小シーケンス長を指定するには、MinLength プロパティを使用します。

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

入力データの最小シーケンス長。正の整数として指定します。ネットワークで学習または予測を行うときに、入力データのタイム ステップが MinLength 未満の場合、ソフトウェアはエラーをスローします。

時間次元のデータをダウンサンプリングするネットワークを作成するときは、ネットワークが学習データと予測用のデータをサポートするように注意しなければなりません。一部の深層学習層では、入力のシーケンス長が最小である必要があります。たとえば、1 次元畳み込み層では、入力に少なくともフィルター サイズと同じ数のタイム ステップが必要です。

シーケンス データの時系列がネットワークを介して伝播することで、シーケンスの長さが変化する可能性があります。たとえば、1 次元畳み込みなどのダウンサンプリング演算では、入力よりも少ないタイム ステップでデータを出力できます。これは、データのシーケンス長が層に必要な最小長よりも短いため、ダウンサンプリング演算によってネットワーク内の後の層がエラーをスローする可能性があることを意味します。

ネットワークの学習や組み立てを行うとき、ソフトウェアは長さ 1 のシーケンスがネットワークを介して伝播できることを自動的にチェックします。一部のネットワークは、長さ 1 のシーケンスをサポートしていない可能性がありますが、シーケンス長がそれより大きいシーケンスを正常に伝播できます。ネットワークが学習データと予想される予測データの伝播をサポートしていることを確認するには、MinLength プロパティを、データの最小長と予測データの予想最小長の値以下に設定します。

ヒント

畳み込み層とプーリング層がデータのサイズを変更しないようにするには、層の Padding オプションを "same" または "causal" に設定します。

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

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

  • 'zerocenter'Mean によって指定された平均を減算します。

  • 'zscore'Mean によって指定された平均を減算し、StandardDeviation で除算します。

  • 'rescale-symmetric'Min および Max によってそれぞれ指定された最小値と最大値を使用して、範囲 [-1, 1] に入力を再スケーリングします。

  • 'rescale-zero-one'Min および Max によってそれぞれ指定された最小値と最大値を使用して、範囲 [0, 1] に入力を再スケーリングします。

  • 'none' — 入力データを正規化しません。

  • 関数ハンドル — 指定した関数を使用してデータを正規化します。関数は、Y = func(X) という形式でなければなりません。ここで、X は入力データ、出力 Y は正規化データです。

ヒント

既定では、ソフトウェアは、関数 trainnet および trainNetwork の使用時に正規化統計量を自動的に計算します。学習時に時間を節約するため、正規化に必要な統計量を指定し、trainingOptionsResetInputNormalization オプションを 0 (false) に設定します。

パディング値などのすべての入力要素に正規化が適用されます。

データ型: char | string | function_handle

正規化の次元。次のいずれかに指定します。

  • 'auto' – 学習オプションが false の場合、いずれかの正規化統計量 (MeanStandardDeviationMin、または Max) を指定し、統計量に一致する次元に対して正規化を行います。そうでない場合、学習時に統計量を再計算し、チャネル単位の正規化を適用します。

  • 'channel' – チャネル単位の正規化。

  • 'element' – 要素単位の正規化。

  • 'all' – スカラーの統計量を使用してすべての値を正規化します。

データ型: char | string

ゼロ中心正規化および z スコア正規化の平均。数値配列または空として指定します。

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

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

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

Mean プロパティを指定する場合、Normalization'zerocenter' または 'zscore' でなければなりません。Mean[] の場合、関数 trainnet および trainNetwork は平均を計算し、パディング値を無視します。カスタム学習ループを使用して dlnetwork オブジェクトに学習させる場合、または関数 assembleNetwork を使用して学習を行わずにネットワークを組み立てる場合は、Mean プロパティを数値スカラーまたは数値配列に設定しなければなりません。

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

z スコア正規化に使用される標準偏差。数値配列、数値スカラー、または空として指定します。

  • ベクトル シーケンス入力の場合、StandardDeviation はチャネルごとの標準偏差から成る InputSize 行 1 列のベクトル、数値スカラー、または [] でなければなりません。

  • 2 次元イメージ シーケンス入力の場合、StandardDeviationInputSize と同じサイズの数値配列、チャネルごとの標準偏差から成る 1 x 1 x InputSize(3) の配列、数値スカラー、または [] でなければなりません。

  • 3 次元イメージ シーケンス入力の場合、StandardDeviationInputSize と同じサイズの数値配列、チャネルごとの標準偏差から成る 1 x 1 x 1 x InputSize(4) の配列、または数値スカラーでなければなりません。

StandardDeviation プロパティを指定する場合、Normalization'zscore' でなければなりません。StandardDeviation[] の場合、関数 trainnet および trainNetwork は平均を計算し、パディング値を無視します。カスタム学習ループを使用して dlnetwork オブジェクトに学習させる場合、または関数 assembleNetwork を使用して学習を行わずにネットワークを組み立てる場合は、StandardDeviation プロパティを数値スカラーまたは数値配列に設定しなければなりません。

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

再スケーリングの最小値。数値配列または空として指定します。

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

  • 2 次元イメージ シーケンス入力の場合、MinInputSize と同じサイズの数値配列、チャネルごとの最小値から成る 1 x 1 x InputSize(3) の配列、または数値スカラーでなければなりません。

  • 3 次元イメージ シーケンス入力の場合、MinInputSize と同じサイズの数値配列、チャネルごとの最小値から成る 1 x 1 x 1 x InputSize(4) の配列、または数値スカラーでなければなりません。

Min プロパティを指定する場合、Normalization'rescale-symmetric' または 'rescale-zero-one' でなければなりません。Min[] の場合、関数 trainnet および trainNetwork は最小値を計算し、パディング値を無視します。カスタム学習ループを使用して dlnetwork オブジェクトに学習させる場合、または関数 assembleNetwork を使用して学習を行わずにネットワークを組み立てる場合は、Min プロパティを数値スカラーまたは数値配列に設定しなければなりません。

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

再スケーリングの最大値。数値配列または空として指定します。

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

  • 2 次元イメージ シーケンス入力の場合、MaxInputSize と同じサイズの数値配列、チャネルごとの最大値から成る 1 x 1 x InputSize(3) の配列、数値スカラー、または [] でなければなりません。

  • 3 次元イメージ シーケンス入力の場合、MaxInputSize と同じサイズの数値配列、チャネルごとの最大値から成る 1 x 1 x 1 x InputSize(4) の配列、数値スカラー、または [] でなければなりません。

Max プロパティを指定する場合、Normalization'rescale-symmetric' または 'rescale-zero-one' でなければなりません。Max[] の場合、関数 trainnet および trainNetwork は最大値を計算し、パディング値を無視します。カスタム学習ループを使用して dlnetwork オブジェクトに学習させる場合、または関数 assembleNetwork を使用して学習を行わずにネットワークを組み立てる場合は、Max プロパティを数値スカラーまたは数値配列に設定しなければなりません。

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

この プロパティ は読み取り専用です。

入力データを実数部と虚数部に分割するためのフラグ。次のいずれかの値として指定します。

  • 0 (false) – 入力データを分割しません。

  • 1 (true) – 入力データを実数部と虚数部に分割します。

SplitComplexInputs1 の場合、層の出力に含まれるチャネル数は、入力データに含まれるチャネル数の 2 倍になります。たとえば、入力データが numChannels 個のチャネルをもつ複素数値の場合、層の出力には 2*numChannels 個のチャネルが含まれます。このとき、1numChannels 番目のチャネルには入力データの実数部が格納され、numChannels+12*numChannels 番目のチャネルには入力データの虚数部が格納されます。入力データが実数の場合、numChannels+12*numChannels 番目のチャネルはすべて 0 になります。

複素数値のデータをニューラル ネットワークに入力するには、入力層の SplitComplexInputs オプションが 1 でなければなりません。

複素数値のデータをもつネットワークに学習させる方法を説明する例については、複素数値データを使用したネットワークの学習を参照してください。

層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainnettrainNetworkassembleNetworklayerGraph、および dlnetwork は、名前が "" の層に自動的に名前を割り当てます。

SequenceInputLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

データ型: char | string

この プロパティ は読み取り専用です。

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

データ型: double

この プロパティ は読み取り専用です。

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

データ型: cell

この プロパティ は読み取り専用です。

層からの出力の数。1 として返されます。この層には単一の出力のみがあります。

データ型: double

この プロパティ は読み取り専用です。

出力名。{'out'} として返されます。この層には単一の出力のみがあります。

データ型: cell

すべて折りたたむ

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

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

                      Name: 'seq1'
                 InputSize: 12
                 MinLength: 1
        SplitComplexInputs: 0

   Hyperparameters
             Normalization: 'none'
    NormalizationDimension: 'auto'

シーケンス入力層を Layer 配列に含めます。

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]
                 MinLength: 1
        SplitComplexInputs: 0

   Hyperparameters
             Normalization: 'none'
    NormalizationDimension: 'auto'

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

サンプル データを WaveformData.mat から読み込みます。データは、numObservations 行 1 列のシーケンスの cell 配列です。ここで、numObservations はシーケンスの数です。各シーケンスは numChannels-numTimeSteps 列の数値配列です。ここで、numChannels はシーケンスのチャネル数、numTimeSteps はシーケンスのタイム ステップ数です。

load WaveformData

シーケンスの一部をプロットで可視化します。

numChannels = size(data{1},1);

idx = [3 4 5 12];
figure
tiledlayout(2,2)
for i = 1:4
    nexttile
    stackedplot(data{idx(i)}',DisplayLabels="Channel "+string(1:numChannels))
    
    xlabel("Time Step")
    title("Class: " + string(labels(idx(i))))
end

テスト用のデータを確保します。データの 90% から成る学習セットとデータの残りの 10% から成るテスト セットにデータを分割します。データを分割するには、この例にサポート ファイルとして添付されている関数 trainingPartitions を使用します。このファイルにアクセスするには、例をライブ スクリプトとして開きます。

numObservations = numel(data);
[idxTrain,idxTest] = trainingPartitions(numObservations, [0.9 0.1]);
XTrain = data(idxTrain);
TTrain = labels(idxTrain);

XTest = data(idxTest);
TTest = labels(idxTest);

LSTM ネットワーク アーキテクチャを定義します。入力サイズを入力データのチャネルの数として指定します。120 個の隠れユニットを含み、シーケンスの最後の要素を出力するように LSTM 層を指定します。最後に、クラス数と一致する出力サイズをもつ全結合層を含め、その後にソフトマックス層と分類層を含めます。

numHiddenUnits = 120;
numClasses = numel(categories(TTrain));

layers = [ ...
    sequenceInputLayer(numChannels)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
layers = 
  5×1 Layer array with layers:

     1   ''   Sequence Input          Sequence input with 3 dimensions
     2   ''   LSTM                    LSTM with 120 hidden units
     3   ''   Fully Connected         4 fully connected layer
     4   ''   Softmax                 softmax
     5   ''   Classification Output   crossentropyex

学習オプションを指定します。学習率 0.01、勾配しきい値 1 で Adam ソルバーを使用して学習させます。エポックの最大数を 150 に設定し、すべてのエポックでデータをシャッフルします。既定では、ソフトウェアは GPU が利用できる場合に GPU で学習を行います。GPU を使用するには、Parallel Computing Toolbox とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

options = trainingOptions("adam", ...
    MaxEpochs=150, ...
    InitialLearnRate=0.01,...
    Shuffle="every-epoch", ...
    GradientThreshold=1, ...
    Verbose=false, ...
    Plots="training-progress");

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

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

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

YTest = classify(net,XTest);

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

acc = mean(YTest == TTest)
acc = 0.8400

分類結果を混同チャートで表示します。

figure
confusionchart(TTest,YTest)

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)

Figure contains an axes object. The axes object contains an object of type graphplot.

アルゴリズム

すべて展開する

拡張機能

バージョン履歴

R2017b で導入

すべて展開する