【mnist】ソフトマックス回帰で予測モデルを作成する方法【numpy
データセットmnistに対して、numpyをメインで使用して学習し予測モデルを作成する方法についてまとめる。
以下に示す順番でプログラムを実行していけば良い。
実行環境はGoogle Colaboratory。
ライブラリをインポート
使用するライブラリを以下のコードでインポートする(データセットやnumpyなど)。
from sklearn.utils import shuffle
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from keras.datasets import mnist
import numpy as np
np.random.seed(34)
ソフトマックス回帰で学習する関数を実装する
まずはnp_log関数を実装する。
# logの中身が0になるのを防ぐ
def np_log(x):
return np.log(np.clip(a=x, a_min=1e-10, a_max=1e+10))
次に学習を行うための関数train_mnistを実装する。
def train_mnist(x, y, eps=1.0):
"""
:param x: np.ndarray, 入力データ, shape=(batch_size, 入力の次元数)
:param y: np.ndarray, 教師ラベル, shape=(batch_size, 出力の次元数)
:param eps: float, 学習率
"""
global W_mnist, b_mnist
batch_size = x.shape[0]
# 予測
y_hat = softmax(np.matmul(x, W_mnist) + b_mnist) # shape: (batch_size, 出力の次元数)
# 目的関数の評価
cost = (- y * np_log(y_hat)).sum(axis=1).mean()
delta = y_hat - y # shape: (batch_size, 出力の次元数)
# パラメータの更新
dW = np.matmul(x.T, delta) / batch_size # shape: (入力の次元数, 出力の次元数)
db = np.matmul(np.ones(shape=(batch_size,)), delta) / batch_size # shape: (出力の次元数,)
W_mnist -= eps * dW
b_mnist -= eps * db
return cost
def valid_mnist(x, y):
y_hat = softmax(np.matmul(x, W_mnist) + b_mnist)
cost = (- y * np_log(y_hat)).sum(axis=1).mean()
return cost, y_hat
ソフトマックス関数についての詳細は以下を参照。
予測モデルの学習を行う
以下のコードでモデルの学習を行う。
epoch数は100としている。
for epoch in range(100):
x_train_mnist, y_train_mnist = shuffle(x_train_mnist, y_train_mnist)
cost = train_mnist(x_train_mnist, y_train_mnist)
cost, y_pred = valid_mnist(x_valid_mnist, y_valid_mnist)
if epoch % 10 == 9 or epoch == 0:
print('EPOCH: {}, Valid Cost: {:.3f}, Valid Accuracy: {:.3f}'.format(
epoch + 1,
cost,
accuracy_score(y_valid_mnist.argmax(axis=1), y_pred.argmax(axis=1))
))
精度を向上させる方法
上記のコードでモデルを学習して予測することができるようになった。
精度を高めていくためにはさらに工夫を加えることが必要。
方法としては色々あって、例えば学習データの水増し(Data Augmentation)だったり、重みなどのパラメータを最適化するアルゴリズムを変更するといったことが考えられる。
人気記事
人気記事はこちら。