Python MNISTデータセットでマシンラーニングに挑戦しよう

はじめに

画像の分類の分野で、Tensorflow、Kerasが活用されています。画像分類の予測精度がずば抜けて高く、注目されています。ここでは、MNISTと呼ばれる画像のデータセットを使って、ディープラーニングを行ってみましょう。

Tensorflowのインストール

pipコマンドでのインストールが可能です。このレッスンではTensorflowはCPU版を使用します。

コードを書く

scikit-learn, tensorflow, numpy, matplotlibのモジュールをインポートします。

  ロードし、訓練データを(train_data, train_label)に、テストデータを(test_data, test_label)にロードします。train_dataとtest_dataは画像データです。元のデータは画素のRGB値0~255で表わされていますが、規格化するために255で割って0~1の範囲になるようにしています。

 
ニューラルネットのモデルを作ります。外側の「tf.keras.models.Sequential」クラスは、層を順に並べることでネットワークを定義することを意味しています。「tf.keras.models.Flatten」クラスは入力を平滑化します。バッチサイズに影響を与えません。次の「tf.keras.layers.Dense(512, activation=tf.nn.relu)」が、入力層に接続する中間層に対応します。「Dense」クラスは、上位層との密な結合(つまり上位層との全ノードのペアについて辺がある)であることを示しています。Denseの第1引数は次層のノード数を示しています。activationとは、アクティベーション関数を示していて、ここではReLUを使っています。「tf.keras.layers.Dropout」クラスは入力にドロップアウトを適用します。訓練時の更新においてランダムに入力ユニットを0とする割合で,過学習の防止に役立ちます.次に出力層の定義として、「tf.keras.layers.Dense(512, activation=tf.nn.softmax)」を与えています。これも中間層と密に接続しています。アクティベーション関数はsoftmaxを使っています。
 
損失関数や最適化アルゴリズムなどを指定をしてコンパイルします。 ここで「optimizer=”adam”」は最適化アルゴリズムの指定で、「adam」という手法を使うということです。「loss=”sparse_categorical_crossentropy”」では損失関数を指定しています。この例は、出力がワンホットエンコーディングされているのに対し、訓練用データのラベルが0~2の分類値で与えられているので、こういう場合には「sparse_categorical_crossentropy」という損失関数が利用できます。metrics=[“accuracy”]というのは計算過程で何を表示するかを指定します。ここではaccuracy、つまりどのくらい正しく予測できているかを表示します。

訓練データを使って学習させてみます。epochsは繰り返し回数です。
実行結果は以下の通りです。損失は0.0679、正確性は0.980を得ました。

まとめ

MNISTの画像データの分類をTensorFlowで実装してみました。ここでの実装は説明のためシンプルなものを採用し、計算時間もそれなりに短時間に終わるようにしました。ているため、実際にこれ以上の精度を出そうとするとネットワーク構造やアルゴリズムをさらに工夫したし、計算リソースもそれなりに消費してもよいようにGPUのようなパワフルな装置を利用する必要があります。 Kerasのクラスは以下のURLからたどれるので、パラメータチューニングに役立ててください。 Keras Documentation