Deep-learning-with-keras-preparing-data

提供:Dev Guides
移動先:案内検索

Kerasによるディープラーニング-データの準備

データをネットワークに送る前に、ネットワークで必要な形式に変換する必要があります。 これは、ネットワークのデータの準備と呼ばれます。 これは通常、多次元入力を1次元ベクトルに変換し、データポイントを正規化することで構成されます。

入力ベクトルの変形

データセット内の画像は、28 x 28ピクセルで構成されています。 これをネットワークにフィードするには、サイズ28 * 28 = 784の1次元ベクトルに変換する必要があります。 これを行うには、ベクターの reshape メソッドを呼び出します。

X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

これで、トレーニングベクトルは60000個のデータポイントで構成され、それぞれがサイズ784の単一次元ベクトルで構成されます。 同様に、テストベクトルはサイズ784の1次元ベクトルの10000データポイントで構成されます。

データの正規化

現在、入力ベクトルに含まれるデータには、0〜255の離散値(グレースケールレベル)があります。 これらのピクセル値を0と1の間で正規化すると、トレーニングの速度が上がります。 確率的勾配降下法を使用するので、データを正規化することは、局所最適に行き詰まる可能性を減らすのにも役立ちます。

データを正規化するには、次のコードスニペットに示すように、データを浮動小数点型として表し、255で除算します-

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train/= 255
X_test/= 255

次に、正規化されたデータがどのように見えるかを見てみましょう。

正規化されたデータの調査

正規化されたデータを表示するには、ここに示すようにヒストグラム関数を呼び出します-

plot.hist(X_train[0])
plot.title("Digit: {}".format(y_train[0]))

ここでは、 X_train ベクトルの最初の要素のヒストグラムをプロットします。 このデータポイントで表される数字も出力します。 上記のコードを実行した出力はここに示されています-

正規化されたデータ

ゼロに近い値を持つポイントの濃い密度に気づくでしょう。 これらは画像の黒い点であり、明らかに画像の主要部分です。 白色に近い残りのグレースケールポイントは、数字を表します。 ピクセルの分布を別の数字で確認できます。 以下のコードは、トレーニングデータセットのインデックス2にある数字のヒストグラムを出力します。

plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])

上記のコードを実行した出力は以下に示されています-

トレーニングデータセット

上の2つの図を比較すると、2つの画像の白いピクセルの分布が異なっており、上の2つの図の「5」と「4」が異なる数字であることを示しています。

次に、完全なトレーニングデータセット内のデータの分布を調べます。

データ分布の調査

データセットで機械学習モデルをトレーニングする前に、データセット内の一意の数字の分布を知っておく必要があります。 私たちの画像は、0から9までの10の異なる数字を表しています。 データセットの桁数0、1などを知りたいのですが。 この情報は、Numpyの unique メソッドを使用して取得できます。

次のコマンドを使用して、一意の値の数と各値の出現数を出力します

print(np.unique(y_train, return_counts=True))

上記のコマンドを実行すると、次の出力が表示されます-

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]))

これは、0〜9の10の異なる値があることを示しています。 数字の0は5923回、数字の1は6742回発生します。 出力のスクリーンショットはここに示されています-

個別の値

データ準備の最後のステップとして、データをエンコードする必要があります。

データのエンコード

データセットには10​​個のカテゴリがあります。 したがって、ワンホットエンコーディングを使用して、これらの10のカテゴリで出力をエンコードします。 Numpyユーティリティのto_categorialメソッドを使用してエンコードを実行します。 出力データがエンコードされた後、各データポイントはサイズ10の1次元ベクトルに変換されます。 たとえば、数字5は[0,0,0,0,0,1,0,0,0,0]として表されます。

次のコードを使用してデータをエンコードします-

n_classes = 10
Y_train = np_utils.to_categorical(y_train, n_classes)

分類されたY_trainベクトルの最初の5つの要素を出力して、エンコードの結果を確認できます。

次のコードを使用して、最初の5つのベクトルを印刷します-

for i in range(5):
   print (Y_train[i])

次の出力が表示されます-

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

最初の要素は数字5を表し、2番目の要素は数字0を表します。

最後に、テストデータも分類する必要があります。これは次のステートメントを使用して行われます-

Y_test = np_utils.to_categorical(y_test, n_classes)

この段階で、データはネットワークにフィードするために完全に準備されています。

次に、最も重要な部分が来ます。それがネットワークモデルのトレーニングです。