色々めんどくさいので作りながらディープラーニングを感じてみる


ディープラーニング

項目
・ディープラーニングの概要
・データの読み込みと前処理
・訓練データとテストデータ
・モデルの構築
・学習モデルの評価、予測

ディープラーニングの概要

・人工 ニューラルネットワーク  コンピューター 上 の モデル 化 さ れ た 神経 細胞 ネットワーク ・人工 ニューロン コンピューター 上 の モデル 化 さ れ た 神経 細胞

ディープラーニングとは?

・ニューラルネットワーク(NN)というパターン認識をするように設計された、人間や動物の脳神経回路をモデルとしたアルゴリズムを多層構造化したもの
・多数の層からなるニューラルネットワークの学習

参照
https://www.deeplearningbook.org/contents/intro.html

*絵心ないです

上記のように様々な外的参照データによって出力されていますその集合体(ネットワーク)が人口ニューラルネットワークです。

人工 ニューラルネットワーク について解説します 。
こちら の 図 に ニューラルネットワークの例を示しますがニューロンが層状に並んでいます.
ニューロンは 前 の 層 の すべて の ニューロン と 後 の 層 の すべて の ニューロン と 接続 さ れ て い ます 。 ニュラルネットワーク に は 複数 の 入力 と 複数 の 出力数値 を 入力 し 情報 を 伝播 さ せ 結果 を 出力 し ます 。
出力は確率などの予測 値 として 解釈 可能 で ネットワーク により 予測 を 行う こと が 可能 です
また ニューロン や 層 の 数 を 増やす こと で ニューラルネットワークは高い表現力を発揮するようになります。
以上 の よう に ニューラルネットワーク は シンプル
な 機能 しか 持た ない ニューロン が 層 を 形成 し 層 の 間 で 接続 が 行わ れる こと により 形作ら れ ます 。

*絵心下さい(とにかく沢山のものが集まり層を形成し各自がつながりあってる感じの絵です)

ニューラルネットワークは出力と正解の誤差が小さくなるように重みとバイアスを調整し
バックプロパゲーションと言うアルゴリズムを使い学習していきます。
各パラメーターが繰り返し調整されることでネットワークは次第に学習し適切な予測が行われます。

データの読み込みと前処理

import numpy as np
from sklearn import datasets
#ライブラリーのインポートを行います。
iris = datasets.load_iris()
print(iris.data[:10])
print(iris.target[:10])
print(iris.data.shape)

from sklearn import datasets
=sklearnからdatasetsをインポートしています。

iris=花のデータです。

print(iris.data[:10]) print(iris.target[:10])
=頭から10個のデータを表示してもらいます。

print(iris.data.shape)
=データの形状を表示します。

出力結果.
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]]
[0 0 0 0 0 0 0 0 0 0]
(150, 4)

このデータから上から4種類の値、ラベル、データ数、列数
というデータの中身がわかります。

前処理

from sklearn import preprocessing
from keras.utils import np_utils

scaler = preprocessing.StandardScaler() 
scaler.fit(iris.data) 
x = scaler.transform(iris.data) 
print(x[:10])

y = np_utils.to_categorical(iris.target)  
print(t[:10])

from sklearn import preprocessing
=前処理をインポート

StandardScaler
=標準化のために使われる

scaler.fit(iris.data)
=irisのデータに対してfitを行う(標準化パラメータ)

標準化とは、データから平均値を引いて標準偏差で割ったもの

x が標準化されたirisデータ

iris.targetデータをcategorical化します。
1or0だけの表現に変換

出力結果.
[[-0.90068117  1.01900435 -1.34022653 -1.3154443 ]
 [-1.14301691 -0.13197948 -1.34022653 -1.3154443 ]
 [-1.38535265  0.32841405 -1.39706395 -1.3154443 ]
 [-1.50652052  0.09821729 -1.2833891  -1.3154443 ]
 [-1.02184904  1.24920112 -1.34022653 -1.3154443 ]
 [-0.53717756  1.93979142 -1.16971425 -1.05217993]
 [-1.50652052  0.78880759 -1.34022653 -1.18381211]
 [-1.02184904  0.78880759 -1.2833891  -1.3154443 ]
 [-1.74885626 -0.36217625 -1.34022653 -1.3154443 ]
 [-1.14301691  0.09821729 -1.2833891  -1.44707648]]
[[1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]]

参照
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

訓練データとテストデータ

データを訓練用データとテスト用データに分けていきます。
なぜデータを分ける必要があるのか?

A、ディープラーニングではデータの精度を高める事が非常に大切になっていきます。
そのためデータを分けておく必要があります。(今回は二つなだけ)
もしデータ全てを訓練用データとして使用した場合、過度に適合したデータが完成してしまい逆に精度が低くなってしまう

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, t, train_size=0.75)
print(x_train[:10])
print(x_train.shape)
print(x_test.shape)

sklearn.model_selection.train_test_split
=参照ソース↓
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

なぜ、train_size=0.75にしたの?
=K-分割交差検証(Cross Validation)

出力結果.
[[ 0.55333328 -1.28296331  0.70592084  0.92230284]
 [-0.65834543  1.47939788 -1.2833891  -1.3154443 ]
 [ 0.67450115  0.32841405  0.87643312  1.44883158]
 [-1.87002413 -0.13197948 -1.51073881 -1.44707648]
 [ 2.12851559 -0.13197948  1.61531967  1.18556721]
 [-0.41600969 -1.28296331  0.13754657  0.13250973]
 [-1.38535265  0.32841405 -1.22655167 -1.3154443 ]
 [-0.7795133   1.01900435 -1.2833891  -1.3154443 ]
 [-1.14301691  0.09821729 -1.2833891  -1.3154443 ]
 [ 0.67450115 -0.82256978  0.87643312  0.92230284]]
(112, 4)
(38, 4)

データをわけることができました。

モデルの構築

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(32, input_dim=4))
model.add(Activation('relu')) 
model.add(Dense(32)) 
model.add(Activation('relu')) 
model.add(Dense(3)) 
model.add(Activation('softmax')) 
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy']) 

print(model.summary())

~~~~~~~~入力層~~~~~~~~~
model.add(Dense(32, input_dim=4))
で、入力=4(4種類の値)中間層32のニューロン

model.add(Activation('relu')
活性化関数=relu(「0」を基点として、0以下なら「0」、0より上なら「入力値と同じ値」を返す、ニューラルネットワークの活性化関数)を代入
~~~~~~~~~~~中間層~~~~~~~~~~~~~~~

model.add(Dense(32))
=32のニューロンを結合

model.add(Activation('relu'))
=活性化関数を代入
~~~~~~~出力層~~~~~~~~~

model.add(Dense(3))
=三つの出口を作ってあげています

model.add(Activation('softmax'))
=3つ以上の出口を作るときはsoftmax使うっぽいです

~~~~~~~~~~~~~~~~~~~~
   ↓
コンパイルしてます。
参照
Sequentilal
https://keras.io/ja/models/sequential/

Dense
https://keras.io/ja/layers/core/#dense

Activation:
https://keras.io/ja/layers/core/#activation

softmax関数を直感的に理解したい
https://qiita.com/rtok/items/b1affc619d826eea61fd

脳死で覚えるkeras入門
https://qiita.com/wataoka/items/5c6766d3e1c674d61425

出力結果.
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 32)                160       
_________________________________________________________________
activation (Activation)      (None, 32)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                1056      
_________________________________________________________________
activation_1 (Activation)    (None, 32)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 3)                 99        
_________________________________________________________________
activation_2 (Activation)    (None, 3)                 0         
=================================================================
Total params: 1,315
Trainable params: 1,315
Non-trainable params: 0
_________________________________________________________________
None
学習
his = model.fit(x_train, y_train, epochs=30, batch_size=9)

epochs=30, batch_size=9
30回データを使う
9個のまとまり

Epoch 1/30
13/13 [==============================] - 0s 1ms/step - loss: 1.1210 - accuracy: 0.4930
Epoch 2/30
13/13 [==============================] - 0s 1ms/step - loss: 1.0056 - accuracy: 0.5040
Epoch 3/30
13/13 [==============================] - 0s 1ms/step - loss: 0.8827 - accuracy: 0.7040
Epoch 4/30
13/13 [==============================] - 0s 1ms/step - loss: 0.8044 - accuracy: 0.8141
Epoch 5/30
13/13 [==============================] - 0s 1ms/step - loss: 0.7981 - accuracy: 0.8031
Epoch 6/30
13/13 [==============================] - 0s 1ms/step - loss: 0.7140 - accuracy: 0.7751
Epoch 7/30
13/13 [==============================] - 0s 1ms/step - loss: 0.6903 - accuracy: 0.7695
Epoch 8/30
13/13 [==============================] - 0s 1ms/step - loss: 0.6953 - accuracy: 0.7973
Epoch 9/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5926 - accuracy: 0.8374
Epoch 10/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5871 - accuracy: 0.8065
Epoch 11/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5614 - accuracy: 0.8400
Epoch 12/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5210 - accuracy: 0.8147
Epoch 13/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5227 - accuracy: 0.8099
Epoch 14/30
13/13 [==============================] - 0s 1ms/step - loss: 0.5048 - accuracy: 0.8354
Epoch 15/30
13/13 [==============================] - 0s 1ms/step - loss: 0.4412 - accuracy: 0.8697
Epoch 16/30
13/13 [==============================] - 0s 1ms/step - loss: 0.4572 - accuracy: 0.7845
Epoch 17/30
13/13 [==============================] - 0s 1ms/step - loss: 0.4188 - accuracy: 0.8345
Epoch 18/30
13/13 [==============================] - 0s 1ms/step - loss: 0.4476 - accuracy: 0.8292
Epoch 19/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3701 - accuracy: 0.8872
Epoch 20/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3487 - accuracy: 0.9335
Epoch 21/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3967 - accuracy: 0.8826
Epoch 22/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3888 - accuracy: 0.9157
Epoch 23/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3478 - accuracy: 0.9062
Epoch 24/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3379 - accuracy: 0.9389
Epoch 25/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3224 - accuracy: 0.9245
Epoch 26/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3235 - accuracy: 0.9022
Epoch 27/30
13/13 [==============================] - 0s 2ms/step - loss: 0.3205 - accuracy: 0.9212
Epoch 28/30
13/13 [==============================] - 0s 2ms/step - loss: 0.3049 - accuracy: 0.9498
Epoch 29/30
13/13 [==============================] - 0s 2ms/step - loss: 0.2916 - accuracy: 0.9244
Epoch 30/30
13/13 [==============================] - 0s 1ms/step - loss: 0.3103 - accuracy: 0.9376

参照
https://keras.io/ja/models/sequential/#fit

学習モデルの評価、予測
import matplotlib.pyplot as plt

hist_loss = history.history['loss']  
hist_acc = history.history['acc']  

plt.plot(np.arange(len(hist_loss)), hist_loss, label='gosa')
plt.plot(np.arange(len(hist_acc)), hist_acc, label='seido')
plt.legend()
plt.show()

このようなグラフができました。
パット見、回数が増えれば精度があがっているので問題なさそう。。

評価

loss, accuracy = model.evaluate(x_test, t_test)
print(loss, accuracy)
2/2 [==============================] - 0s 3ms/step - loss: 0.3002 - accuracy: 0.8421
0.30019232630729675 0.8421052694320679

0.84....................
2/2 [==============================] - 0s 3ms/step - loss: 0.3002

ん・・・・?????

予測


model.predict(x_test)

array([[0.9570871 , 0.03468084, 0.00823214],
       [0.9415316 , 0.0529235 , 0.00554489],
       [0.09786918, 0.8637411 , 0.0383897 ],
       [0.00380978, 0.08060622, 0.91558397],
       [0.00516732, 0.05931339, 0.93551934],
       [0.05471139, 0.3572611 , 0.5880275 ],
       [0.01959354, 0.37794194, 0.60246444],
       [0.9635058 , 0.03082733, 0.00566692],
       [0.01309439, 0.07551848, 0.91138715],
       [0.0096556 , 0.07231863, 0.91802573],
       [0.95494115, 0.03726008, 0.00779877],
       [0.9562635 , 0.03845736, 0.00527913],
       [0.9641995 , 0.02395629, 0.0118442 ],
       [0.52867496, 0.4659895 , 0.00533543],
       [0.9613784 , 0.03035152, 0.00827017],
       [0.04043853, 0.31576672, 0.6437947 ],
       [0.01528158, 0.10288678, 0.88183165],
       [0.9151587 , 0.07728348, 0.00755785],
       [0.01373726, 0.2678833 , 0.71837944],
       [0.01790639, 0.11440011, 0.8676935 ],
       [0.93540496, 0.05014379, 0.01445119],
       [0.00815325, 0.06253443, 0.92931235],
       [0.05771529, 0.4806437 , 0.461641  ],
       [0.06256435, 0.44442546, 0.49301007],
       [0.08182625, 0.7663055 , 0.15186824],
       [0.08219455, 0.3012668 , 0.6165387 ],
       [0.9779156 , 0.0143037 , 0.0077807 ],
       [0.9344322 , 0.0505922 , 0.01497557],
       [0.06872862, 0.33931345, 0.59195787],
       [0.9520358 , 0.03229078, 0.01567345],
       [0.09619313, 0.8281841 , 0.07562277],
       [0.0197491 , 0.2699217 , 0.7103293 ],
       [0.9632427 , 0.02939309, 0.00736426],
       [0.02244722, 0.27921143, 0.6983413 ],
       [0.0239581 , 0.19942115, 0.7766208 ],
       [0.05605358, 0.609517  , 0.3344295 ],
       [0.94509476, 0.04353072, 0.01137454],
       [0.9617277 , 0.03190768, 0.00636464]], dtype=float32)

となりました。
多分どこかで間違えてる気がしかしないです。
また明日挑戦します。
おわり

感想

サイゼまじ愛してるLOVEだからキャッシュレス対応して(勉強の道のりはまだまだ長い・・・・)