scikit-learnの数字データを使って、kerasで学習と予測を行ってみたいと思います。一般的には、Kerasでニューラルネットワークを構築し、scikit-learnを使用してデータの前処理やモデルの評価を行います。
〇scikit-learnの数字データとは
scikit-learnは、Pythonで機械学習のための便利なツールやアルゴリズムを提供するライブラリの一つであり、手書き数字認識のためのデータセットが含まれています。
このデータセットは、0から9までの手書き数字の画像とそれに対応するラベルで構成されています。各画像は8x8のピクセルで表現されており、機械学習アルゴリズムのトレーニングや評価のための典型的なベンチマークとして使われています。
〇コードの実装
データの読み込みと前処理:
scikit-learnから数字データセットを読み込む(例えば、load_digits関数を使用)。
データを正規化し、必要に応じて前処理を行います。
from sklearn.datasets import load_digits
from sklearn.model_selection import
train_test_split
from sklearn.preprocessing import
StandardScaler
# データの読み込み
digits = load_digits()
X = digits.data
y = digits.target
# データの正規化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test =
train_test_split(X_scaled, y, test_size=0.2, random_state=42)
Kerasでニューラルネットワークの構築:
from keras.models import Sequential
from keras.layers import Dense
# モデルの構築
model = Sequential()
model.add(Dense(128,
input_dim=X_train.shape[1], activation='relu'))
model.add(Dense(10,
activation='softmax')) # 出力層のユニット数はクラス数に対応
# モデルのコンパイル
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
モデルの学習:
model.fit(X_train, y_train, epochs=10,
batch_size=32, validation_data=(X_test, y_test))
モデルの評価:
score = model.evaluate(X_test, y_test)
print(f'Test Loss: {score[0]}, Test
Accuracy: {score[1]}')
scikit-learnでのモデルの評価はScore関数を使っていましたが、kerasではevaluateを使います。
model.evaluate(X_test, y_test)は、Kerasモデルを使用してテストデータセットを評価するためのメソッドです。このメソッドは、与えられたテストデータと対応するラベル(または目標値)に対して、モデルが予測した結果と実際の結果の適合度を評価します。
具体的には、次のことが行われます:
モデルは、入力データ X_test を使用して予測を行います。
予測された結果と、実際のラベル(目標値) y_test を比較します。
予測の精度や損失などの評価指標を計算します。
model.evaluateメソッドは、指定された評価指標に基づいてモデルの性能を評価し、その評価結果を返します。例えば、分類タスクの場合、通常は損失(loss)と精度(accuracy)が評価されます。
scoreは、評価指標の値を含むリストであり、上記の例では損失がscore[0]、精度がscore[1]に格納されています。これにより、モデルのテストデータに対する性能が確認できます。
これで、Kerasモデルを使用してscikit-learnの数字データセットを学習し、テストデータで評価できます。
〇CNN(畳み込みニューラルネットワーク)を使って実装
今度はCNNを使って実装してみます。
畳み込みニューラルネットワーク(Convolutional Neural
Network, CNN)は、主に画像認識や画像生成などのコンピュータビジョンタスクに強力な効果を発揮する深層学習モデルの一種です。CNNは畳み込み層(Convolutional Layer)とプーリング層(Pooling Layer)から構成され、これに全結合層(Fully Connected
Layer)が続く構造を持っています。
主な特徴や構成要素について簡単に説明します:
畳み込み層 (Convolutional Layer): 画像上でのパターンや特徴を検出するために畳み込み演算を行います。畳み込みは、画像全体ではなく、局所的な領域に対して行われます。これにより、画像内の位置に対する不変性や、特定のパターンの検出が可能になります。
プーリング層 (Pooling Layer): 畳み込み層の出力をダウンサンプリングするために使用されます。典型的には最大値プーリングが行われ、最も重要な情報を保持しながらサイズを削減します。これにより、計算コストを削減し、モデルの過学習を抑制する効果があります。
全結合層 (Fully Connected Layer): プーリング層の出力をフラットなベクトルに変換し、通常は1つまたは複数の全結合層を介して最終的な出力を生成します。最終的な出力はクラス分類や回帰のための確率分布となります。
〇CNNでの実装
from keras.models import Sequential
from keras.layers import Conv2D,
MaxPooling2D, Flatten, Dense
from sklearn.model_selection import
train_test_split
from sklearn.datasets import load_digits
from sklearn.preprocessing import
StandardScaler
# データの読み込み
digits = load_digits()
X = digits.data
y = digits.target
# データの正規化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# データの前処理(reshapeが必要)
X_reshaped =
X_scaled.reshape(X_scaled.shape[0], 8, 8, 1)
# ラベルをone-hotエンコーディングに変換
from keras.utils import to_categorical
y_one_hot = to_categorical(y)
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test =
train_test_split(X_reshaped, y_one_hot, test_size=0.2, random_state=42)
# モデルの構築
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu', input_shape=(8, 8, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
# モデルのコンパイル
model.compile(optimizer='adam',
loss='categorical_crossentropy', metrics=['accuracy'])
# モデルの学習
model.fit(X_train, y_train, epochs=10,
batch_size=32, validation_data=(X_test, y_test))
# モデルの評価
score = model.evaluate(X_test, y_test)
print(f'Test Loss: {score[0]}, Test
Accuracy: {score[1]}')
〇まとめ
畳み込みニューラルネットワーク(Convolutional Neural Network, CNN)を使用すると、画像認識タスクにおいて通常良い結果が得られることがあります。CNNは画像に対するパターン認識に強力であり、手書き数字認識などの画像分類タスクに適しています。
0 件のコメント:
コメントを投稿