機械学習/Pythonでデータ分析する次の一歩(ディープ・ラーニング、Keras編)
をテンプレートにして作成
開始行:
*はじめに [#k8d83fec]
[[Keras>https://keras.io/ja/]]はディープ・ラーニング・ラ...
この内容は、Keras 2.2.4で確認しました。
*インストール [#g811f7e5]
ここでは、Anacondaに追加する形でインストールします。
まず、Anaconda Navigatorを起動し、Environmentsを表示しま...
#ref(./anaconda.png,25%,nolink)
次に、base (root)の横の三角形をクリックし、メニューを表示...
#ref(./environments.png,25%,nolink)
メニューから、Open Terminalを選び、ターミナルを開きます。
#ref(./open_terminal.png,25%,nolink)
ターミナルを開いたら、念の為、CondaとMatplotlibをアップデ...
#geshi(sh){{
conda update conda
conda update matplotlib
}}
CondaとMatplotlibをアップデートしたら、Kerasをインストー...
TensorFlowはKerasと一緒にインストールされます。
#geshi(sh){{
conda install keras
}}
*使い方 [#t08ea9ce]
**ライブラリーの読み込み [#ka508f48]
ライブラリー名は ''keras'' です。
#geshi(python){{
import keras
}}
ライブラリーを読み込んで、次のようなメッセージが出てきた...
#geshi(sh){{
Using TensorFlow backend.
}}
バージョンを確認する方法はこちらです。
#geshi(python){{
print(keras.__version__)
}}
**データの準備 [#g03df668]
まず、scikit-learnに付属しているIrisデータセットを例題と...
説明変数は花びらの長さ、幅、萼(がく)片の長さ、幅の4つ、...
#geshi(python){{
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(X)
print(y)
}}
#geshi(sh){{
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
...
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ...
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ...
2 2]
}}
説明変数が4つあることから、入力層のユニット数は4になりま...
目的変数が3種類あることから、出力層のユニット数は3になり...
ただし、分類器の予測モデルでは、目的変数はOne hotベクトル...
Kerasに、One hotベクトルに変換するためのto_categoricalメ...
#geshi(python){{
from keras.utils import np_utils
y = np_utils.to_categorical(y)
print(y)
}}
#geshi(sh){{
[[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
...
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]]
}}
**予測モデル学習器の生成 [#k5247b2d]
Kerasを使うことで、ディープ・ラーニング・ライブラリーのTe...
ディープ・ラーニングというのは、ニューラル・ネットワーク...
ここでは、基本的な全結合の4層モデル(入力層、中間層2つ、...
まず、シーケンシャル・モデルの入れ物を作成します。
#geshi(python){{
from tensorflow.keras.models import Sequential
model = Sequential()
}}
次に、入力層と1つ目の中間層を追加します。
#geshi(python){{
from tensorflow.keras.layers import Dense
model.add(Dense(units=16, activation='relu', input_dim=4))
}}
''Dense'' は全結合のレイヤーです。
''units'' はこのレイヤーのユニット数、''activation'' は活...
''input_dim'' オプションは入力層のユニット数を表し、最初...
説明変数が4つなので、入力層のユニット数は4です。
続いて、2つ目の中間層を追加します。
#geshi(python){{
model.add(Dense(units=8, activation='relu'))
}}
最後に、出力層を追加します。
#geshi(python){{
model.add(Dense(units=3, activation='softmax'))
}}
分類用なので、出力層の活性化関数をソフトマックスにしてい...
出力が3種類なので、出力層のユニット数は3です。
(回帰用の場合は、出力層の活性化関数を線形 activation='li...
全てのレイヤーを追加したら、モデルをコンパイルします。
#geshi(python){{
model.compile(loss='categorical_crossentropy', optimizer=...
}}
''loss'' は損失関数、''optimizer'' は最適化手法、''metric...
ここでは、分類用なので、損失関数はカテゴリカル・クロスエ...
最適化手法は、最もシンプルな確率的勾配法 SGD にしています。
**ニューラル・ネットワークの学習 [#zbb3432f]
scikit-learnと同じように、fitメソッドで学習します。
#geshi(python){{
model.fit(X, y, epochs=1000, batch_size=150)
}}
#geshi(sh){{
Train on 150 samples
Epoch 1/1000
150/150 [==============================] - 1s 8ms/sample ...
Epoch 2/1000
150/150 [==============================] - 0s 42us/sample...
Epoch 3/1000
150/150 [==============================] - 0s 74us/sample...
Epoch 4/1000
150/150 [==============================] - 0s 64us/sample...
Epoch 5/1000
150/150 [==============================] - 0s 54us/sample...
...
Epoch 998/1000
150/150 [==============================] - 0s 43us/sample...
Epoch 999/1000
150/150 [==============================] - 0s 49us/sample...
Epoch 1000/1000
150/150 [==============================] - 0s 39us/sample...
}}
''epochs'' は事例全体に対して何回繰り返し学習するか、''ba...
Irisデータセットには事例が150個含まれているので、ここでは...
(batch_size=1 にすると、1事例ごとに、150,000回重みを更新...
**学習した予測モデルの評価 [#i083e7c6]
scikit-learnと同じように、evaluateメソッドで評価します。
#geshi(python){{
score = model.evaluate(X, y, batch_size=150)
print(model.metrics_names)
print(score)
}}
#geshi(sh){{
150/1 [==========...
...=====] - 0s 1ms/sample - loss: 0.1787 - accuracy: 0.9733
['loss', 'accuracy']
[0.17870810627937317, 0.97333336]
}}
ここでは、訓練データを用いて予測モデルを評価していますが...
損失が0.179、精度が0.973でした。
**学習した予測モデルによる予測 [#y5a30f2b]
scikit-learnと同じように、predictメソッドで予測します。
#geshi(python){{
model.predict(X)
}}
#geshi(sh){{
array([[9.30257916e-01, 3.53016481e-02, 3.44404392e-02],
[9.22631919e-01, 3.99531014e-02, 3.74150351e-02],
[9.21679020e-01, 4.05398346e-02, 3.77811491e-02],
...
[1.05547340e-04, 8.70669410e-02, 9.12827492e-01],
[1.82199045e-04, 1.80615202e-01, 8.19202602e-01]],...
}}
最後の活性化関数がsoftmax関数のため、ユニットごとに確率が...
つまり出力は150行3列の行列になります。
そこで、argmaxメソッドで行ごとに最大値を持つインデックス...
#geshi(python){{
import numpy as np
p = np.argmax(model.predict(X), axis=1)
print(p)
}}
#geshi(sh){{
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ...
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ...
2 2]
}}
*畳み込みディープ・ニューラル・ネットワーク (CDNN) による...
手書き文字認識のMNISTデータセットを用いて、畳み込みディー...
まずはデータセットをダウンロドします。
#geshi(python){{
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
}}
#geshi(sh){{
Downloading data from https://s3.amazonaws.com/img-datase...
11493376/11490434 [==============================] - 136s...
}}
最初の100個のデータを表示してみます。
#geshi(python){{
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 10))
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, h...
for i in range(100):
ax = fig.add_subplot(10, 10, i + 1, xticks=[], yticks...
ax.imshow(X_train[i].reshape((28, 28)), cmap='gray')
}}
#ref(mnist_train.png,nolink)
訓練データには縦横28ピクセルのモノクロ画像が6万枚入ってい...
#geshi(python){{
print(X_train.shape)
print(y_train)
}}
#geshi(sh){{
(60000, 28, 28)
[5 0 4 ... 5 6 8]
}}
一般的な画像データはRGBなど複数のチャンネルを持っています...
そのため、MNISTデータセットでは1つの画像が1つの行列だけで...
複数のチャンネルを持つ一般的な画像データは3階テンソルによ...
そこで、訓練データを (画像枚数, 横ピクセル数, 縦ピクセル...
#geshi(python){{
X_train = X_train.reshape(60000, 28, 28, 1)
}}
Irisデータセットと同じように、目的変数をOne hotベクトルに...
#geshi(python){{
from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
print(y_train)
}}
#geshi(sh){{
[[0. 0. 0. ... 0. 0. 0.]
[1. 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. 1. 0.]]
}}
データの準備ができたので、次はモデルを作成します。
#geshi(python){{
from tensorflow.keras.models import Sequential
model = Sequential()
}}
最初の畳み込み層を追加します。
#geshi(python){{
from tensorflow.keras.layers import Conv2D
model.add(Conv2D(filters=32, kernel_size=(3, 3), activati...
}}
''Conv2D'' は2次元の畳み込み層です。
''units'' は畳み込み層のユニット数、''kernel_size'' は畳...
''input_shape'' は入力の形 (横ピクセル数, 縦ピクセル数, ...
続いて、2層目の畳み込み層を追加します。
#geshi(python){{
model.add(Conv2D(filters=64, kernel_size=(3, 3), activati...
}}
この後に、プーリング層を追加します。
#geshi(python){{
from tensorflow.keras.layers import MaxPooling2D
model.add(MaxPooling2D(pool_size=(2, 2)))
}}
''MaxPooling2D'' は2次元のMaxプーリング層です。
''pooling_size'' はプーリングのサイズを表します。
ここで、ドロップアウトします。
#geshi(python){{
from tensorflow.keras.layers import Dropout
model.add(Dropout(rate=0.25))
}}
''Dropout''はドロップアウトを表現しています。
レイヤーと同じように追加されていますが、レイヤーではあり...
''rate'' はドロップする割合を表します。
次に、特徴を1次元にします。
#geshi(python){{
from tensorflow.keras.layers import Flatten
model.add(Flatten())
}}
1次元にしたユニットから全結合した中間層を加え、ドロップア...
#geshi(python){{
from tensorflow.keras.layers import Dense
model.add(Dense(units=128, activation='relu'))
model.add(Dropout(rate=0.5))
}}
最後に、出力層を追加します。
#geshi(python){{
model.add(Dense(units=10, activation='softmax'))
}}
10クラス分類問題なので出力層のユニット数は10、活性化関数...
全てのレイヤーを追加したら、コンパイルします。
#geshi(python){{
model.compile(loss='categorical_crossentropy', optimizer=...
}}
損失はカテゴリカル・エントロピー、最適化アルゴリズムはAda...
コンパイルしたら、学習します。(メモリーが不足しているとJ...
#geshi(python){{
model.fit(X_train, y_train, epochs=12, batch_size=128)
}}
#geshi(sh){{
Train on 60000 samples
Epoch 1/12
60000/60000 [==============================] - 126s 2ms/s...
Epoch 2/12
60000/60000 [==============================] - 134s 2ms/s...
Epoch 3/12
60000/60000 [==============================] - 126s 2ms/s...
Epoch 4/12
60000/60000 [==============================] - 127s 2ms/s...
Epoch 5/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 6/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 7/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 8/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 9/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 10/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 11/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 12/12
60000/60000 [==============================] - 125s 2ms/s...
学習したら、評価します。
まず、テスト・データの形を確認します。
#geshi(python){{
print(X_test.shape)
}}
#geshi(sh){{
(10000, 28, 28)
}}
訓練データと同じように、説明変数と目的変数を変形し、評価...
#geshi(python){{
X_test = X_test.reshape(10000, 28, 28, 1)
y_test = np_utils.to_categorical(y_test)
model.evaluate(X_test, y_test)
}}
#geshi(sh){{
10000/1 [==========...
...=====] - 8s 803us/sample - loss: 0.0207 - accuracy: 0....
[0.04147466113096273, 0.9886]
}}
損失は0.041、精度は0.989でした。
出力は10,000行10列の行列になるので、Irisデータセットのと...
#geshi(python){{
p = np.argmax(model.predict(X_test), axis=1)
print(p)
}}
#geshi(sh){{
[7 2 1 ... 4 5 6]
}}
最後に、テストデータに対して予測したクラスごとに、10個ず...
#geshi(python){{
fig = plt.figure(figsize=(10, 10))
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, h...
for i in range(10):
k = 0
for j in range(10):
while p[k] != i:
k += 1
ax = fig.add_subplot(10, 10, i * 10 + j + 1, xticks=...
ax.imshow(X_test[k].reshape((28, 28)), cmap='gray')
k += 1
}}
#ref(mnist_predict.png,nolink);
*参考文献 [#c2bfe832]
-[[SequentialモデルでKerasを始めてみよう>https://keras.io...
-[[Mnist cnn>https://keras.io/examples/mnist_cnn/]], Kera...
-[[KerasでDeep Learning:KerasでMNISTデータを扱ってみる>h...
終了行:
*はじめに [#k8d83fec]
[[Keras>https://keras.io/ja/]]はディープ・ラーニング・ラ...
この内容は、Keras 2.2.4で確認しました。
*インストール [#g811f7e5]
ここでは、Anacondaに追加する形でインストールします。
まず、Anaconda Navigatorを起動し、Environmentsを表示しま...
#ref(./anaconda.png,25%,nolink)
次に、base (root)の横の三角形をクリックし、メニューを表示...
#ref(./environments.png,25%,nolink)
メニューから、Open Terminalを選び、ターミナルを開きます。
#ref(./open_terminal.png,25%,nolink)
ターミナルを開いたら、念の為、CondaとMatplotlibをアップデ...
#geshi(sh){{
conda update conda
conda update matplotlib
}}
CondaとMatplotlibをアップデートしたら、Kerasをインストー...
TensorFlowはKerasと一緒にインストールされます。
#geshi(sh){{
conda install keras
}}
*使い方 [#t08ea9ce]
**ライブラリーの読み込み [#ka508f48]
ライブラリー名は ''keras'' です。
#geshi(python){{
import keras
}}
ライブラリーを読み込んで、次のようなメッセージが出てきた...
#geshi(sh){{
Using TensorFlow backend.
}}
バージョンを確認する方法はこちらです。
#geshi(python){{
print(keras.__version__)
}}
**データの準備 [#g03df668]
まず、scikit-learnに付属しているIrisデータセットを例題と...
説明変数は花びらの長さ、幅、萼(がく)片の長さ、幅の4つ、...
#geshi(python){{
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(X)
print(y)
}}
#geshi(sh){{
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
...
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ...
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ...
2 2]
}}
説明変数が4つあることから、入力層のユニット数は4になりま...
目的変数が3種類あることから、出力層のユニット数は3になり...
ただし、分類器の予測モデルでは、目的変数はOne hotベクトル...
Kerasに、One hotベクトルに変換するためのto_categoricalメ...
#geshi(python){{
from keras.utils import np_utils
y = np_utils.to_categorical(y)
print(y)
}}
#geshi(sh){{
[[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
...
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]]
}}
**予測モデル学習器の生成 [#k5247b2d]
Kerasを使うことで、ディープ・ラーニング・ライブラリーのTe...
ディープ・ラーニングというのは、ニューラル・ネットワーク...
ここでは、基本的な全結合の4層モデル(入力層、中間層2つ、...
まず、シーケンシャル・モデルの入れ物を作成します。
#geshi(python){{
from tensorflow.keras.models import Sequential
model = Sequential()
}}
次に、入力層と1つ目の中間層を追加します。
#geshi(python){{
from tensorflow.keras.layers import Dense
model.add(Dense(units=16, activation='relu', input_dim=4))
}}
''Dense'' は全結合のレイヤーです。
''units'' はこのレイヤーのユニット数、''activation'' は活...
''input_dim'' オプションは入力層のユニット数を表し、最初...
説明変数が4つなので、入力層のユニット数は4です。
続いて、2つ目の中間層を追加します。
#geshi(python){{
model.add(Dense(units=8, activation='relu'))
}}
最後に、出力層を追加します。
#geshi(python){{
model.add(Dense(units=3, activation='softmax'))
}}
分類用なので、出力層の活性化関数をソフトマックスにしてい...
出力が3種類なので、出力層のユニット数は3です。
(回帰用の場合は、出力層の活性化関数を線形 activation='li...
全てのレイヤーを追加したら、モデルをコンパイルします。
#geshi(python){{
model.compile(loss='categorical_crossentropy', optimizer=...
}}
''loss'' は損失関数、''optimizer'' は最適化手法、''metric...
ここでは、分類用なので、損失関数はカテゴリカル・クロスエ...
最適化手法は、最もシンプルな確率的勾配法 SGD にしています。
**ニューラル・ネットワークの学習 [#zbb3432f]
scikit-learnと同じように、fitメソッドで学習します。
#geshi(python){{
model.fit(X, y, epochs=1000, batch_size=150)
}}
#geshi(sh){{
Train on 150 samples
Epoch 1/1000
150/150 [==============================] - 1s 8ms/sample ...
Epoch 2/1000
150/150 [==============================] - 0s 42us/sample...
Epoch 3/1000
150/150 [==============================] - 0s 74us/sample...
Epoch 4/1000
150/150 [==============================] - 0s 64us/sample...
Epoch 5/1000
150/150 [==============================] - 0s 54us/sample...
...
Epoch 998/1000
150/150 [==============================] - 0s 43us/sample...
Epoch 999/1000
150/150 [==============================] - 0s 49us/sample...
Epoch 1000/1000
150/150 [==============================] - 0s 39us/sample...
}}
''epochs'' は事例全体に対して何回繰り返し学習するか、''ba...
Irisデータセットには事例が150個含まれているので、ここでは...
(batch_size=1 にすると、1事例ごとに、150,000回重みを更新...
**学習した予測モデルの評価 [#i083e7c6]
scikit-learnと同じように、evaluateメソッドで評価します。
#geshi(python){{
score = model.evaluate(X, y, batch_size=150)
print(model.metrics_names)
print(score)
}}
#geshi(sh){{
150/1 [==========...
...=====] - 0s 1ms/sample - loss: 0.1787 - accuracy: 0.9733
['loss', 'accuracy']
[0.17870810627937317, 0.97333336]
}}
ここでは、訓練データを用いて予測モデルを評価していますが...
損失が0.179、精度が0.973でした。
**学習した予測モデルによる予測 [#y5a30f2b]
scikit-learnと同じように、predictメソッドで予測します。
#geshi(python){{
model.predict(X)
}}
#geshi(sh){{
array([[9.30257916e-01, 3.53016481e-02, 3.44404392e-02],
[9.22631919e-01, 3.99531014e-02, 3.74150351e-02],
[9.21679020e-01, 4.05398346e-02, 3.77811491e-02],
...
[1.05547340e-04, 8.70669410e-02, 9.12827492e-01],
[1.82199045e-04, 1.80615202e-01, 8.19202602e-01]],...
}}
最後の活性化関数がsoftmax関数のため、ユニットごとに確率が...
つまり出力は150行3列の行列になります。
そこで、argmaxメソッドで行ごとに最大値を持つインデックス...
#geshi(python){{
import numpy as np
p = np.argmax(model.predict(X), axis=1)
print(p)
}}
#geshi(sh){{
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 ...
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ...
2 2]
}}
*畳み込みディープ・ニューラル・ネットワーク (CDNN) による...
手書き文字認識のMNISTデータセットを用いて、畳み込みディー...
まずはデータセットをダウンロドします。
#geshi(python){{
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
}}
#geshi(sh){{
Downloading data from https://s3.amazonaws.com/img-datase...
11493376/11490434 [==============================] - 136s...
}}
最初の100個のデータを表示してみます。
#geshi(python){{
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 10))
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, h...
for i in range(100):
ax = fig.add_subplot(10, 10, i + 1, xticks=[], yticks...
ax.imshow(X_train[i].reshape((28, 28)), cmap='gray')
}}
#ref(mnist_train.png,nolink)
訓練データには縦横28ピクセルのモノクロ画像が6万枚入ってい...
#geshi(python){{
print(X_train.shape)
print(y_train)
}}
#geshi(sh){{
(60000, 28, 28)
[5 0 4 ... 5 6 8]
}}
一般的な画像データはRGBなど複数のチャンネルを持っています...
そのため、MNISTデータセットでは1つの画像が1つの行列だけで...
複数のチャンネルを持つ一般的な画像データは3階テンソルによ...
そこで、訓練データを (画像枚数, 横ピクセル数, 縦ピクセル...
#geshi(python){{
X_train = X_train.reshape(60000, 28, 28, 1)
}}
Irisデータセットと同じように、目的変数をOne hotベクトルに...
#geshi(python){{
from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
print(y_train)
}}
#geshi(sh){{
[[0. 0. 0. ... 0. 0. 0.]
[1. 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. 1. 0.]]
}}
データの準備ができたので、次はモデルを作成します。
#geshi(python){{
from tensorflow.keras.models import Sequential
model = Sequential()
}}
最初の畳み込み層を追加します。
#geshi(python){{
from tensorflow.keras.layers import Conv2D
model.add(Conv2D(filters=32, kernel_size=(3, 3), activati...
}}
''Conv2D'' は2次元の畳み込み層です。
''units'' は畳み込み層のユニット数、''kernel_size'' は畳...
''input_shape'' は入力の形 (横ピクセル数, 縦ピクセル数, ...
続いて、2層目の畳み込み層を追加します。
#geshi(python){{
model.add(Conv2D(filters=64, kernel_size=(3, 3), activati...
}}
この後に、プーリング層を追加します。
#geshi(python){{
from tensorflow.keras.layers import MaxPooling2D
model.add(MaxPooling2D(pool_size=(2, 2)))
}}
''MaxPooling2D'' は2次元のMaxプーリング層です。
''pooling_size'' はプーリングのサイズを表します。
ここで、ドロップアウトします。
#geshi(python){{
from tensorflow.keras.layers import Dropout
model.add(Dropout(rate=0.25))
}}
''Dropout''はドロップアウトを表現しています。
レイヤーと同じように追加されていますが、レイヤーではあり...
''rate'' はドロップする割合を表します。
次に、特徴を1次元にします。
#geshi(python){{
from tensorflow.keras.layers import Flatten
model.add(Flatten())
}}
1次元にしたユニットから全結合した中間層を加え、ドロップア...
#geshi(python){{
from tensorflow.keras.layers import Dense
model.add(Dense(units=128, activation='relu'))
model.add(Dropout(rate=0.5))
}}
最後に、出力層を追加します。
#geshi(python){{
model.add(Dense(units=10, activation='softmax'))
}}
10クラス分類問題なので出力層のユニット数は10、活性化関数...
全てのレイヤーを追加したら、コンパイルします。
#geshi(python){{
model.compile(loss='categorical_crossentropy', optimizer=...
}}
損失はカテゴリカル・エントロピー、最適化アルゴリズムはAda...
コンパイルしたら、学習します。(メモリーが不足しているとJ...
#geshi(python){{
model.fit(X_train, y_train, epochs=12, batch_size=128)
}}
#geshi(sh){{
Train on 60000 samples
Epoch 1/12
60000/60000 [==============================] - 126s 2ms/s...
Epoch 2/12
60000/60000 [==============================] - 134s 2ms/s...
Epoch 3/12
60000/60000 [==============================] - 126s 2ms/s...
Epoch 4/12
60000/60000 [==============================] - 127s 2ms/s...
Epoch 5/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 6/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 7/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 8/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 9/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 10/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 11/12
60000/60000 [==============================] - 125s 2ms/s...
Epoch 12/12
60000/60000 [==============================] - 125s 2ms/s...
学習したら、評価します。
まず、テスト・データの形を確認します。
#geshi(python){{
print(X_test.shape)
}}
#geshi(sh){{
(10000, 28, 28)
}}
訓練データと同じように、説明変数と目的変数を変形し、評価...
#geshi(python){{
X_test = X_test.reshape(10000, 28, 28, 1)
y_test = np_utils.to_categorical(y_test)
model.evaluate(X_test, y_test)
}}
#geshi(sh){{
10000/1 [==========...
...=====] - 8s 803us/sample - loss: 0.0207 - accuracy: 0....
[0.04147466113096273, 0.9886]
}}
損失は0.041、精度は0.989でした。
出力は10,000行10列の行列になるので、Irisデータセットのと...
#geshi(python){{
p = np.argmax(model.predict(X_test), axis=1)
print(p)
}}
#geshi(sh){{
[7 2 1 ... 4 5 6]
}}
最後に、テストデータに対して予測したクラスごとに、10個ず...
#geshi(python){{
fig = plt.figure(figsize=(10, 10))
fig.subplots_adjust(left=0, right=1, bottom=0, top=0.5, h...
for i in range(10):
k = 0
for j in range(10):
while p[k] != i:
k += 1
ax = fig.add_subplot(10, 10, i * 10 + j + 1, xticks=...
ax.imshow(X_test[k].reshape((28, 28)), cmap='gray')
k += 1
}}
#ref(mnist_predict.png,nolink);
*参考文献 [#c2bfe832]
-[[SequentialモデルでKerasを始めてみよう>https://keras.io...
-[[Mnist cnn>https://keras.io/examples/mnist_cnn/]], Kera...
-[[KerasでDeep Learning:KerasでMNISTデータを扱ってみる>h...
ページ名: