スポンサーリンク

【keras】mnistで画像分類をする

スポンサーリンク

kerasを使い、mnistデータの画像分析を行います。

mnistデータの読み込み

mnistのデータをダウンロードして、変数に取り込みます。

from keras.datasets import mnist
 
# x1 : 入力データ
# t1 : 正解データ(ターゲット)
# ex1 : 評価用入力データ
# et1 : 評価用正解データ(ターゲット)
(x1, t1), (ex1, et1) = mnist.load_data()

mnistのデータ形式を確認します。

x1.shape

入力データは28×28のデータが60000個あり、3次元配列となっています。

(60000, 28, 28)

正解データの形式を確認します。

t1.shape

正解データは60000個の1次元配列となっています。

(60000,)

最初の1つ目のデータの中身を確認してみます。

#最初の1個のデータを表示
import numpy as np
np.set_printoptions(edgeitems=28)
np.core.arrayprint._line_width = 200
print(x1[0])
[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136 175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253 225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251  93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119  25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253 150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252 253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249 253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253 253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253 250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201  78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]]

データの形式変換

学習させるために、データの形式を変換します。
28×28の2次元配列の画像を784個の1次元配列に変換します。

x2 = x1.reshape(len(x1), x1[0].size)  # 60000, 28x28 の2次元配列に変換
ex2 = ex1.reshape(len(ex1), ex1[0].size) # 60000, 28x28 の2次元配列に変換

データ形式を確認すると、確かに60000個の1次元配列になっていることがわかります。

x2.shape, ex2.shape
((60000, 784), (10000, 784))

答えのデータもスカラーからベクトルへと変換します。

#答えのラベルをスカラーからベクトルに変換する(to_categorical関数で変換可能)
from keras.utils import np_utils
t2 = np_utils.to_categorical(t1)
et2 = np_utils.to_categorical(et1)
 
#元のデータを表示
print(t1[0])
print(et1[0])
# 訓練用と評価用から1個づつ表示
print(t2[0])
print(et2[0])
5
7
[ 0.  0.  0.  0.  0.  1.  0.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]

モデルの定義

from keras.layers import Dense, Activation
from keras.models import Sequential
from keras.optimizers import SGD
 
n_in = x2[0].size
n_out = t2[0].size
hidden_layers = 2
hidden_units = 30
activation_function='sigmoid'
learning_rate = 0.1
 
# モデル定義
np.random.seed(0) # 乱数を固定値で初期化し再現性を持たせる
model = Sequential()
# 入力層
model.add(Dense(hidden_units, input_dim=n_in)) # 入力層から出力するユニット数は隠し層のユニット数と同数に
model.add(Activation(activation_function))
# 隠し層
for _ in range(hidden_layers):
    model.add(Dense(hidden_units))
    model.add(Activation(activation_function))   
# 出力層
model.add(Dense(n_out))
model.add(Activation('softmax'))
# モデル生成
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=learning_rate))

 

 

コメント

タイトルとURLをコピーしました