0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-11-18

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点です。

  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}")

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?