DirectML 覚書

Trained Weights Source
https://github.com/microsoft/DirectML-Samples/issues/3
DirectML では生の重みデータしか使えず、ONNX などを使いたい場合は 上位の Windows Machine Learning を使用する。

Direct Machine Learning (DirectML)
https://docs.microsoft.com/en-us/windows/win32/direct3d12/dml

Accelerating GPU inferencing with DirectML and DirectX 12
https://www.highperformancegraphics.org/wp-content/uploads/2018/Hot3D/HPG2018_DirectML.pdf

Using AI for Interactive Applications
http://on-demand.gputechconf.com/gtc/2018/presentation/s8957-using-ai-for-interactive-applications.pdf

USING AI TO ACCELERATE YOUR GAME (PART 2)
https://devblogs.microsoft.com/directx/wp-content/uploads/sites/42/2018/03/WinML_acceleration_GDC.pdf

NVIDIA TURING GPU ARCHITECTURE
https://www.nvidia.com/content/dam/en-zz/Solutions/design-visualization/technologies/turing-architecture/NVIDIA-Turing-Architecture-Whitepaper.pdf

Windows 10 1903 であれば、Windows Machine Learning を使ったときは、対応している GPU さえあれば内部で DirectML が動いているのだろうか。

DirectML は Inferencing (推論) のための API なのでネットワークを学習する機能が提供されていない。自前で組み込むか、もしくは何かしらの別のフレームワークを使って学習させた結果をコンバートしなければいけない。

Keras で TensorBoard を使用する

kerasでtensorboardの表示とmodelの保存
https://qiita.com/uni-3/items/021cbb6c9ac803081b13

こちらの記事が非常に参考になりました。情報に感謝です。

model.fit() の引数の callbacks への指定。
TensorBoard インスタンスの作成。

log_filepath = "./logs/"
tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, histogram_freq=1, write_graph=True, write_images=True)

実行する際は、該当のディレクトリまで進み、下記のコマンド。
tensorboard –logdir=./logs

http://localhost:6006 にアクセスすると結果が表示される。

Keras で画像読み込み

Kerasで画像分類~前処理から分類テストまで~
https://qiita.com/neet-AI/items/2b3d7f743e4d6c6d8e10

こちらの記事を参考にさせて頂きました。有益な情報に感謝です。

from keras.preprocessing.image import load_img, img_to_array, array_to_img
import glob
import numpy as np

arraylist = []
files = glob.glob("01/*.tiff")
for file in files:
    img = load_img(file)
    array = img_to_array(img)
    arraylist.append(array)

nplist = np.array(arraylist)

これで、特定フォルダ以下の画像を読み込み numpy array に出来ました。画像は 135x240px RGB が 151枚あるので nplist.shape で表示させてみると (151, 135, 240, 3) になりました。

Matplitlib で表示

import matplotlib.pyplot as plt
plt.imshow(nplist[0])

このまま直接 imshow をやったら表示されました。

keras.preprocessing.image

色々出来そう。

下記の指定で読み込んだ時にグレースケール (135, 24, 1) 次元になる。
load_img(file, color_mode=”grayscale”)

グレースケール化した画像の表示

matplitlib の imshow に渡す時は RGB のみでしかも [0..1] にクリップされている必要がある。img_to_array(img) / 255. などを呼び出して [0..1] に収める。

グレースケールを RGB に変換するには下記のコードを使った。

import tensorflow as tf
from keras import backend
rgb = tf.image.grayscale_to_rgb(nplist[0])
array = backend.get_session().run(rgb)

tf.image.grayscale_to_rgb() を使うと Tensor 型になってしまうので、それを Numpy に変換している。

学習済みデータの保存

model.save_weights('weights.h5')

Keras でのコーディング

Keras は Sequential API と Functional API で分かれており、Sequential API であれば、レイヤーインスタンスを add していくだけで、簡単にニューラルネットワークの層を構築することが出来る。

最初のレイヤーには、imput_shape=() として、入力の形状を指定する必要がある。(後続のレイヤーが推定できるため、指定は必要ない)

Compile

Model の Training 前には、compile メソッドに学習プロセスに必要な3つの引数を設定する必要がある。

  • Optimizer (最適化アルゴリズム)
  • Loss Function (損失関数, 目的関数)
  • Metrics (評価関数)

Training

Keras は fit 関数を呼び出して訓練が開始される。訓練データ, 正解ラベル, エポック, バッチサイズなどを引数に取る。x_train の値を y_train の正解データに近づけるように学習を行なっていく。

model.fit(x_train, y_train, epochs=10, batch_size=32)

Evaluate

テストモードで、損失値と評価値を返す。処理はバッチ単位で行われる。テストデータラベルデータを指定して、List 型で [0.0711811, 0.9792] のような値が帰る。恐らく、損失値が 0.0711 で評価値(精度?)が 97% の正解値ということ。

score = model.evaluate(x_test, y_test)

Functional API

Keras で、マルチアウトプットモデルのような複雑なモデルを作るときは Functional API を使用する。Sequential API はレイヤーを順番に Add して重ねることしか出来ない?が、Functional API では任意の位置に、任意のレイヤーを差し込め、多重な output も作れるようになっている。

複数の input や output を行う場合は、compile や fit には複数の連想配列で追加する。

Model Class API

Functional API で Model(inputs=a, outputs-b) を与えてモデルを作る。例えば inputs=[a1, a2], outputs=[b1, b2, b3] のように、複数の入力と出力を得ることが出来る。全てのモデルはレイヤーのように呼び出しが可能で再利用できる。

Autoencoder 資料

Building Autoencoders in Keras
https://blog.keras.io/building-autoencoders-in-keras.html

KerasでAutoEncoder【備忘録】
https://gangannikki.hatenadiary.jp/entry/2018/12/09/235956

KerasでDAE(Denoising AE)を試してみた【備忘録】
https://gangannikki.hatenadiary.jp/entry/2019/01/19/000000

【ノイズ除去】kerasでノイズ除去を試してみた1【DNCNN】
https://gangannikki.hatenadiary.jp/entry/2019/01/26/210651

KerasでAutoEncoder
https://qiita.com/fukuit/items/2f8bdbd36979fff96b07

Variational Autoencoder徹底解説
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

素晴らしい資料に感謝です。

Keras で処理した画像を書き出し

# PIL をインストールしておく
conda install -c anaconda pillow

from PIL import Image
decoded_imgs[0] = decoded_imgs[0].astype('float32') * 255.0
pil_img = Image.fromarray(decoded_imgs[0].reshape(28,28))
if pil_img.mode != 'RGB':
    pil_img = pil_img.convert('RGB')

pil_img.save('0.png')

シングルクォーテーションがエンコードされているので注意。

機械学習の覚え書き

損失関数

機械学習が出力したデータと、正解データがどの程度間違っているのか、その誤差を損失(Loss) と呼び、誤差を評価する関数を損失関数と呼ぶ。

判定精度の指標

精度(Accuracy), 誤り率(Loss), 再現率(Recall), 適合率(Precision), 偽陽性(False Positive), 偽陰性(False Negative) などがある。

Tensorflow 結果の見方

  • loss
    • 訓練(Train)データでの誤り率
  • acc
    • 訓練(Train)データでの正解率
    • MNIST サンプルだと60000件のデータ
  • val_loss
    • 検証(Test)データでの誤り率
  • val_acc
    • 検証(Test)データでの正解率
    • MNIST サンプルだと10000件のデータ

loss は正解からどのくらい離れているか。0 に近いほど良い。acc は単純な%。

検証用データの val_loss の値が大切。loss が下がっても、val_loss が下がっていない(上がるような)場合は過学習を起こしている。

生物の進化と学習

人間ってナンだ? シーズン2 第12回「働く」より。松尾先生

生物界では単一の目的関数はないはずで、あるとすれば生存確率を上げること。目的関数が定義できるものは、進化的も学習的でも解にたどり着ける。学習の方が早くたどり着ける。生物のように目的関数が定義しづらいものは、学習ではできなく、進化的にやるしかない。