私は(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
関数が間違った結果を得るのはなぜですか?
私は画像が_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になります。
現在コードが記述されているため、x
にdtype uint8
(あるようです)、減算はuint8で行われますが、除算は浮動小数点で行われます。
これを解決する最も簡単な方法は、128をフロートにして、フロートで減算を強制することです。
def normalize(x):
return (x - 128.0) / 128