Keras 最初のニューラルネットワーク

Keras は、Python で書かれた高レベルニューラルネットワーク API であり、TensorFlow、CNTK、Theano の上で動作します。その開発は高速な実験をサポートすることに重点を置いており、最小限のコードでアイデアから結果への迅速な変換を実現します。

Keras の主な特徴

  • ユーザーフレンドリー:Keras はシンプルで一貫性のあるインターフェースを備えています
  • モジュール性:ニューラルネットワークのさまざまなコンポーネント(レイヤー、オプティマイザー、初期化スキームなど)はすべて組み合わせ可能なモジュールです
  • 拡張の容易さ:新しい研究アイデアを表現するために、新しいモジュールを簡単に追加できます
  • マルチバックエンド対応:計算バックエンドとして TensorFlow、Theano、CNTK をシームレスに切り替えることができます

Keras のインストール

始める前に、Keras とそのバックエンドエンジン(ここでは TensorFlow を使用します)をインストールする必要があります:

pip install tensorflow keras

注意:Keras 2.4.0 以降は TensorFlow に統合されているため、直接tensorflow.keras使用


最初のニューラルネットワークを構築する

シンプルな全結合ニューラルネットワークから始めて、定番の MNIST 手書き数字認識問題を解決しましょう。

1. 必要なライブラリをインポートする

サンプル

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

2. データを準備する

MNIST データセットには、60,000 枚のトレーニング画像と 10,000 枚のテスト画像が含まれており、各画像は 28x28 ピクセルの手書き数字のグレースケール画像です。

サンプル

# データの読み込み
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# データの前処理
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255

# ラベルを one-hot エンコーディングに変換する
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

3. モデルを構築する

入力層、隠れ層、出力層を含むシンプルな全結合ネットワークを構築します。

サンプル

model = keras.Sequential([
    layers.Dense(512, activation="relu", input_shape=(784,)),
    layers.Dense(10, activation="softmax")
])

モデル構造の解析

サンプル

graph TD
A[入力層 784個のニューロン] --> B[隠れ層 512個のニューロン, ReLU活性化]
B --> C[出力層 10個のニューロン, Softmax活性化]

4. モデルをコンパイルする

モデルをトレーニングする前に、学習プロセスを設定する必要があります:

サンプル

model.compile(
    optimizer="rmsprop",
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

コンパイルパラメータの説明

パラメータ 説明 一般的な値
optimizer オプティマイザー、重みの更新に使用 "rmsprop", "adam", "sgd"
loss 損失関数、モデルの予測と真値の差を測定 "categorical_crossentropy" (分類), "mse" (回帰)
metrics 評価指標、トレーニングの監視に使用 ["accuracy"]

5. モデルをトレーニングする

それでは、モデルのトレーニングを開始できます:

サンプル

history = model.fit(
    x_train, y_train,
    batch_size=128,
    epochs=10,
    validation_split=0.2
)

トレーニングパラメータの説明

パラメータ 説明 推奨値
batch_size 各勾配更新で使用するサンプル数 32-256
epochs トレーニングのエポック数 データの複雑さに応じて調整
validation_split 検証セットとして使用するトレーニングデータの割合 0.1-0.3

6. モデルを評価する

トレーニング完了後、テストセットでモデルのパフォーマンスを評価できます:

サンプル

test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"テスト精度: {test_acc:.4f}")

完全なコード例

サンプル

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

# 1. データの読み込み
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# 2. 前処理
x_train = x_train.reshape(60000, 784).astype("float32") / 255
x_test = x_test.reshape(10000, 784).astype("float32") / 255
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

# 3. モデルの構築
model = keras.Sequential([
    layers.Dense(512, activation="relu", input_shape=(784,)),
    layers.Dense(10, activation="softmax")
])

# 4. モデルのコンパイル
model.compile(
    optimizer="rmsprop",
    loss="categorical_crossentropy",
    metrics=["accuracy"]
)

# 5. モデルのトレーニング
history = model.fit(
    x_train, y_train,
    batch_size=128,
    epochs=10,
    validation_split=0.2
)

# 6. モデルの評価
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"テスト精度: {test_acc:.4f}")

モデル改善のアドバイス

1、Dropout 層を追加する:過学習を防ぐ

サンプル

model.add(layers.Dropout(0.5))

2、より高度なオプティマイザーを使用する:例: Adam

サンプル

model.compile(optimizer="adam", ...)

3、隠れ層を追加する:より深いネットワークを構築する

サンプル

model.add(layers.Dense(256, activation="relu"))

4、畳み込み層を使用する:画像データに対してより効果的

サンプル

model.add(layers.Conv2D(32, (3, 3), activation="relu"))

よくある質問

Q1: モデルの精度が低いのはなぜですか?

  • データの前処理が正しいか確認する
  • 学習率を調整してみる
  • ネットワークの容量を増やす(層を増やす、またはニューロンを増やす)

Q2: トレーニング中に loss が下がらない場合はどうすればよいですか?

  • データに問題がないか確認する
  • 別のオプティマイザーを試す
  • 学習率を調整する(通常は学習率を下げる)

Q3: トレーニング済みモデルを保存および読み込むにはどうすればよいですか?

サンプル

# モデルの保存
model.save("mnist_model.h5")

# モデルの読み込み
loaded_model = keras.models.load_model("mnist_model.h5")
その他の拡張