Main Content

featureInputLayer

特徴入力層

R2020b 以降

説明

特徴入力層は、特徴データをニューラル ネットワークに入力し、データ正規化を適用します。特徴 (空間次元または時間次元のないデータ) を表す数値スカラーのデータ セットがある場合は、この層を使用します。

イメージ入力の場合、imageInputLayer を使用します。

作成

説明

layer = featureInputLayer(numFeatures) は、特徴入力層を返し、InputSize プロパティを指定された特徴数に設定します。

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

プロパティ

すべて展開する

特徴入力

データに含まれる各観測値の特徴数。正の整数として指定します。

イメージ入力の場合、imageInputLayer を使用します。

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

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

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

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

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

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

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

入力データが複素数値で、SplitComplexInputs オプションが 0 (false) の場合、Normalization オプションは、"zerocenter""zscore""none"、または関数ハンドルでなければなりません。 (R2024a 以降)

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

ヒント

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

FeatureInputLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

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

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

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

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

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

ゼロ中心正規化および z スコア正規化の平均。特徴ごとの平均から成る 1 行 numFeatures 列のベクトル、数値スカラー、または [] として指定します。

Mean プロパティを指定するには、Normalization プロパティが "zerocenter" または "zscore" でなければなりません。Mean[] の場合、学習時または初期化時にプロパティが自動的に設定されます。

  • 関数 trainnet は、学習データを使用して平均を計算し、結果の値を使用します。

  • Initialize オプションが 1 (true) の場合、関数 initialize および関数 dlnetwork は、プロパティを 0 に設定します。

Mean に複素数値を使用できます。 (R2024a 以降)Mean が複素数値の場合、SplitComplexInputs オプションは 0 (false) でなければなりません。

R2024a より前: 平均を実数部と虚数部に分割し、入力データが実数部と虚数部に分割されるように SplitComplexInputs オプションを 1 (true) に設定します。

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

z スコア正規化の標準偏差。特徴ごとの平均から成る 1 行 numFeatures 列のベクトル、数値スカラー、または [] として指定します。

StandardDeviation プロパティを指定するには、Normalization プロパティが "zscore" でなければなりません。StandardDeviation[] の場合、学習時または初期化時にプロパティが自動的に設定されます。

  • 関数 trainnet は、学習データを使用して標準偏差を計算し、結果の値を使用します。

  • Initialize オプションが 1 (true) の場合、関数 initialize および関数 dlnetwork は、プロパティを 1 に設定します。

StandardDeviation に複素数値を使用できます。 (R2024a 以降)StandardDeviation が複素数値の場合、SplitComplexInputs オプションは 0 (false) でなければなりません。

R2024a より前: 標準偏差を実数部と虚数部に分割し、入力データが実数部と虚数部に分割されるように SplitComplexInputs オプションを 1 (true) に設定します。

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

再スケーリングの最小値。特徴ごとの最小値から成る 1 行 numFeatures 列のベクトル、数値スカラー、または [] として指定します。

Min プロパティを指定するには、Normalization"rescale-symmetric" または "rescale-zero-one" でなければなりません。Min[] の場合、学習時または初期化時にプロパティが自動的に設定されます。

  • 関数 trainnet は、学習データを使用して最小値を計算し、結果の値を使用します。

  • Initialize オプションが 1 (true) の場合、関数 initialize および関数 dlnetwork は、Normalization"rescale-symmetric" の場合はプロパティを -1 に設定し、"rescale-zero-one" の場合はプロパティを 0 に設定します。

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

再スケーリングの最大値。特徴ごとの最大値から成る 1 行 numFeatures 列のベクトル、数値スカラー、または [] として指定します。

Max プロパティを指定するには、Normalization"rescale-symmetric" または "rescale-zero-one" でなければなりません。Max[] の場合、学習時または初期化時にプロパティが自動的に設定されます。

  • 関数 trainnet は、学習データを使用して最大値を計算し、結果の値を使用します。

  • Initialize オプションが 1 (true) の場合、関数 initialize および関数 dlnetwork は、プロパティを 1 に設定します。

データ型: 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 になります。

入力データが複素数値で、SplitComplexInputs0 (false) の場合、層は複素数値のデータを次の層に渡します。 (R2024a 以降)

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

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

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

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

データ型: char | string

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

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

データ型: double

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

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

データ型: cell

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

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

データ型: double

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

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

データ型: cell

すべて折りたたむ

21 個の特徴をもつ観測値について、名前が 'input' である特徴入力層を作成します。

layer = featureInputLayer(21,'Name','input')
layer = 
  FeatureInputLayer with properties:

                      Name: 'input'
                 InputSize: 21
        SplitComplexInputs: 0

   Hyperparameters
             Normalization: 'none'
    NormalizationDimension: 'auto'

特徴入力層を Layer 配列に含めます。

numFeatures = 21;
numClasses = 3;
 
layers = [
    featureInputLayer(numFeatures,'Name','input')
    fullyConnectedLayer(numClasses, 'Name','fc')
    softmaxLayer('Name','sm')
    classificationLayer('Name','classification')]
layers = 
  4x1 Layer array with layers:

     1   'input'            Feature Input           21 features
     2   'fc'               Fully Connected         3 fully connected layer
     3   'sm'               Softmax                 softmax
     4   'classification'   Classification Output   crossentropyex

入力イメージのサイズ、各観測値の特徴の数、クラスの数、畳み込み層のフィルターのサイズと数を定義します。

imageInputSize = [28 28 1];
numFeatures = 1;
numClasses = 10;
filterSize = 5;
numFilters = 16;

入力が 2 つあるネットワークを作成するには、ネットワークを 2 つの部分で定義して、それらを連結層を使用するなどして結合します。

dlnetwork オブジェクトを作成します。

net = dlnetwork;

ネットワークの最初の部分を定義します。イメージ分類層を定義し、最後の全結合層の前にフラット化層と連結層を含めます。

layers = [
    imageInputLayer(imageInputSize,Normalization="none")
    convolution2dLayer(filterSize,numFilters,Name="conv")
    reluLayer
    fullyConnectedLayer(50)
    flattenLayer
    concatenationLayer(1,2,Name="concat")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

net = addLayers(net,layers);

ネットワークの 2 番目の部分については、特徴入力層を追加し、それを連結層の 2 番目の入力に結合します。

featInput = featureInputLayer(numFeatures,Name="features");
net = addLayers(net,featInput);
net = connectLayers(net,"features","concat/in2")
net = 
  dlnetwork with properties:

         Layers: [9x1 nnet.cnn.layer.Layer]
    Connections: [8x2 table]
     Learnables: [6x3 table]
          State: [0x3 table]
     InputNames: {'imageinput'  'features'}
    OutputNames: {'softmax'}
    Initialized: 0

  View summary with summary.

ネットワークを可視化します。

plot(net)

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

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 つのカテゴリカル特徴量があります。

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

カテゴリカル入力変数をループ処理します。各変数について、関数 onehotencode を使用して categorical 値を one-hot 符号化ベクトルに変換します。

for i = 1:numel(categoricalPredictorNames)
    name = categoricalPredictorNames(i);
    tbl.(name) = onehotencode(tbl.(name),2);
end

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

head(tbl)
    SigMean     SigMedian    SigRMS    SigVar     SigPeak    SigPeak2Peak    SigSkewness    SigKurtosis    SigCrestFactor    SigMAD     SigRangeCumSum    SigCorrDimension    SigApproxEntropy    SigLyapExponent    PeakFreq    HighFreqPower    EnvPower    PeakSpecKurtosis    SensorCondition    ShaftCondition    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 = 2x1 cell
    {'No Tooth Fault'}
    {'Tooth Fault'   }

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

numObservations = size(tbl,1);
[idxTrain,idxTest] = trainingPartitions(numObservations,[0.85 0.15]);

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

関数 trainnet がサポートする形式にデータを変換します。予測子とターゲットをそれぞれ数値配列と categorical 配列に変換します。特徴量を入力する場合、ネットワークは、観測値に対応する行と特徴量に対応する列をもつデータを必要とします。データのレイアウトがこれとは異なる場合、このレイアウトになるようにデータを前処理するか、データ形式を使用してレイアウト情報を指定します。詳細については、Deep Learning Data Formatsを参照してください。

predictorNames = ["SigMean" "SigMedian" "SigRMS" "SigVar" "SigPeak" "SigPeak2Peak" ...
    "SigSkewness" "SigKurtosis" "SigCrestFactor" "SigMAD" "SigRangeCumSum" ...
    "SigCorrDimension" "SigApproxEntropy" "SigLyapExponent" "PeakFreq" ...
    "HighFreqPower" "EnvPower" "PeakSpecKurtosis" "SensorCondition" "ShaftCondition"];
XTrain = table2array(tblTrain(:,predictorNames));
TTrain = tblTrain.(labelName);

XTest = table2array(tblTest(:,predictorNames));
TTest = tblTest.(labelName);

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

numFeatures = size(XTrain,2);
numClasses = numel(classNames);
 
layers = [
    featureInputLayer(numFeatures,Normalization="zscore")
    fullyConnectedLayer(16)
    layerNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer];

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

  • L-BFGS ソルバーを使用して学習させます。このソルバーは、ネットワークが小さくデータがメモリに収まるタスクに適しています。

  • CPU を使用して学習させます。ネットワークとデータが小さいため、CPU の方がより適しています。

  • 学習の進行状況をプロットに表示します。

  • 詳細出力を非表示にします。

options = trainingOptions("lbfgs", ...
    ExecutionEnvironment="cpu", ...
    Plots="training-progress", ...
    Verbose=false);

関数 trainnet を使用してネットワークに学習させます。分類には、クロスエントロピー損失を使用します。

net = trainnet(XTrain,TTrain,layers,"crossentropy",options);

学習済みネットワークを使用してテスト データのラベルを予測します。学習済みネットワークを使用して分類スコアを予測し、関数 onehotdecode を使用して予測結果をラベルに変換します。

YTest = minibatchpredict(net,XTest);
YTest = onehotdecode(YTest,classNames,2);

混同チャートで予測を可視化します。

confusionchart(TTest,YTest)

分類精度を計算します。この精度は、ネットワークが正しく予測するラベルの割合です。

accuracy = mean(YTest == TTest)
accuracy = 1

アルゴリズム

すべて展開する

拡張機能

バージョン履歴

R2020b で導入

すべて展開する