Back to Blog
2025.11.24 AI活用 ad-logos

kerasを使ってファッションの画像分類を行ってみた

1. はじめに

AI開発、特にディープラーニングを学ぼうとするとき、多くの入門者が「TensorFlow (Keras)」や「PyTorch」といったフレームワークの選択に悩みます。どちらも強力ですが、思想や書き方が異なります。

この記事では、AI開発の第一歩として、シンプルであることが特徴とも言えるKerasにフォーカスし、なるべく少ないコードでAIモデルを構築し、学習させ、精度を出していきます。

2. データセットについて

今回の分析対象として、Fashion MNISTデータセットを使用します。
リンクは以下の通りです。
https://www.kaggle.com/datasets/zalando-research/fashionmnist

これは、有名な手書き数字(MNIST)データセットの「ファッション版」です。

データの中身: 28×28ピクセルの白黒画像(計70,000枚)

ラベル(正解): 以下の10種類

ラベル (Label)アイテム名 (Class)日本語
0T-shirt/topTシャツ/トップス
1Trouserズボン
2Pulloverプルオーバー
3Dressドレス
4Coatコート
5Sandalサンダル
6Shirtシャツ
7Sneakerスニーカー
8Bagバッグ
9Ankle bootアンクルブーツ

このデータセットを選んだ理由は以下の2点です。

  1. データがCSVファイル(fashion-mnist_train.csv)として提供されており、扱いが簡単であること。
  2. 画像分類であり、CNNの威力を試すのに最適なお題であること。

3. 学習の流れについて

今回は、kerasというライブラリを使います。

Kerasの最大の魅力は「AIモデルをブロックのように積み上げて作れる」という、そのシンプルさと直感性にあります。

今回は、fashion-mnist_train.csv(学習データ60,000件)を使い、以下の流れでAIを構築します。

  1. データの読み込みと前処理: CSVを読み込み、AIが学習できる形(テンソル)に変換します。
  2. CNNモデルの構築: Sequential APIを使い、CNNモデルをレゴブロックのように構築します。
  3. モデルの学習: model.compile() と model.fit() という2つのコマンドで学習を実行します。
  4. 学習結果の評価: 学習結果をprintします。
  5. 学習済みモデルの保存: 学習した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}")