Super Resolution

Review: RED-Net — Residual Encoder-Decoder Network (Denoising / Super Resolution)
https://medium.com/datadriveninvestor/review-red-net-residual-encoder-decoder-network-denoising-super-resolution-cb6364ae161e

ディープラーニングによる画像の拡大技術
https://www.nttpc.co.jp/gpu/article/technical02.html

トップ学会採択論文にみる、超解像ディープラーニング技術のまとめ
https://qiita.com/jiny2001/items/e2175b52013bf655d617

【Intern CV Report】CVPR2019における超解像
https://buildersbox.corp-sansan.com/entry/2019/07/12/110000

【Intern CV Report】超解像の歴史探訪 -2016年編-
https://buildersbox.corp-sansan.com/entry/2019/03/20/110000

Convolution の Padding に指定する SAME/VALID

Tensorflow の tf.nn.convolution などは padding という引数を取り、文字列で VALID か SAME のどちらかを指定する。なぜ SAME/VALID という名前なのだろうか。。

Tensorflow の Document に計算式が載っている。
https://www.tensorflow.org/api_docs/python/tf/nn/convolution

SAME を指定すると 0 パディング が行われて、(ストライドの値にもよるが) 入力が小さくならずに、同じサイズで出力される。VALID にすると、足りない分はサイズが小さくなっていく。

英語に疎くてあれなのですが、SAME だと入力サイズと同じになるという意味で使われるのだとしたらまだ分かるのですが、なぜ Padding が Valid (有効) だと、パディングされない挙動になるのでしょうか?

TensorFlow – 畳み込み演算の関数 tf.nn.conv2d
https://blog.logicky.com/2017/01/18/tensorflow-%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%
ちょっとしたコードを確認するのに凄く参考になります。

Keras のサンプル

Github Keras Examples
https://github.com/keras-team/keras/tree/master/examples

公式のサンプルプログラム

MNIST の CNN

サンプルコードはここにある。
https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py

Summary を出力するとこのようになる。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 24, 24, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 12, 12, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 9216)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 128)               1179776   
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                1290      
=================================================================
Total params: 1,199,882
Trainable params: 1,199,882
Non-trainable params: 0
_________________________________________________________________

Conv2D() で畳み込みレイヤーの追加。
Conv2D filters 32, kernel size (3, 3) -> ReLU
Conv2D filters 64, kernel size (3, 3) -> ReLU
MaxPooling (2, 2)

(28, 28, 1) の input を、32 filters, size(3, 3) の Conv2D に入力すると、(26, 26, 32) になる。(26, 26, 32) を 64 filters, size(3, 3) に入れれば、(24, 24, 64) になる。

KerasのConv2Dの行列式演算
https://qiita.com/nishiha/items/bfd5dfcd7fffd3c529bc

Keras の Flatten の実装

How flatten layer works in keras?
https://stackoverflow.com/questions/44176982/how-flatten-layer-works-in-keras

どのように展開されるか疑問だったので、凄く分かりやすかった。

Conv2DTranspose

KerasのConv2DTransposeの動作について
https://qiita.com/takurooo/items/9a9f387390f5fcf5a516

An Introduction to different Types of Convolutions in Deep Learning
https://towardsdatascience.com/types-of-convolutions-in-deep-learning-717013397f4d

How to use the UpSampling2D and Conv2DTranspose Layers in Keras
https://machinelearningmastery.com/upsampling-and-transpose-convolution-layers-for-generative-adversarial-networks/

分かりやすい記事に感謝。

Skip Connection U-Net

オートエンコーダーとしてのU-Net
https://qiita.com/koshian2/items/603106c228ac6b7d8356

Affine 変換の Backpropagation メモ

    def backward(self, dout): # dout (3x10)
        dx = np.dot(dout, self.W.T) # W (50x10) W.T (10x50)
        self.dW = np.dot(self.x.T, dout) # x (3x50) x.T (50x3)
        self.db = np.sum(dout, axis=0)
        
        dx = dx.reshape(*self.original_x_shape)
        return dx

self.x は affine 変換する前のレイヤーに入力される値。

全然関係無いですが、ニューラルネットワークをレイヤーの概念図で表すと、入力する値の位置とアフィン変換する位置が、コードと一階層(半階層)ズレてる感覚を受ける。コードで記述する時は、レイヤーの層を表す図から左側の接続の線までを含んでいるイメージを持つようにする。

自身のレイヤーの重みの勾配は np.dot(self.x.T, dout) で求まり、バイアスは np.sum(dout) で総和を取る。

参照コード
ゼロから作る Deep Learningn から

DirectML 覚書

Windows AI
https://docs.microsoft.com/ja-jp/windows/ai/

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

DirectML reference
https://docs.microsoft.com/ja-jp/windows/win32/direct3d12/direct3d-directml-reference

DirectML 初期化フロー

通常の DirectX12 の初期化と同じように Device, CommandQueue, CommandAllocator, CommandList を作っておく。その後に DMLCreateDevice() を使って、IDMLDevice を初期化する。

Operator

DirectML の Operator の中に Dot Product が無いように見えるのはなぜだ?ニューラルネットワークの計算で当たり前のように使うと思っていた機能が無いのは、自分が何かを勘違いしてるのかな。

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 にアクセスすると結果が表示される。