Main Content

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

predictAndUpdateState

学習済み再帰型ニューラル ネットワークを使用した応答の予測とネットワーク状態の更新

説明

1 つの CPU または 1 つの GPU で学習済みの深層学習ネットワークを使用して予測を実行できます。GPU を使用するには Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。名前と値の引数 ExecutionEnvironment を使用して、ハードウェア要件を指定します。

[updatedNet,Y] = predictAndUpdateState(recNet,sequences) は、学習済み再帰型ニューラル ネットワーク recNet を使用して sequences のデータに対する応答を予測し、ネットワーク状態を更新します。

この関数は、再帰型ニューラル ネットワークのみをサポートします。入力 recNet には、LSTM 層などの再帰層、または状態パラメーターをもつカスタム層が 1 つ以上含まれていなければなりません。

[updatedNet,Y] = predictAndUpdateState(recNet,X1,...,XN) は、多入力ネットワーク recNet に対する数値配列または cell 配列 X1、…、XN のデータの応答を予測します。入力 Xi は、ネットワーク入力 recNet.InputNames(i) に対応します。

[updatedNet,Y] = predictAndUpdateState(recNet,mixed) は、混合するデータ型のデータから成る多入力ネットワーク recNet を使用して予測を行います。

[updatedNet,Y1,...,YM] = predictAndUpdateState(___) は、前述の入力引数を使用して多出力ネットワークの M 出力の応答を予測します。出力 Yj はネットワーク出力 recNet.OutputNames(j) に対応します。分類出力層のカテゴリカル出力を返すには、ReturnCategorical オプションを 1 (true) に設定します。

[___] = predictAndUpdateState(___,Name=Value) は、前述の構文のいずれかを使用して、1 つ以上の名前と値の引数によって指定された追加オプションを使用して予測を行います。たとえば、MiniBatchSize=27 は、サイズ 27 のミニバッチを使用して予測を行います。

ヒント

長さが異なるシーケンスで予測を行うと、ミニバッチのサイズが、入力データに追加されるパディングの量に影響し、予測値が変わることがあります。さまざまな値を使用して、ネットワークに最適なものを確認してください。ミニバッチのサイズとパディングのオプションを指定するには、MiniBatchSize オプションと SequenceLength オプションをそれぞれ使用します。

すべて折りたたむ

学習済み再帰型ニューラル ネットワークを使用して応答を予測し、ネットワーク状態を更新します。

[1] および [2] で説明されているように Japanese Vowels データセットで学習させた事前学習済みの長短期記憶 (LSTM) ネットワーク JapaneseVowelsNet を読み込みます。このネットワークは、ミニバッチのサイズ 27 を使用して、シーケンス長で並べ替えられたシーケンスで学習させています。

load JapaneseVowelsNet

ネットワーク アーキテクチャを表示します。

net.Layers
ans = 
  5x1 Layer array with layers:

     1   'sequenceinput'   Sequence Input          Sequence input with 12 dimensions
     2   'lstm'            LSTM                    LSTM with 100 hidden units
     3   'fc'              Fully Connected         9 fully connected layer
     4   'softmax'         Softmax                 softmax
     5   'classoutput'     Classification Output   crossentropyex with '1' and 8 other classes

テスト データを読み込みます。

load JapaneseVowelsTestData

シーケンス内のタイム ステップ全体にわたってループ処理します。各タイム ステップのスコアを予測し、ネットワーク状態を更新します。

X = XTest{94};
numTimeSteps = size(X,2);
for i = 1:numTimeSteps
    v = X(:,i);
    [net,score] = predictAndUpdateState(net,v);
    scores(:,i) = score;
end

予測スコアをプロットします。プロットには、タイム ステップ間での予測スコアの変化が表示されます。

classNames = string(net.Layers(end).Classes);
figure
lines = plot(scores');
xlim([1 numTimeSteps])
legend("Class " + classNames,Location="northwest")
xlabel("Time Step")
ylabel("Score")
title("Prediction Scores Over Time Steps")

正しいクラスについて、タイム ステップでの予測スコアを強調表示します。

trueLabel = TTest(94)
trueLabel = categorical
     3 

lines(trueLabel).LineWidth = 3;

Figure contains an axes object. The axes object with title Prediction Scores Over Time Steps, xlabel Time Step, ylabel Score contains 9 objects of type line. These objects represent Class 1, Class 2, Class 3, Class 4, Class 5, Class 6, Class 7, Class 8, Class 9.

最後のタイム ステップの予測を棒グラフで表示します。

figure
bar(score)
title("Final Prediction Scores")
xlabel("Class")
ylabel("Score")

Figure contains an axes object. The axes object with title Final Prediction Scores, xlabel Class, ylabel Score contains an object of type bar.

入力引数

すべて折りたたむ

学習済み再帰型ニューラル ネットワーク。SeriesNetwork または DAGNetwork オブジェクトとして指定します。事前学習済みのネットワークをインポートするか、関数 trainNetwork を使用して独自のネットワークに学習させることによって、学習済みネットワークを取得できます。

recNet は再帰型ニューラル ネットワークです。これには少なくとも 1 つの再帰層 (LSTM ネットワークなど) を含めなければなりません。

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

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

入力説明
ベクトル シーケンスc 行 s 列の行列。ここで、c はシーケンスの特徴の数、s はシーケンス長です。
1 次元イメージ シーケンスh x c x s の配列。ここで、h および 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 はシーケンス長です。

データストア入力の場合、データストアはシーケンスの cell 配列、または最初の列にシーケンスが含まれる table としてデータを返さなければなりません。シーケンス データの次元は、上記の table に対応していなければなりません。

ヒント

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

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | cell
複素数のサポート: あり

複数の入力をもつネットワークの数値配列または cell 配列。

シーケンスの予測子入力の場合、入力は、単一のシーケンスを表す数値配列、またはシーケンスの cell 配列でなければなりません。この場合、予測子の形式は、引数 sequences の説明に記載されている形式と一致します。イメージおよび特徴の予測子入力の場合、入力が数値配列でなければならず、予測子の形式が次のいずれかと一致しなければなりません。

データ形式
2 次元イメージ

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

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

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

複数の入力をもつネットワークに学習させる方法を説明する例については、イメージ データおよび特徴データにおけるネットワークの学習を参照してください。

ヒント

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

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | cell
複素数のサポート: あり

混在データ。次のいずれかとして指定します。

データ型説明使用例
TransformedDatastoreカスタム変換関数を使用して、基になるデータストアから読み取ったデータのバッチを変換するデータストア

  • 複数の入力をもつネットワークを使用して予測を行う。

  • predictAndUpdateState でサポートされていないデータストアの出力を、必要な形式に変換する。

  • データストアの出力にカスタム変換を適用する。

CombinedDatastore2 つ以上の基になるデータストアからデータを読み取るデータストア

  • 複数の入力をもつネットワークを使用して予測を行う。

  • 異なるデータ ソースから取得した予測子を結合する。

カスタム ミニバッチ データストアデータのミニバッチを返すカスタム データストア

他のデータストアでサポートされていない形式のデータを使用して予測を行います。

詳細は、カスタム ミニバッチ データストアの開発を参照してください。

関数 transform および combine を使用して、予測を行うための他の組み込みデータストアを使用できます。これらの関数は、データストアから読み取られたデータを、predictAndUpdateState に必要な table または cell 配列形式に変換できます。詳細については、深層学習用のデータストアを参照してください。

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

データストア出力出力の例

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

入力の順序は、ネットワークの InputNames プロパティによって指定されます。

data = read(ds)
data =

  4×3 cell array

    {12×50 double}    {28×1 double}
    {12×50 double}    {28×1 double}
    {12×50 double}    {28×1 double}
    {12×50 double}    {28×1 double}

シーケンスの予測子入力の場合、入力は、単一のシーケンスを表す数値配列、またはシーケンスの cell 配列でなければなりません。この場合、予測子の形式は、引数 sequences の説明に記載されている形式と一致します。イメージおよび特徴の予測子入力の場合、入力が数値配列でなければならず、予測子の形式が次のいずれかと一致しなければなりません。

データ形式
2 次元イメージ

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

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

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

複数の入力をもつネットワークに学習させる方法を説明する例については、イメージ データおよび特徴データにおけるネットワークの学習を参照してください。

ヒント

数値配列をデータストアに変換するには、ArrayDatastore を使用します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: [updatedNet,Y] = predictAndUpdateState(recNet,C,MiniBatchSize=27) は、サイズ 27 のミニバッチを使用して予測を行います。

予測に使用するミニバッチのサイズ。正の整数として指定します。ミニバッチのサイズが大きくなるとより多くのメモリが必要になりますが、予測時間が短縮される可能性があります。

長さが異なるシーケンスで予測を行うと、ミニバッチのサイズが、入力データに追加されるパディングの量に影響し、予測値が変わることがあります。さまざまな値を使用して、ネットワークに最適なものを確認してください。ミニバッチのサイズとパディングのオプションを指定するには、MiniBatchSize オプションと SequenceLength オプションをそれぞれ使用します。

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

パフォーマンスの最適化。次のいずれかとして指定します。

  • "auto" — 入力ネットワークとハードウェア リソースに適した最適化の回数を自動的に適用します。

  • "none" — すべての高速化を無効にします。

Acceleration オプション "auto" を使用すると、パフォーマンス上のメリットが得られますが、初期実行時間が長くなります。互換性のあるパラメーターを使用した後続の呼び出しは、より高速になります。新しい入力データを使用して関数を複数回呼び出す場合は、パフォーマンスの最適化を使用してください。

ハードウェア リソース。次のいずれかの値として指定します。

  • "auto" — 利用可能な場合、GPU を使用します。そうでない場合、CPU を使用します。

  • "gpu" — GPU を使用します。GPU を使用するには Parallel Computing Toolbox ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。Parallel Computing Toolbox または適切な GPU が利用できない場合、エラーが返されます。

  • "cpu" — CPU を使用します。

カテゴリカル ラベルを返すオプション。0 (false) または 1 (true) として指定します。

ReturnCategorical1 (true) の場合、関数は分類出力層のカテゴリカル ラベルを返します。そうでない場合、関数は分類出力層の予測スコアを返します。

入力シーケンスのパディング、切り捨て、または分割を行うオプション。次のいずれかに指定します。

  • "longest" — 各ミニバッチで、最長のシーケンスと同じ長さになるようにシーケンスのパディングを行います。このオプションを使用するとデータは破棄されませんが、パディングによってニューラル ネットワークにノイズが生じることがあります。

  • "shortest" — 各ミニバッチで、最短のシーケンスと同じ長さになるようにシーケンスの切り捨てを行います。このオプションを使用するとパディングは追加されませんが、データが破棄されます。

  • 正の整数 — 各ミニバッチについて、そのミニバッチ内で最も長いシーケンスに合わせてシーケンスをパディングした後、指定した長さのより小さいシーケンスに分割します。分割が発生すると、追加のミニバッチが作成されます。指定したシーケンス長によってデータのシーケンスを均等に分割できない場合、最後のシーケンスを含むミニバッチの長さは指定した長さより短くなります。シーケンス全体がメモリに収まらない場合は、このオプションを使用します。または、MiniBatchSize オプションをより小さい値に設定して、ミニバッチごとのシーケンス数を減らしてみます。

    • このオプションは関数 trainNetwork のみをサポートします。

入力シーケンスのパディング、切り捨て、および分割の効果の詳細は、シーケンスのパディング、切り捨て、および分割を参照してください。

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

パディングまたは切り捨ての方向。次のいずれかに指定します。

  • "right" — シーケンスの右側に対してパディングまたは切り捨てを行います。シーケンスは同じタイム ステップで始まり、シーケンスの末尾に対して切り捨てまたはパディングの追加が行われます。

  • "left" — シーケンスの左側に対してパディングまたは切り捨てを行います。シーケンスが同じタイム ステップで終わるように、シーケンスの先頭に対して切り捨てまたはパディングの追加が行われます。

再帰層は 1 タイム ステップずつシーケンス データを処理するため、再帰層の OutputMode プロパティが "last" の場合、最後のタイム ステップでパディングを行うと層の出力に悪影響を与える可能性があります。シーケンス データの左側に対してパディングまたは切り捨てを行うには、SequencePaddingDirection オプションを "left" に設定します。

sequence-to-sequence ニューラル ネットワークの場合 (各再帰層について OutputMode プロパティが "sequence" である場合)、最初のタイム ステップでパディングを行うと、それ以前のタイム ステップの予測に悪影響を与える可能性があります。シーケンスの右側に対してパディングまたは切り捨てを行うには、SequencePaddingDirection オプションを "right" に設定します。

入力シーケンスのパディング、切り捨て、および分割の効果の詳細は、シーケンスのパディング、切り捨て、および分割を参照してください。

入力シーケンスをパディングする値。スカラーとして指定します。

ニューラル ネットワーク全体にエラーが伝播される可能性があるため、NaN でシーケンスをパディングしないでください。

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

出力引数

すべて折りたたむ

更新されたネットワーク。updatedNet は入力ネットワークと同じタイプのネットワークです。

予測スコアまたは入力応答。数値配列、categorical 配列、または cell 配列として返されます。Y の形式は、問題のタイプによって異なります。

次の表は、分類タスクの形式について説明しています。

タスクReturnCategorical形式
sequence-to-label 分類0 (false)N 行 K 列の行列。N は観測値の数、K はクラスの数です。
1 (true)N 行 1 列の categorical ベクトル。N は観測値の数です。
sequence-to-sequence 分類0 (false)

行列の N 行 1 列の cell 配列。N は観測値の数です。シーケンスは K 行の行列で、K はクラスの数です。SequenceLength オプションが各ミニバッチに個別に適用された後は、各シーケンスに、対応する入力シーケンスと同じ数のタイム ステップが含まれます。

1 (true)

カテゴリカル シーケンスの N 行 1 列の cell 配列。N は観測値の数です。SequenceLength オプションが各ミニバッチに個別に適用されると、このカテゴリカル シーケンスは、対応する入力シーケンスと同じ数のタイム ステップが含まれる categorical ベクトルになります。

観測値が 1 つの sequence-to-sequence 分類タスクでは、sequences を行列にすることができます。この場合、Y の形式は、ReturnCategorical オプションによって異なります。

  • ReturnCategoical0 (false) の場合、Y は、K 行 S 列の行列スコアになります。ここで、K はクラスの数、S は対応する入力シーケンスに含まれるタイム ステップの総数です。

  • ReturnCategoical1 (true) の場合、Y は、1 行 S 列の categorical ベクトルになります。ここで、S は対応する入力シーケンスに含まれるタイム ステップの総数です。

次の表は、回帰タスクの形式について説明しています。

タスク形式
sequence-to-one 回帰N 行 R 列の行列。N は観測値の数、R は応答の数です。
sequence-to-sequence 回帰

数値シーケンスの N 行 1 列の cell 配列。ここで、N は観測値の数です。シーケンスは R 行の行列で、R は応答の数です。SequenceLength オプションを各ミニバッチに個別に適用した後、各シーケンスには、対応する入力シーケンスと同じ数のタイム ステップが含まれています。

観測値が 1 つの sequence-to-sequence 問題では、sequences を行列にすることができます。この場合、Y は応答の行列です。

複数の出力をもつネットワークの予測スコアまたは予測応答。数値配列、categorical 配列、または cell 配列として返されます。

各出力 Yj は、ネットワーク出力 recNet.OutputNames(j) に対応し、出力引数 Y で説明されている形式になります。

アルゴリズム

すべて折りたたむ

浮動小数点演算

関数 trainnet または trainNetwork を使用してニューラル ネットワークに学習させる場合や、DAGNetwork オブジェクトおよび SeriesNetwork オブジェクトと共に予測関数または検証関数を使用する場合、ソフトウェアは単精度浮動小数点演算を使用して、これらの計算を実行します。予測および検証のための関数には、predictclassify、および activations があります。CPU と GPU の両方を使用してニューラル ネットワークに学習させる場合、単精度演算が使用されます。

再現性

最高のパフォーマンスを提供するために、GPU を使用した MATLAB® での深層学習は確定的であることを保証しません。ネットワーク アーキテクチャによっては、GPU を使用して 2 つの同一のネットワークに学習させたり、同じネットワークとデータを使用して 2 つの予測を行ったりする場合に、ある条件下で異なる結果が得られることがあります。

代替方法

単一の分類層のみをもつ再帰型ニューラル ネットワークでは、関数 classifyAndUpdateState を使用して、予測クラスと予測スコアを計算し、ネットワークの状態を更新できます。

ネットワーク層の活性化を計算するには、関数 activations を使用します。関数 activations は、ネットワークの状態を更新しません。

ネットワークの状態を更新せずに予測を行うには、関数 classify または関数 predict を使用します。

参照

[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 で導入

すべて展開する