ななぶろ

-お役立ち情報を気楽に紹介するブログ-

Kerasを使った機械学習プログラム例

はじめに

機械学習は、コンピュータがデータから学習し、予測や意思決定を行う技術です。近年、その重要性はますます高まっており、様々な分野で活用されています。しかし、「難しそう…」と感じる方もいるかもしれません。

そこで今回は、Pythonの深層学習ライブラリであるKerasを使った機械学習プログラム例を紹介します。Kerasは使いやすさに重点を置いて設計されており、初心者でも比較的簡単に深層学習モデルを構築できます。

この記事では、Kerasの基本的な使い方から、具体的なプログラム例を通して、機械学習の基礎と実践的なスキルを身につけていただけるように解説していきます。

1. Kerasとは?

Kerasは、TensorFlowやTheanoなどのバックエンド上で動作する高レベルなニューラルネットワークAPIです。以下の特徴を持つことで、深層学習の導入を容易にしています。

  • 使いやすさ: シンプルで直感的なAPI設計により、コード量を削減し、開発効率を高めます。
  • モジュール性: 各レイヤーやモデルを個別に定義・組み合わせることができ、柔軟なモデル構築が可能です。
  • 拡張性: 独自のレイヤーや損失関数などを追加することで、既存の機能を拡張できます。
  • 多様なバックエンド: TensorFlow, Theano, CNTKなど、複数のバックエンドに対応しており、環境に合わせて選択できます。

2. 機械学習の基本的な流れ

機械学習プログラムを構築する一般的な流れは以下の通りです。

  1. データ収集: 学習に必要なデータを集めます。
  2. データ前処理: 欠損値の補完、外れ値の除去、データの正規化など、モデルが学習しやすいようにデータを加工します。
  3. モデル選択: 問題に適した機械学習モデルを選択します。(今回はニューラルネットワークを使用)
  4. モデル構築: Kerasを使って、ニューラルネットワークの構造を定義します。
  5. モデル学習: 収集・前処理したデータを用いて、モデルを学習させます。
  6. モデル評価: 学習済みモデルの性能を検証用データで評価します。
  7. モデル改善: 必要に応じて、モデルの構造やパラメータを調整し、再度学習と評価を行います。

3. Kerasを使ったプログラム例:手書き数字認識 (MNIST)

今回は、機械学習の定番問題である「手書き数字認識」に挑戦します。MNISTは、0から9までの手書き数字が6万件収録されたデータセットです。KerasにはMNISTのサンプルコードが用意されており、これを利用して簡単にニューラルネットワークを構築できます。

3.1 必要なライブラリのインストール

まず、KerasとTensorFlowをインストールする必要があります。以下のコマンドでインストールできます。

pip install tensorflow keras numpy matplotlib
  • tensorflow: Kerasのバックエンドとして使用する深層学習フレームワークです。
  • keras: ニューラルネットワークAPIです。
  • numpy: 数値計算ライブラリです。
  • matplotlib: グラフ描画ライブラリです。

3.2 プログラムコード

以下のPythonコードは、MNISTデータセットを使って手書き数字を認識する簡単なニューラルネットワークの例です。

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

# データの読み込み
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 画像の形状を調整(グレースケール画像)
train_images = train_images.reshape((60000, 28 * 28))
test_images = test_images.reshape((10000, 28 * 28))

# データの正規化 (0-1の範囲に変換)
train_images = train_images / 255.0
test_images = test_images / 255.0

# モデルの構築
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))  # 入力層 (784は画像のピクセル数)
model.add(Dropout(0.2)) # 過学習を防ぐためのドロップアウト
model.add(Dense(10, activation='softmax')) # 出力層 (10クラス: 0-9の数字)

# モデルのコンパイル
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# モデルの学習
model.fit(train_images, train_labels, epochs=2) # エポック数: 学習データの繰り返し回数

# モデルの評価
loss, accuracy = model.evaluate(test_images, test_labels)
print('Test accuracy:', accuracy)

3.3 コード解説

  1. ライブラリのインポート: 必要なライブラリをインポートします。
  2. データの読み込み: mnist.load_data() 関数を使って、MNISTデータセットを読み込みます。この関数は、学習用データ (train_images, train_labels) と検証用データ (test_images, test_labels) を返します。
  3. 画像の形状の調整: MNISTの画像は28x28ピクセルのグレースケール画像です。ニューラルネットワークに入力するため、画像を1次元配列にreshapeします。
  4. データの正規化: 画像のピクセル値は0から255の範囲で表現されています。これを0から1の範囲に正規化することで、学習が安定しやすくなります。
  5. モデルの構築: Sequential モデルを使って、ニューラルネットワークを構築します。
    • Dense(512, activation='relu', input_shape=(784,)): 隠れ層を追加します。relu は活性化関数の一つで、非線形性を導入するために使用されます。input_shape=(784,) は入力データの形状を指定します (28x28 = 784)。
    • Dropout(0.2): ドロップアウト層を追加します。ドロップアウトは、学習中にランダムにニューロンを無効化することで、過学習を防ぎます。
    • Dense(10, activation='softmax'): 出力層を追加します。softmax 活性化関数は、各クラスの確率を出力します (0から9の数字)。
  6. モデルのコンパイル: model.compile() 関数を使って、モデルをコンパイルします。
    • optimizer='adam': 最適化アルゴリズムを指定します。Adamは、勾配降下法の一種で、学習効率が高いとされています。
    • loss='sparse_categorical_crossentropy': 損失関数を指定します。sparse_categorical_crossentropy は、多クラス分類問題に適した損失関数です。
    • metrics=['accuracy']: 評価指標を指定します。ここでは、正解率 (accuracy) を評価指標として使用します。
  7. モデルの学習: model.fit() 関数を使って、モデルを学習させます。
    • train_images, train_labels: 学習用データとラベルを指定します。
    • epochs=2: エポック数を指定します。エポック数とは、学習データを何回繰り返して学習させるかを表します。
  8. モデルの評価: model.evaluate() 関数を使って、学習済みモデルを評価します。
    • test_images, test_labels: 検証用データとラベルを指定します。
    • この関数は、損失 (loss) と正解率 (accuracy) を返します。

3.4 実行結果の確認

プログラムを実行すると、学習の進行状況が表示され、最後にテストデータの正解率が出力されます。この例では、エポック数を2に設定しているため、比較的短い時間で学習が終了し、ある程度の精度が得られます。

4. モデルの改善

上記のコードはあくまで基本的な例です。モデルの性能を向上させるためには、以下の点を試してみることができます。

  • 層の追加: より深いニューラルネットワークを構築することで、より複雑なパターンを学習できるようになります。
  • 活性化関数の変更: relu 以外の活性化関数 (sigmoid, tanh など) を試してみることで、最適な活性化関数を見つけることができます。
  • 最適化アルゴリズムの変更: Adam 以外の最適化アルゴリズム (SGD, RMSprop など) を試してみることで、学習効率を向上させることができます。
  • エポック数の調整: エポック数を増やすことで、より多くの学習を行うことができますが、過学習に注意が必要です。
  • ドロップアウト率の調整: ドロップアウト率を調整することで、過学習を防ぎつつ、モデルの汎化性能を高めることができます。
  • データの拡張: 学習データを水増しすることで、モデルの汎化性能を高めることができます (例: 画像の回転、反転など)。

5. まとめ

この記事では、Kerasを使った機械学習プログラムの基本的な流れと、手書き数字認識 (MNIST) の例を紹介しました。Kerasは使いやすさに重点を置いて設計されており、初心者でも比較的簡単に深層学習モデルを構築できます。

今回紹介した内容は、機械学習のほんの一部のものです。しかし、この基礎を理解することで、より複雑な問題を解決するための足がかりとなります。ぜひ、色々なデータセットやモデルを試して、機械学習の世界を探求してみてください。

さらに学ぶために:

  • Keras 公式ドキュメント: https://keras.io/
  • TensorFlow 公式ドキュメント: https://www.tensorflow.org/
  • オンラインコース: Coursera, Udemy などで、機械学習や深層学習に関する様々なコースが提供されています。

このガイドが、あなたの機械学習の学習の一助となれば幸いです。頑張ってください!