Python - MNIST データセットを正規化およびスケーリングする正しい方法

okwaves2024-01-25  8

あちこち探しましたが、欲しいものが見つかりませんでした。基本的に、MNIST データセットには、[0, 255] の範囲のピクセル値を持つ画像が含まれています。一般に、次のことを行うのが良いと言われています。

データを [0,1] の範囲にスケールします。 ゼロ平均と単位標準偏差 (データ - 平均) / std を持つようにデータを正規化します。

残念ながら、これらの両方を行う方法を示した人は誰もいません。これらはすべて平均 0.1307 を減算し、標準偏差 0.3081 で割ります。これらの値は基本的に、データセットの平均と標準偏差を 255 で割ったものです。

from torchvision.datasets import MNIST        
import torchvision.transforms as transforms 

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True)
print('Min Pixel Value: {} \nMax Pixel Value: {}'.format(trainset.data.min(), trainset.data.max()))
print('Mean Pixel Value {} \nPixel Values Std: {}'.format(trainset.data.float().mean(), trainset.data.float().std()))
print('Scaled Mean Pixel Value {} \nScaled Pixel Values Std: {}'.format(trainset.data.float().mean() / 255, trainset.data.float().std() / 255))

これにより、以下が出力されます

Min Pixel Value: 0 
Max Pixel Value: 255
Mean Pixel Value 33.31002426147461 
Pixel Values Std: 78.56748962402344
Scaled Mean: 0.13062754273414612 
Scaled Std: 0.30810779333114624

しかし明らかに、これは上記のいずれも行いません。結果のデータ 1) は [0, 1] の間にはなく、平均値 0 や標準値 1 も持ちません。実際、これは私たちが行うものです。やっていること:

[データ - (平均 / 255)] / (標準 / 255)

これはこれとは大きく異なります

[(scaled_data) - (平均/255)] / (標準/255)

ここで、scaled_data は単なるデータ / 255 です。



------------------------

オイラー_ソルター

これに気づくのが少し遅かったかもしれませんが、少しでもお役に立てれば幸いです。

torchvision.Transform を使用していると仮定すると、次のコードを使用して MNIST データセットを正規化できます。

        train_loader = torch.utils.data.DataLoader(
        datasets.MNIST('./data', train=True
        transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
        ])),

通常、「transforms.ToTensor()」は、[0,255] の範囲の入力データを 3 次元 Tensor に変換するために使用されます。この関数は、入力データを自動的に範囲にスケールします。f [0,1]。 (これは、データを 0,1 にスケールダウンすることと同じです)

したがって、「transforms.Normalize(...)」で使用される平均値と標準偏差がそれぞれ 0.1307 と 0.3081 になることは理にかなっています。 (これは、ゼロ平均と単位標準偏差を正規化することと同じです。)

より詳しい説明については、以下のリンクを参照してください。

https://pytorch.org/vision/stable/transforms.html

1

2

この回答は、OP の質問で尋ねられている重要な点に対応しています。

– シキン・メロトラ

2021 年 12 月 7 日 18:09



------------------------

あなたは 1 つの重要な概念を誤解しているようです。それは、これらが 2 つの異なる、一貫性のないスケーリング操作であるということです。 2 つのうち 1 つだけを持つことができます。

平均 = 0、標準偏差 = 1 データ範囲 [0,1]

[0,1] の範囲を考慮して考えてみましょう。データがすべて小さな正の値 (min=0、max=1) の場合、データの合計は正でなければならず、正の非値が得られます。ゼロの平均。同様に、どのデータも平均値と 1.0 も異なる可能性がない場合、stdev を 1 にすることはできません。

逆に、mean=0 の場合、データの一部は負である必要があります。

使用するのは 1 つだけです2つの変換のうち。どちらを使用するかは、データセットの特性によって決まり、最終的にはどちらがモデルに適しているかが決まります。

[0,1] スケーリングの場合は、単純に 255 で割ります。

mean=0、stdev=1 のスケーリングでは、すでに知っている単純な線形変換を実行します。

new_val = (old_val - old_mean) / old_stdev

これで分かりやすくなりましたか? それとも、私があなたの混乱のポイントを完全に見逃してしまったのでしょうか?

2

2

これでかなり明確になりましたが、問題は次のとおりです。値が範囲内に維持される場合[0, 255] であり、データは (スケーリングなしで) 正規化されているだけです。誰もが間違った平均と間違った標準偏差を使用しているようです。基本的には、データを [0, 1] にスケールした場合に得られる平均と標準偏差を使用します。

– オイラー_ソルター

2020 年 9 月 7 日 8:27

2

スケーリングなし (つまり [0, 255] の範囲) のデータの平均と標準は、33.31 と 78.56 です。代わりに、スケーリングされた平均値と標準偏差 (33 と 78 を 255 で割ったもの) は 0.1306 と 0.3081 です。何らかの理由で、スケーリングされていない場合でも、誰もがこれら 2 つのスケーリングされた値を使用します。[0, 1] の間のデータ。彼らはスケーリングされた平均/標準を使用していますが、データはスケーリングされていません!

– オイラー_ソルター

2020 年 9 月 7 日、8:30



------------------------

目的

機能をスケーリングする最も重要な理由は次の 2 つです。

特徴をスケーリングして、すべてが同じ大きさ (つまり、重要度または重み) になるようにします。

例:

年齢と体重という 2 つの特徴を持つデータセット。年齢は何年、体重はグラム! 20 歳代で体重がわずか 60kg の男性は、データセット全体に対してベクトル = [20 歳、60000g] などに変換されます。トレーニング プロセス中はウェイト アトリビュートが優先されます。それはどうですか、依存します使用しているアルゴリズムのタイプに関するDS - 一部のアルゴリズムは他のアルゴリズムよりも敏感です。勾配降下の学習率がニューラル ネットワーク シータ (つまり、重み) の大きさによって影響を受け、後者はトレーニング プロセス中に入力 (つまり、特徴) に相関して変化するニューラル ネットワーク。また、Feature Scaling により収束性が向上します。もう 1 つの例は、K 平均クラスタリング アルゴリズムは空間のすべての方向で等方性であるため、同じ大きさの特徴を必要とすることです。興味深いリスト。

機能を拡張して実行時間を短縮します。

これは簡単です。これらすべての行列の乗算とパラメータの合計は、非常に大きな数 (または特徴と他の p を乗算して生成される非常に大きな数) と比較して、小さな数の方が高速になります。パラメータ..etc)

種類

最も一般的なタイプのフィーチャー スケーラーは次のように要約できます。

StandardScaler: 通常は最初のオプションですが、非常によく使用されます。これは、データを標準化する (つまり、データを中心化する) ことによって機能します。つまり、データを STD=1 および Mean=0 にします。これは外れ値の影響を受けるため、データがガウス分布である場合にのみ使用する必要があります。

MinMaxScaler: 通常、すべてのデータ ポイントを特定の範囲 ([0-1] など) に収めたい場合に使用されます。 Range を使用するため、外れ値の影響を大きく受けます。

RobustScaler: 「堅牢」です。分位範囲に従ってデータをスケーリングするため、外れ値に対して有効です。ただし、スケーリングされたデータには外れ値が依然として存在することを知っておく必要があります。

MaxAbsScaler: 主に使用しますd はスパースデータの場合。

単位正規化: 基本的に、サンプルの分布とは関係なく、単位ノルムを持つように各サンプルのベクトルをスケーリングします。

どっちとどっち?幾つか

まず、データセットについて知る必要があります。上で述べたように、データの分布、外れ値の存在、使用されているアルゴリズムなど、事前に確認する必要がある事項があります。

いずれにしても、データが特定の範囲内にあり、平均が 0 で標準偏差が 1 である場合にのみ機能するアルゴリズムが存在する場合など、特定の要件がない限り、データセットごとに 1 つのスケーラーが必要です。それにもかかわらず、私はそのようなケースに遭遇したことがありません。

重要なポイント

機能スケーラーにはさまざまなタイプがあり、それらはいくつかの機能に基づいて使用されます。上記の経験則。

ランダムではなく、要件に基づいてスケーラーを 1 つ選択します。

目的のためにデータをスケーリングします。たとえば、ランダム フォレスト アルゴリズムでは、通常はスケーリングする必要がありません。

1

1

おそらく私の質問はその時点ではあまり明確ではありませんでした。問題は、人々が間違った平均値と間違った標準偏差を使用しているという事実です (少なくともそう見える)

– オイラー_ソルター

9 月 7 日2020 年 9 時 23 分



------------------------

torchvision.transforms.ToTensor() を使用してデータが [0,1] にスケーリングされ、正規化 (0.1306,0.3081) が適用されます。 これについては、Pytorch ドキュメント (https://pytorch.org/vision/stable/transforms.html) で確認できます。 それがあなたの質問の答えになることを願っています。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。