web-dev-qa-db-ja.com

Numpy-RGBピクセル配列を正規化する

私は(34799, 32, 32, 3)という形のnumpy配列を持っています。これは(num examples, width, height, channels)を意味します。

次のコードで画像データを正規化します。

def normalize(x):
    return (x - 128) / 128

X_train_norm = normalize(X_train)

しかし、結果は正しくないようです。X_train[0][0][0]の値は[28 25 24]ですが、X_train_norm[0][0][0]の出力は[1.21875 1.1953125 1.1875]です。

次のテストコードを使用します。

test = np.array([[[[28, 25, 24]]]])
print ((test - 128) / 128)

出力:

[[[[-0.78125   -0.8046875 -0.8125   ]]]]

normalize関数が間違った結果を得るのはなぜですか?

8
jetta

私は画像が_uint8_と_0_の間の値を持つ_255_バイトで満たされた派手な配列として読み込まれると思います。

結果がnegativeになるように_uint8_で減算を実行すると、ラップアラウンドが発生します。 _123 - 128 == 251_のように、128で割ります。次に例を示します。

_>>> np.array([28,25,24], dtype=np.uint8) - 128
array([156, 153, 152], dtype=uint8)
_

次に、レポートを取得します。

_>>> (np.array([28,25,24], dtype=np.uint8) - 128)/128
array([1.21875  , 1.1953125, 1.1875   ])
_

それを解決するには、.astype(..)を使用できます。

_def normalize(x):
    return (x.astype(float) - 128) / 128_

これは関数を使用するという事実とは関係がないことに注意してください。元の配列で式を使用した場合、結果はsameになります。

5

現在コードが記述されているため、xにdtype uint8(あるようです)、減算はuint8で行われますが、除算は浮動小数点で行われます。

これを解決する最も簡単な方法は、128をフロートにして、フロートで減算を強制することです。

def normalize(x):
    return (x - 128.0) / 128
5
Jonas Adler