2021年6月27日日曜日

TensorFlow + Keras で DNN に入門する

Ubuntu 20.04 に TensorFlow + Keras の環境を構築するところから。

Docker コンテナ起動

docker run -it --rm -v "$(pwd):/work" --workdir=/work ubuntu:20.04

TensorFlow 環境構築

前提パッケージインストール

apt-get update

apt-get install -y python3-dev python3-pip python3-venv

TensorFlow 用 python 仮想環境作成

python3 -m venv --system-site-packages ./tensorflow
source ./tensorflow/bin/activate

pip install --upgrade pip

TensorFlow の pip パッケージインストール

pip install --upgrade keras
pip install --upgrade tensorflow

インストール確認

python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

ディープラーニング環境(Keras)構築

必要パッケージインストール

pip install --upgrade scikit-learn

Iris の多クラス分類やってみる

以下ページを参考に、 Iris データの他クラス分類をやってみる。

プログラム作成

■ iris.py

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np

## データ準備

# 乱数を固定値で初期化し再現性を持たせる
np.random.seed(0)

# pip パッケージ scikit-learn の datasets から、 iris データをロード
# X: インプットデータ
# T: 正解データ
iris = datasets.load_iris()
X = iris.data
T = iris.target

# 数値を、位置に変換 [0,1,2] ==> [ [1,0,0],[0,1,0],[0,0,1] ]
T = np_utils.to_categorical(T)

# データを訓練用とテスト用に分割
train_x, test_x, train_t, test_t = train_test_split(X, T, train_size=0.8, test_size=0.2)

## モデル作成

# Sequential モデル生成
model = Sequential()

# 入力パラメーターが以下 4 つなので input_dim=4
# - sepal length: がくの長さ
# - sepal width: がくの幅
# - petal length: 花弁の長さ
# - petal width: 花弁の幅
input_dim=4

# 出力は以下 3 種なので units=3
# - 0: Iris-Setosa(セトナ)
# - 1: Iris-Versicolour(バーシクル)
# - 2: Iris-Virginica(バージニカ)
units=3

# 入力層追加
model.add(Dense(input_dim))
model.add(Dense(units))

# 活性化関数
# 多クラス・単ラベル問題なので、 softmax を選択。
model.add(Activation('softmax'))

# モデルのコンパイル
# 多クラス・単ラベル問題なので、 categorical_crossentropy を選択。
model.compile(
    loss='categorical_crossentropy',
    optimizer=SGD(learning_rate=0.1),
    metrics=['accuracy'])

# トレーニング実行
model.fit(train_x, train_t, verbose=2, epochs=1000, batch_size=32)

# 学習済みモデルでテストデータを分類する
Y = np.argmax(model.predict(test_x), axis=-1)

## 結果検証確認

# to_categorical の逆変換
_, T_index = np.where(test_t > 0)

# 結果出力
print()
print('RESULT')
print(Y == T_index)

動作確認

time python3 iris.py
2021-06-26 17:50:45.659627: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2021-06-26 17:50:45.659673: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
...(snip)

Epoch 1000/1000
4/4 - 0s - loss: 0.0784 - accuracy: 0.9667

RESULT
[ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True]

real    0m53.467s
user    0m26.458s
sys     0m8.617s

以上。

参考資料

0 件のコメント:

コメントを投稿