1. はじめに
AI開発、特にディープラーニングを学ぼうとするとき、多くの入門者が「TensorFlow (Keras)」や「PyTorch」といったフレームワークの選択に悩みます。どちらも強力ですが、思想や書き方が異なります。
この記事では、AI開発の第一歩として、シンプルであることが特徴とも言えるKerasにフォーカスし、なるべく少ないコードでAIモデルを構築し、学習させ、精度を出していきます。
2. データセットについて
今回の分析対象として、Fashion MNISTデータセットを使用します。
リンクは以下の通りです。
https://www.kaggle.com/datasets/zalando-research/fashionmnist
これは、有名な手書き数字(MNIST)データセットの「ファッション版」です。
データの中身: 28x28ピクセルの白黒画像(計70,000枚)
ラベル(正解): 以下の10種類
| ラベル (Label) | アイテム名 (Class) | 日本語 |
|---|---|---|
| 0 | T-shirt/top | Tシャツ/トップス |
| 1 | Trouser | ズボン |
| 2 | Pullover | プルオーバー |
| 3 | Dress | ドレス |
| 4 | Coat | コート |
| 5 | Sandal | サンダル |
| 6 | Shirt | シャツ |
| 7 | Sneaker | スニーカー |
| 8 | Bag | バッグ |
| 9 | Ankle boot | アンクルブーツ |
このデータセットを選んだ理由は以下の2点です。
-
データがCSVファイル(fashion-mnist_train.csv)として提供されており、扱いが簡単であること。
-
画像分類であり、CNNの威力を試すのに最適なお題であること。
3. 学習の流れについて
今回は、kerasというライブラリを使います。
Kerasの最大の魅力は「AIモデルをブロックのように積み上げて作れる」という、そのシンプルさと直感性にあります。
今回は、fashion-mnist_train.csv(学習データ60,000件)を使い、以下の流れでAIを構築します。
-
データの読み込みと前処理: CSVを読み込み、AIが学習できる形(テンソル)に変換します。
-
CNNモデルの構築: Sequential APIを使い、CNNモデルをレゴブロックのように構築します。
-
モデルの学習: model.compile() と model.fit() というたった2つのコマンドで学習を実行します。
-
学習結果の評価: 学習結果をprintします。
-
学習済みモデルの保存: 学習したAIをファイル(.keras)として出力します。
上記のステップを、次のスクリプトで実行できます。
4. 実行結果と考察
スクリプトは以下の通りです。
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
import io
import warnings
# 警告を非表示にする
warnings.filterwarnings('ignore')
# --- 1. データの読み込み ---
file_name = "fashion-mnist_train.csv"
try:
data = pd.read_csv(file_name)
print(f"'{file_name}' の読み込み成功。データ数: {len(data)}")
except FileNotFoundError:
print(f"エラー: ファイル '{file_name}' が見つかりません。")
exit()
except Exception as e:
print(f"エラーが発生しました: {e}")
exit()
# --- 2. データの前処理 ---
# ピクセルデータ (X) と ラベル (y) に分離
# X: pixel1 から pixel784 までのカラム
X_data = data.drop('label', axis=1).values
# y: label カラム
y_data = data['label'].values
# 正規化: ピクセル値 (0-255) を 0-1 の範囲に変換
X_data = X_data / 255.0
# データの形状を変更: (サンプル数, 784) -> (サンプル数, 28, 28, 1)
X_data = X_data.reshape(-1, 28, 28, 1)
# ラベルをワンホットエンコーディング
# (例: ラベル '2' -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
num_classes = 10 # 0から9までの10クラス
y_data = to_categorical(y_data, num_classes)
# データを「学習用」と「検証用」に分割 (80% 学習, 20% 検証)
# 本来のtest.csvを学習に使うため、その中でさらに分割して学習の進捗を監視します
X_train, X_val, y_train, y_val = train_test_split(
X_data, y_data, test_size=0.2, random_state=42
)
print(f"学習データ形状 (X): {X_train.shape}")
print(f"検証データ形状 (X): {X_val.shape}")
# --- 3. CNNモデルの構築 ---
model = keras.Sequential(
[
# 入力層: 28x28x1 の画像
keras.Input(shape=(28, 28, 1)),
# 畳み込み層 1: 32個の 3x3 フィルター, 活性化関数 ReLU
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
# プーリング層 1: 2x2 のウィンドウで最大値をとる
layers.MaxPooling2D(pool_size=(2, 2)),
# 畳み込み層 2: 64個の 3x3 フィルター
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
# プーリング層 2
layers.MaxPooling2D(pool_size=(2, 2)),
# 1次元に平坦化 (畳み込み層の出力を全結合層につなげるため)
layers.Flatten(),
# 過学習を防ぐためのドロップアウト層 (50%をランダムに無効化)
layers.Dropout(0.5),
# 全結合層 (出力: 10クラス分の確率)
# 活性化関数 softmax: 10クラスの確率の合計が1になるようにする
layers.Dense(num_classes, activation="softmax"),
]
)
# モデルの概要を表示
model.summary()
# --- 4. モデルのコンパイル ---
# 学習プロセスを設定
model.compile(
loss="categorical_crossentropy", # 損失関数: 多クラス分類のため
optimizer="adam", # 最適化アルゴリズム: adam
metrics=["accuracy"] # 評価指標: 正解率
)
# --- 5. モデルの学習 ---
batch_size = 128 # 128サンプルごとにモデルの重みを更新
epochs = 30 # データセット全体を30回学習
print("\n--- 学習開始 ---")
# モデルの学習を実行
history = model.fit(
X_train,
y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(X_val, y_val)
)
print("--- 学習完了 ---")
# 保存するファイル名を指定
model_filename = "fashion_mnist_cnn.keras"
# --- 6. モデルの保存 ---
try:
model.save(model_filename)
print(f"モデルを '{model_filename}' として正常に保存しました。")
except Exception as e:
print(f"モデルの保存中にエラーが発生しました: {e}")
スクリプトを実行すると、fashion-mnist_train.csv(60,000件)を8:2で分割し、学習データ(48,000件)と検証データ(12,000件)で学習が進みます。
学習は30エポックで完了し、最終的に検証用データ(未知のデータ)に対して91.63%という高い正解率を達成しました。
この学習結果のモデルは、model.save("fashion_mnist_cnn.keras") の1行で、保存されています。
5. おわりに
保存したkeras ファイルは、以下のコードで簡単に読み込んで、すぐに予測(推論)に使うことができます。
以下のコードでは、fashion-mnist_test.csvのデータに対して推論を行っています。
kerasでは、モデルの構造を再定義する必要がなく、load_model だけで完結する手軽さが特徴です。
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
# 予測用データの準備 (test.csv の先頭1枚)
try:
data_df = pd.read_csv("fashion-mnist_test.csv")
sample_data = data_df.iloc[0]
true_label = sample_data['label']
pixel_data = sample_data.drop('label').values / 255.0
keras_input = pixel_data.reshape(1, 28, 28, 1)
except FileNotFoundError:
print("test.csv が見つかりません。")
exit()
# モデルの読み込み (クラス定義は不要!)
keras_model_file = "fashion_mnist_cnn.keras"
loaded_model = keras.models.load_model(keras_model_file)
# 予測の実行
probabilities = loaded_model.predict(keras_input)
prediction = np.argmax(probabilities, axis=1)[0]
print(f"--- Kerasモデルの読込と予測 ---")
print(f"正解ラベル: {true_label}")
print(f"AIの予測: {prediction}")