NetTrain
NetTrain[net,{input1output1,input2output2,…}]
入力として inputiを与え,自動的に選択された損失関数を使って outputiとネットの実際の出力との食い違いを最小限にすることで,指定されたニューラルネットを訓練する.
NetTrain[net,port1{data11,data12,…},port2{…},…]
指定されたポートで訓練データを与えることで指定されたネットを訓練する.
NetTrain[net,"dataset"]
Wolfram Data Repositoryからの名前付きのデータ集合で訓練する.
NetTrain[net,f]
訓練中に関数 f を呼んで,訓練データのバッチを生成する.
NetTrain[net,data,"prop"]
訓練セッションの特定の特性 prop に関連付けられたデータを与える.
訓練セッションの情報を要約するNetTrainResultsObject[…]を与える.
詳細とオプション
- NetTrainは,ニューラルネットワークがパターンを認識し,入力データと正しい出力に基づいてパラメータを調整することで予測を行うように訓練するために使われる.
- 訓練の間,重みやバイアスのようなネットワークのパラメータは,予測される出力と実際の出力の間の差を最小化するために傾斜降下のような最適化アルゴリズムを使って調整され,時間の経過とともにネットワークの確度は向上する.
- 形が固定されていないネットの任意の入力ポートは,訓練データの形から推測され,訓練データがImageオブジェクト等を含んでる場合にはNetEncoderオブジェクトが追加される.
- 次は,data の可能な形である.
-
"dataset" 名前付きのデータ集合 {input1output1,…} 入出力間のRuleのリスト {input1,…}->{output1,…} 入力と対応する出力の間のRule {port1…,…,…} 指定のポートについての入力の連想のリスト port1{data11,data12,…},… 指定のポートについての入力のリストの連想 Dataset[…] データ集合オブジェクト f 訓練バッチを作成する関数 - 個々の訓練データ入力は,スカラー,ベクトル,あるいは数値テンソルでよい.ネットに適切なNetEncoderオブジェクトがあるなら,入力はImageオブジェクト,文字列等を含むことができる.
- 次は,ニューラルネットアプリケーションの例としてよく使われる名前付きのデータ集合である.
-
"MNIST" 60,000例の分類済みの手書き数字 "FashionMNIST" 60,000例の分類済みの衣類画像 "CIFAR-10","CIFAR-100" 50,000例の分類済みの現実世界のオブジェクト "MovieReview" 10,662例の映画評の抜粋(感情表現あり) - 名前付きのデータ集合を訓練することは,ResourceData["dataset","TrainingData"]を,ResourceObject["dataset"]が存在しない場合はExampleData[{"MachineLearning","dataset"},"TrainingData"]を訓練することに等しい.名前付きのデータ集合がValidationSetオプションに使われた場合,それはResourceData["dataset","TestSet"]ありはExampleData[{"MachineLearning","dataset"},"TestData"]に等しい.
- 指定{input1output1,…}を使って訓練データを与える場合,ネットワークはすでに損失層を含んでいてはならず,入出力ポートの数は厳密に1つずつでなければならない.
- 訓練データを指定する追加的な形式として,{input1,input2,…}->{output1,…}と{port1…,port2…,…,port1…,…,…}がある.
- 損失層がNetTrainによって出力ポートに自動的に付加される場合,"Target"ポートはもとの出力ポートと同じ名前を使って訓練データから取られる.
- サポートされるオプション
-
BatchSize Automatic バッチごとにいくつの例を処理するか LearningRate Automatic 損失を最小にするために重みを調整する率 LearningRateMultipliers Automatic ネット内の相対学習率を設定する LossFunction Automatic 出力を査定する損失関数 MaxTrainingRounds Automatic 訓練データを何回横断するか Method Automatic 使用する訓練メソッド PerformanceGoal Automatic 特定の利点を持つ設定を優先する TargetDevice "CPU" 訓練を実施するターゲットデバイス TimeGoal Automatic 訓練する秒数 TrainingProgressMeasurements Automatic 訓練中の,モニター,追跡,プロットの測定 TrainingProgressCheckpointing None 部分的に訓練されたネットをどのようにして定期的に保存するか RandomSeeding 1234 擬似ランダム生成器を内部的にどのようにシードするか TrainingProgressFunction None 訓練中に定期的に呼び出す関数 TrainingProgressReporting Automatic 訓練中に進捗状況をどのようにレポートするか TrainingStoppingCriterion None 訓練をどのように自動停止するか TrainingUpdateSchedule Automatic ネットの特定の部分をいつ更新するか ValidationSet None 訓練中にそれについてモデルを評価するデータ集合 WorkingPrecision Automatic 浮動小数点計算の精度 - 損失がLossFunctionを使って明示的に与えられない場合は,ネット内の最終層(複数可)に基づいて自動的に損失関数が選ばれる.
- デフォルト設定のBatchSize->Automaticのときは,ネットワークの必要メモリとターゲットデバイスで使用可能なメモリ量に基づいてバッチサイズが自動的に選ばれる.自動的に選ばれる最大バッチサイズは64である.
- デフォルト設定のMaxTrainingRounds->Automaticのときは,約20秒間の訓練が行われるが,1万ラウンドを超えることはない.
- MaxTrainingRounds->n と設定すると,n ラウンドの訓練が行われる.1ラウンドは訓練データ集合全体を1回横断するものとして定義される.
- ValidationSetについて次の設定を与えることができる.
-
None 損失の推定に既存の訓練集合のみを使う(デフォルト) data 訓練データと同じ形式の検証集合 Scaled[frac] 指定された割合の訓練集合を検証集合として取っておく {spec,"Interval"int} 確認損失を計算する間隔を指定する - ValidationSet->{spec,"Interval"->int}の間隔は,訓練ラウンド n 回ごとに確認損失が計算されることを意味する整数 n,または,秒,分,あるいは時を単位とするQuantityでよい.
- "MNIST"のような名前付きのデータ集合については,ValidationSet->Automaticを指定すると対応する"TestData"コンテンツ要素が使われる.
- 検証集合が指定されると,NetTrainは訓練中にこの集合に対しての確認損失が最低だったネットを返す.
- NetTrain[net,f]の関数 f は<"BatchSize"n,"Round"r >に適用されて,訓練データの各バッチを{input1->output1,…}または<"port1"->data,… >の形式で生成する.
- NetTrain[net,{f,"RoundLength"->n}]を使って,訓練ラウンド中に約 n 例を生成するのに十分な回数 f を適用するように指定できる.デフォルトでは,訓練ラウンドごとに f が1回適用される.
- NetTrain[net,…,ValidationSet->{g,"RoundLength"->n}]を使って,確認損失と確度を計算する目的で約 n 例生成するために,関数 g をNetTrain[net,{f,"RoundLength"->n}]と同じように適用するように指定することができる.
- 次は,WorkingPrecisionの可能な設定である.
-
"Real32" 単精度実数を使う(32-bit) "Real64" 倍精度実数を使う(64-bit) "Mixed" ある種の操作で半精度実数を使う - WorkingPrecision->"Mixed"はTargetDevice->"GPU"でしかサポートされていないが,この結果ある種のデバイス上では大幅なパフォーマンスの向上になることがある.
- NetTrain[net,data,prop]の特性 prop は以下のいずれでもよい.
-
"TrainedNet" 見付かった最適な訓練済みネットワーク(デフォルト) "BatchesPerRound" 1ラウンドに含まれるバッチ数 "BatchLossList" 各バッチアップデートについての平均損失のリスト "BatchMeasurementsLists" 各バッチアップデートについての訓練測度の連想のリスト "BatchPermutation" 各バッチの作成に使用された訓練データからの指標配列 "BatchSize" BatchSizeの実質的な値 "BestValidationRound" 最終的な訓練を受けたネットに対応する訓練ラウンド "CheckpointingFiles" 訓練中に生成されたチェックポイントファイルのリスト "ExampleLosses" 訓練中の各例の損失 "ExamplesProcessed" 訓練中に処理された例の総数 "FinalLearningRate" 訓練終了時の学習率 "FinalNet" 検証集合その他の測度でのパフォーマンスに関係なく,訓練過程で生成された最終ネットワーク "FinalPlots" すべての損失と測定値のプロットの関連付け "InitialLearningRate" 訓練開始時の学習率 "LossPlot" 平均訓練損失の推移のプロット "MeanBatchesPerSecond" 1秒間に処理されるバッチの平均数 "MeanExamplesPerSecond" 1秒に処理される入力例の平均数 "NetTrainInputForm" NetTrainに対する発信呼出しを表す式 "OptimizationMethod" 使用された最適化メソッドの名前 "Properties" 使用可能な特性の完全リスト "ReasonTrainingStopped" なぜ訓練が停止したかについての簡単な説明 "ResultsObject" この表の使用可能なほとんどの特性を含むNetTrainResultsObject[…] "RoundLoss" 最近のラウンドの平均損失 "RoundLossList" 各ラウンドの平均損失のリスト "RoundMeasurements" 最近のラウンドについての訓練測度の連想 "RoundMeasurementsLists" 各ラウンドについての訓練測度の連想のリスト "RoundPositions" 各ラウンドの測度に対応するバッチ数 "TargetDevice" 訓練に使用されたデバイス "TotalBatches" 訓練中に遭遇したバッチ総数 "TotalRounds" 実行された訓練のラウンド総数 "TotalTrainingTime" 訓練にかかった総時間(単位:秒) "TrainingExamples" 訓練集合内の例の数 "TrainingNet" 訓練用に準備されたネットワーク "TrainingUpdateSchedule" TrainingUpdateScheduleの値 "ValidationExamples" 検証集合内の例の数 "ValidationLoss" 最近の確認測度について得られたValidationSetの平均損失 "ValidationLossList" 各確認測度についてのValidationSetの訓練測度のリスト "ValidationMeasurements" 最近の検証測定の後でのValidationSetについての訓練測度の連想 "ValidationMeasurementsLists" 各検証測度のValidationSetについての訓練測度の連想のリスト "ValidationPositions" 各検証測度に対応するバッチ数 "WeightsLearningRateMultipliers" 各重みに使われる学習率乗数の連想 - <"Property"->prop,"Form"->form,"Interval"->int >の形式の連想を使って,訓練中に繰り返し値が収集できるカスタム特性が指定できる.
- カスタム特性の prop の有効な設定はTrainingProgressFunctionで使用可能なすべての特性,あるいは,すべての特性の連想が与えられたユーザ定義の関数でよい.形式の有効な設定には,"List","TransposedList","Plot"がある."Interval"の有効な設定は,"Batch","Round",あるいはQuantity[…]である.サポートされる単位には,"Batches","Rounds","Percent"や,"Seconds","Minutes","Hours"のような時間の単位がある.
- NetTrain[net,data,{prop1,prop2,…}]は propiについての結果のリストを返す.
- NetTrain[net,data,All]は,大幅な追加計算や追加メモリを必要としない全特性の値を含むNetTrainResultsObject[…]を返す.
- デフォルト設定のValidationSet->Noneのとき,"TrainedNet"特性は訓練終了時と同じネットを与える.検証集合が与えられている場合,最適ネットを選択するデフォルトの基準はネットのタイプによって異なる.
-
classification net 誤り率が最低のネットを選ぶ.同率のものには最低損失で順位を付ける non-classification net 最低損失のネットを選ぶ - "TrainedNet"特性の選択に使われる基準は,TrainingStoppingCriterionオプションを使ってカスタマイズできる.
- 特性"BestValidationRound"は,最終ネットが選択された正確なラウンドを与える.
- Methodの可能な設定には以下がある.
-
"ADAM" 勾配の対角的リスケーリングに対して不変の適応的学習率を使った確率的勾配降下法 "RMSProp" 勾配の大きさの指数的平滑化平均に由来する適応的学習率を使った確率的勾配降下法 "SGD" 勢いがある通常の確率的勾配降下法 "SignSGD" 勾配の大きさが破棄される確率的勾配降下 - PerformanceGoalの有効な設定には,Automatic,"TrainingMemory","TrainingSpeed",あるいは結合する目標のリストがある.
- WorkingPrecisionの有効な設定には,単精度不動小数点を表すデフォルト値の"Real32",倍精度不動小数点を表す"Real64","Real32"と半精度の混合を表す"Mixed"がある.混合精度の訓練はGPUに対してのみサポートされている.
- 特定のメソッドのサブオプションはMethod{"method",opt1val1,…}で指定することができる.以下は,すべてのメソッドでサポートされているサブオプションである.
-
"LearningRateSchedule" Automatic 訓練の進行につれて学習率をどのようにスケールするか "L2Regularization" None すべての学習済みテンソルのL2ノルムに関連した大域的損失 "GradientClipping" None それを超えると勾配を切り取らなければならなくなる大きさ "WeightClipping" None それを超えると重みを切り取らなければならなくなる大きさ - "LearningRateSchedule"->f のとき,与えられたバッチの学習率は initial*f[batch,total]で計算される.batch は現行のバッチ数,total は訓練中に訪れる総バッチ数,initial はLearningRateオプションで指定した初期訓練率である.f が返す値は0から1までの数でなければならない.
- サブオプションの"L2Regularization","GradientClipping","WeightClipping"は次の形式で与えられる.
-
r ネット中のすべての重みに値 r を使う {lspec1r1,lspec2r2,…} ネットの指定の部分 lspeciに値 riを使う - 規則 lspeciriはLearningRateMultipliersについてのものと同じ形で与えられる.
- メソッド"SGD"については,追加的な次のサブオプションがサポートされている.
-
"Momentum" 0.93 導関数の更新中に前のステップをどの程度保存するか - メソッド"ADAM"については,追加的な次のサブオプションがサポートされている.
-
"Beta1" 0.9 一次モーメント推定についての指数関数的減衰率 "Beta2" 0.999 二次モーメント推定についての指数関数的減衰率 "Epsilon" 0.00001` 安定性パラメータ - メソッド"RMSProp"については,追加的な次のサブオプションがサポートされている.
-
"Beta" 0.95 勾配の大きさの移動平均について指数関数的減衰率 "Epsilon" 0.000001 安定性パラメータ "Momentum" 0.9 モーメント項 - "SignSGD"メソッドについては,次の追加的なサブオプションがサポートされている.
-
"Momentum" 0.93 導関数の更新中に前のステップをどの程度保存するか - ネットがすでに初期化されたあるいは前に訓練された重みを含んでいる場合,この重みは訓練前にNetTrainによって再度初期化されることはない.
例題
すべて開くすべて閉じる例 (6)
入力をTrueまたはFalseのどちらかに分類するパーセプトロンを訓練する:
NetDecoderを無効にして,入力がTrueになる確率を取得する:
入力列に見られる最大値を予測する回帰ネットワークを訓練する:
列の1要素が有効である場合にネットワークの出力をプロットする:
ネットを訓練し,訓練過程を要約する結果のオブジェクトを生成する:
スコープ (14)
データ形式 (7)
特性 (4)
訓練セッションのためにNetTrainResultsObjectを入手する:
通常の形でのNetTrainの呼出しを得る:
たたみ込みネットの訓練中の配列ごとの傾きの重みの大きさの進化のプロットを得る:
MNISTデータ集合で訓練し,個々の例の損失を経過時間とともに記録する:
各例の平均損失を計算して最も難しい例を求め,損失が最も高かった20の例の指標を取る:
"0","3","8","9"の4つの数字について,損失と誤り率の平均進化を示す:
オプション (27)
BatchSize (1)
LearningRateMultipliers (1)
LossFunction (4)
デフォルトの損失をSoftmaxLayerから生成されていない場合の出力に適用して,MeanSquaredLossLayerを使って単純なネットを訓練する:
ネットワークの出力に付加するためにこれとは異なる損失層を指定する.まず,損失層を作る:
長さ2のベクトルを取りLessかGreaterのどちらかのクラスラベルを作成するネットを作る:
NetTrainはCrossEntropyLossLayerオブジェクトを正しいクラスエンコーダとともに自動的に使う:
ターゲットが各クラスについての確率の形であると期待する明示的な損失層を作る:
こうすると,訓練データは記号クラスではなく確率ベクトルからなるようになる:
評価ネットワークの損失を明示的に計算する「損失ネット」を作る(ここでは,カスタム損失はMeanSquaredLossLayerに等しい):
"Loss"という名前の出力ポートを損失として解釈するように指定して,このネットを合成データについて訓練する:
NetExtractを使って訓練された"evaluation"ネットワークを得る:
Part構文を使うこともできる:
出力と損失を生成するためには,このネットワークには入力とターゲットが必要である:
特定の出力を損失として使って訓練する.その他の出力はすべて無視する:
NetTakeを使って希望する入出力以外のすべてを削除する:
MaxTrainingRounds (2)
MaxTrainingRoundsとTimeGoalの両方が指定されると,両者のうちの短い方が使われる(この例は,初回の前処理によるオーバーヘッドを避けるために2回実行しなければならない点に注意の事):
Method (2)
TargetDevice (1)
TrainingProgressCheckpointing (1)
TrainingProgressFunction (1)
TrainingProgressFunctionを使って訓練状態に関する情報をファイルに加える.ログファイルを作る:
保存されたデータをDatasetに置く:
TrainingProgressMeasurements (1)
TrainingProgressReporting (6)
TrainingStoppingCriterion (1)
確認損失が改善しなくなった場合は,訓練を中止して過剰適合を防ぐ.簡単なネットと訓練データおよび検証データを設定する:
確認損失が改善しなくなった場合は,TrainingStoppingCriterionを使って訓練を停止する:
確認損失が5ランド以上続けて少なくとも0.001改善しなくなったら,TrainingStoppingCriterionを使って訓練を停止する:
TrainingUpdateSchedule (1)
生成器と弁別装置の更新を交互に行うことでNetGANOperatorを訓練する:
ValidationSet (1)
ValidationSetをNetTrainに与えて過剰適合を防ぐ.ガウス曲線に基づいて合成訓練データを作る:
結果のネットはもとになっている関数に加えてノイズも学習してしまい,過剰適合となる:
ValidationSetオプションを使って訓練中に確認損失が最小になったネットをNetTrain に選ばせる.NetTrainは訓練データの20%をランダムに選んで検証集合を作る:
NetTrainが返した結果は,確認損失で測定できるように,検証集合内の点に最もよく一般化されたネットである.訓練データに存在するノイズが検証集合中のノイズと相関しないので,これは過剰適合に不利に働く:
特性と関係 (2)
考えられる問題 (1)
デフォルトで,NetTrainはRandomSeeding1234を使う.こうすると,NetTrainが繰り返し呼ばれるたびに同じランダムシードを使って初期化が行われる:
RandomSeedingAutomaticを使ってNetTrainが呼ばれるたびに異なる初期化を使うようにする:
インタラクティブな例題 (1)
テキスト
Wolfram Research (2016), NetTrain, Wolfram言語関数, https://reference.wolfram.com/language/ref/NetTrain.html (2022年に更新).
CMS
Wolfram Language. 2016. "NetTrain." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2022. https://reference.wolfram.com/language/ref/NetTrain.html.
APA
Wolfram Language. (2016). NetTrain. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/NetTrain.html