Model.train() および model.eval()、標準化、正規化、ドロップアウト、バッチ正規化の一般的な理解

目次

model.train() と model.eval()

正規化

標準化

バッチ正規化

脱落

TensorFlow と pytorch のドロップアウト パラメータ p

relu、sigmiod、tanh活性化関数

nn.Linear

model.train() と model.eval()

モデルに BN レイヤー (バッチ正規化) またはドロップアウトがある場合、2 つの違いがあります。

いる必要があります

トレーニング中、model.train() は BN 層がデータの各バッチの平均と分散を使用することを保証しDropout はネットワーク接続の一部をランダムに選択してパラメーターをトレーニングおよび更新します。

model.eval() をテストすると、 BN がすべてのトレーニング データの平均と分散を使用しDropout がすべてのネットワーク接続を使用することが保証されます。

pytorch は自動的に BN と DropOut を修正し、平均を取るのではなく、トレーニングされた値を使用します

標準化と正規化の両方が特定の機能 (特定の列) で動作します。

例:各サンプル (行) の特徴の 3 つの列: 身長、体重、血圧。

正規化

トレーニングセット内の数値特徴の列 (i ii 列と想定)の値を 0 から 1 の間でスケーリングします。

X の最大値または最小値が孤立した極値である場合、パフォーマンスに影響します。

標準化

トレーニング セット内の数値特徴の列 (i 番目の列と想定) の値を、平均 0 および分散 1 の状態にスケーリングします。

x_nor = (x-mean(x))/std(x)=入力データ-データ平均)/データ標準偏差

バッチ正規化

batch_size: 一度にトレーニングのためにプログラムに渡されるデータ (サンプル) の数を示します

ネットワークの途中で各レイヤーを正規化し、バッチ正規化変換を使用して、各レイヤーによって抽出された特徴分布が破壊されないようにします。
トレーニングはミニバッチごとですが、テストは多くの場合、単一の画像に対して行われます。つまり、ミニバッチの概念はありません。パラメータはネットワークのトレーニング後に固定されるため、各バッチの平均と分散は一定であり、すべてのバッチの平均と分散は直接解決されます。すべてのバッチ正規化は、トレーニングとテスト中に異なる方法で動作します。

脱落

各トレーニング バッチで、特徴検出器の半分を無視することで、オーバーフィッティングを大幅に削減できます。

トレーニング中、各隠れ層のニューロンは、破棄される確率 P を掛けてからアクティブ化されます。
テストでは、最初にすべてのニューロンがアクティブ化され、次に各隠れ層ニューロンの出力に破棄される確率が乗算されます。

TensorFlow と pytorch のドロップアウト パラメータ p

TensorFlow でp(keep_prob)予約されているノード数の比率

pytorch のこの層 (レイヤー) のニューロンp:は、トレーニングの各反復中に p の可能性でランダムに破棄 (非アクティブ化) され、トレーニングに参加しません

#随机生成tensor
a = torch.randn(10,1)
>>> tensor([[ 0.0684],
        [-0.2395],
        [ 0.0785],
        [-0.3815],
        [-0.6080],
        [-0.1690],
        [ 1.0285],
        [ 1.1213],
        [ 0.5261],
        [ 1.1664]])
torch.nn.Dropout(0.5)(a)
>>> tensor([[ 0.0000],  
        [-0.0000],  
        [ 0.0000],  
        [-0.7631],  
        [-0.0000],  
        [-0.0000],  
        [ 0.0000],  
        [ 0.0000],  
        [ 1.0521],  
        [ 2.3328]])

数値変化:2.3328=1.1664*2

relu、sigmiod、tanh活性化関数

ニューラルネットワークでは、元の入力と出力は線形の関係であり、

しかし実際には、多くの問題は非線形です (たとえば、住宅面積の増加に伴って住宅価格が直線的に上昇することはありません)。

このとき、ニューラル ネットワークの線形出力が活性化関数に渡され、元の線形関係が非線形になり、ニューラル ネットワークのパフォーマンスが向上します。

nn.Linear

入力データに対して線形変換を実行します

>>> m = nn.Linear(20, 30)
>>> input = torch.randn(128, 20)
>>> output = m(input)
>>> print(output.size())
torch.Size([128, 30])

Tensor のサイズが 128 x 20 から 128 x 30 に変更されました

実行されるアクションは次のとおりです。

[128,20]×[20,30]=[128,30]

参考リンク:Pytorch study notes 11 - model.train()とmodel.eval()の使い方、ドロップアウト原理、relu、sigmiod、tanh活性化関数、nn.Linear解析、テンソル全体の出力方法 - 雨上がりのマウンテンビュー- ブログガーデン

標準化と正規化 超詳細解説

おすすめ

転載: blog.csdn.net/qq_28838891/article/details/127721891