Main Content

classifyAndUpdateState

学習済み再帰型ニューラル ネットワークを使用したデータの分類とネットワーク状態の更新

説明

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

複数の出力があるネットワークの場合、代わりに関数 predictAndUpdateState を使用して、ReturnCategorical オプションを true に設定します。

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

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

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

[updatedNet,Y] = classifyAndUpdateState(recNet,mixed) は、混合するデータ型のデータから成る多入力ネットワーク recNet のクラス ラベルを予測します。

[updatedNet,Y,scores] = classifyAndUpdateState(___) は、前述の構文のいずれかを使用して、クラス ラベルに対応する分類スコアも返します。

___ = classifyAndUpdateState(___,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,label,score] = classifyAndUpdateState(net,v);
    labels(i) = label;
end

予測されたラベルを階段状プロットにプロットします。このプロットには、タイムス ステップ間の予測の変化が示されます。

figure
stairs(labels,"-o")
xlim([1 numTimeSteps])
xlabel("Time Step")
ylabel("Predicted Class")
title("Classification Over Time Steps")

予測と真のラベルを比較します。観測値の真のラベルを示す水平のラインをプロットします。

trueLabel = TTest(94)
trueLabel = categorical
     3 

hold on
line([1 numTimeSteps],[trueLabel trueLabel], ...
    Color="red", ...
    LineStyle="--")
legend(["Prediction" "True Label"])

Figure contains an axes object. The axes object with title Classification Over Time Steps, xlabel Time Step, ylabel Predicted Class contains 2 objects of type stair, line. These objects represent Prediction, True Label.

入力引数

すべて折りたたむ

学習済み再帰型ニューラル ネットワーク。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カスタム変換関数を使用して、基になるデータストアから読み取ったデータのバッチを変換するデータストア

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

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

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

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

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

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

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

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

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

関数 transform および combine を使用して、予測を行うための他の組み込みデータストアを使用できます。これらの関数は、データストアから読み取られたデータを、classifyAndUpdateState に必要な 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] = classifyAndUpdateState(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 を使用します。

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

  • "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 ベクトル、または categorical ベクトルの cell 配列として返されます。Y の形式は、問題のタイプによって異なります。

次の表は、Y の形式について説明しています。

タスク形式
sequence-to-label 分類ラベルの N 行 1 列の categorical ベクトル。N は観測値の数です。
sequence-to-sequence 分類

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

観測値が 1 つの sequence-to-sequence 分類問題では、sequences を行列にすることができます。この場合、YPred はラベルのカテゴリカル シーケンスです。

予測クラス スコア。行列または行列の cell 配列として返されます。scores の形式は、問題のタイプによって異なります。

次の表は、scores の形式について説明しています。

タスク形式
sequence-to-label 分類N 行 K 列の行列。N は観測値の数、K はクラスの数です。
sequence-to-sequence 分類

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

観測値が 1 つの sequence-to-sequence 分類問題では、sequences を行列にすることができます。この場合、scores は、予測クラス スコアの行列です。

アルゴリズム

すべて折りたたむ

浮動小数点演算

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

再現性

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

代替方法

複数の出力層を持つ再帰型ニューラル ネットワークを使用してデータを分類し、ネットワーク状態を更新するには、関数 predictAndUpdateState を使用し、ReturnCategorical オプションを 1 (true) に設定します。

予測分類スコアを計算し、再帰型ニューラル ネットワークのネットワーク状態を更新するために、関数 predictAndUpdateState を使用することもできます。

ネットワーク層の活性化を計算するには、関数 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 で導入

すべて展開する