- 投稿日:2020-05-22T22:50:04+09:00
TensorFlow 2.0 の Frechet Inception Distance (FID) の計算の tf.linalg.sqrtm() で Nan が出るときの応急処置
概要
[1] の numpy で書かれたコードを TensorFlow 2.0 に移植するため、FID の計算を TensorFlow のみでしようとしていたところ、
scipy.linalg.sqrtm()
では計算可能な2048x2048
のndarray
の平方根を求めようとしても、TensorFlow 側だけNan
になってしまう現象にぶつかった。
- TensorFlow 1.0 でも同じ現象が起こるというイシューが GitHub に立っている (同じことをすれば対処できるはず)
対処法
対処には二段階必要です。
まず、
tf.linalg.sqrtm()
の一個前の計算である、$\Sigma_r \Sigma_g$ の時点で、tf.cast
を噛ませてfloat64
に設定しないといけません。TensorFlow のデフォルトはfloat32
のため、計算が失敗する可能性があるらしい1です。sigma1, sigma2 = tf.cast(sigma1, tf.float64), tf.cast(sigma2, tf.float64)次に、[2] を参考に、微小の数値
eps
を対角行列として加え、その後行列の掛け算を行います。ここでは、全て型をtf.float64
に設定しないといけません。eps = tf.constant(1e-6, dtype=tf.float64) offset = tf.eye(2048, dtype=tf.float64) * eps tdot = tf.tensordot(sigma1+offset, sigma2+offset, axes=1)これで対処が終わりました。あとは、
covmean = tf.linalg.sqrtm(tdot)で、一応計算が通り、ほぼ同じ計算結果になります。
問題点
計算は止まらなくなったものの、TensorFlow 側の計算が、Scipy の計算より数十倍遅いので、修正方法が分かり次第追記する。
参考
- [1] How to Implement the Frechet Inception Distance (FID) for Evaluating GANs: https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/
- [2] FID get "nan" or "complex number": https://github.com/bioinf-jku/TTUR/issues/4
- 投稿日:2020-05-22T22:19:56+09:00
StarGANの実装をしてみた(1)
Linux上でStarGANの実装をしてみた
今回は、StarGANの実装をしてみました。
基本的に、githubで公開されているコードをもとに実装を行っていきます。
本ページでは、軽い論文の説明と実装をしていきます。
自分のデータセットを用いて適用する回は、次回やっていきたいと思います。
- StarGANについて超簡単に
- Linux上での実装
簡単ではありますが、上の2項目に従って説明します。
StarGANについて超簡単に
論文:https://arxiv.org/abs/1711.09020
StarGANとは、異なるドメイン間への変換を可能とするGenerative Adversarial Netwok (GAN)の一種であるCycleGANと、GANに多クラス分類の学習を加えたAC-GANを組み合わせたものです。
CycleGANは、2つのドメイン間でのドメイン変換しか行えません。
2つ以上のk個のドメイン間でのドメイン変換を実現するためには、k(k-1)個のGeneratorを学習しなければなりません。
これは、事実上可能ではありますが、面倒くさいです。
この画像は、論文内のものですが、k=4だとすると、4*3=12個のGeneratorが必要だということを表しています。そんな問題を解決するために、StarGANでは、1つのGeneratorで複数のドメインの変換を行うアルゴリズムを導入しています。
5つのドメインがある場合、上の画像のようにあらわされます。
星形をしていますね。だからStarGANなんでしょう。なんか厨二心をくすぐられます。丁寧な説明が他の記事ありましたので、共有いたします。(これ以上の解説は自分のはできない)
Linux上での実装
公開コード
https://github.com/yunjey/StarGAN実装環境
- Ubuntu 18.04 LTS
- Python 3.6
- PyTorch 0.4.0
- Tensorflow 1.4.0公開データセットで実装
まずは、任意のディレクトリにgitをクローンします。
続いて、StarGAN/
のディレクトリに移動します。
今回は、論文でも使用されていたCelebA datasetとRaFDいうデータセットをダウンロードしていきます。$ git clone https://github.com/yunjey/StarGAN.git $ cd StarGAN/ $ bash download.sh celebaダウンロード完了です。
. . . inflating: ./data/celeba/images/072137.jpg inflating: ./data/celeba/images/027742.jpg inflating: ./data/celeba/images/188764.jpg inflating: ./data/celeba/list_attr_celeba.txtこちらのCelebA datasetというデータセットは、こちらで公開されております。
このデータセットには、有名人のカラー顔画像が178×218ピクセルで202,599枚含まれています。
これに加えて、それぞれの画像に対して、40種類のattribute (属性) が付与されています。
例えば、Black_Hair、Blond_Hair、Brown_Hair、Male、Youngなどなどです。
もっと知りたい人はこちらを参照ください。ダウンロードディレクトリには、上のような画像と
list_attr_celeba.txt
という各画像に対する属性が記されているtxtファイルが保存されます。
こちらの中身は、[画像フォルダ名] 1 1 -1 1 -1 1 1 ... 1 -1となっています。1 or -1は属性の数の分(40個)あります。
1のとき、その属性であり、-1のとき、その属性ではないことを表します。
こちらは、自分のデータセットで学習させる際に生成する必要があるので覚えておいてください。
学習
まずは、CelebA datasetを使ってStarGANを学習していきます。
$ python main.py --mode train --dataset CelebA --image_size 128 --c_dim 5 \ --sample_dir stargan_celeba/samples --log_dir stargan_celeba/logs \ --model_save_dir stargan_celeba/models --result_dir stargan_celeba/results \ --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Youngコマンドについて説明します。
--mode
: モード
--dataset
: 用いるデータセット
--image_size
: 画像サイズ
--c_dim
: attribute (属性) のクラスの数
--sample_dir
: サンプルが保存してあるフォルダ
--log_dir
: ログを保存するフォルダ
--model_save_dir
: モデルを保存するフォルダ
--result_dir
: 結果を保存するフォルダ
--selected_attrs
: 学習したいattribute (属性)
という感じです。テスト
続いて、テストをしていきます。
$ python main.py --mode test --dataset CelebA --image_size 128 --c_dim 5 \ --sample_dir stargan_celeba/samples --log_dir stargan_celeba/logs \ --model_save_dir stargan_celeba/models --result_dir stargan_celeba/results \ --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Young簡単にできてしまいます。
続いて、RaFDのデータもダウンロードしたい、、、と思ったのですが、申請が必要でした。
おそらく、申請できても、こちらのページにも掲載することはできないと思います。学習するのが面倒くさいという方のためにも、学習済みネットワークをダウンロードしていきます。
$ bash download.sh pretrained-celeba-128x128ダウンロードされたモデルは、
./stargan_celeba_128/models
に保存されます。
つづいて、以下のコマンドで学習済みネットワークを使って画像変換をしていきます。$ python main.py --mode test --dataset CelebA --image_size 128 --c_dim 5 \ --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Young \ --model_save_dir='stargan_celeba_128/models' \ --result_dir='stargan_celeba_128/results'という感じに超簡単です。
./stargan_celeba_128/results
に変換画像が保存されます。
これで、公開データセットでの簡単な実装は終了。
次回は、自分で用意したデータセットに適用していきます。
参考資料
論文:https://arxiv.org/pdf/1703.10593.pdf
Github:https://github.com/yunjey/StarGAN
CelebA:http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
7変化! AIで顔を変えよう:https://qiita.com/uyuutosa/items/5dd9b2b80a9aaca67050
- 投稿日:2020-05-22T19:14:10+09:00
TensorFlow v2 でattribute 'app'が無いと怒られるときの解決方法
0.概要
Tensor Flow v2のサンプルコードを実行した際に,以下のError文が出たときの解決方法についてまとめます.
(Tensor Flow v1へのバックデートは行いません.)1.背景
Tensor Flowの勉強をするにあたり,以下のURL先よりサンプルコード(classify_image.py)をダウンロードしました.
https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py2.環境
OS:Windows10 Enterprise 1809 64bit
Python:3.7.6
TensorFlow_gpu:v2.1.03.困ったこと
サンプルコードなので,問題なく実行できるかと思いきや,なぜか以下のErrorが出てきてしまいます.
Error文Traceback (most recent call last): File "classify_image.py", line 49, in <module> FLAGS = tf.app.flags.FLAGS AttributeError: module 'tensorflow' has no attribute 'app'なんでやねーん.
で,調べてみたところ
「TensorFlow v2ではtf.appがすでに削除されているので,
『TensorFlow v1にバックデートする』か
『TensorFlow v2のAPI用にコードを書き換える』
のどちらかで対応してね」とのこと.なんやねーん.せっかく苦労して環境構築したんやから,こっから環境をいじりたくないわー.
4.解決方法
で,さらに調べたところ,以下のimport文をコードに書き込んだら問題解決可能との情報を発見.
解決方法import tensorflow.compat.v1 as tf実際,サンプルコードに追記して実行してみたら,問題なく動きました.
よかったー!
参考URLhttps://stackoverflow.com/questions/58258003/attributeerror-module-tensorflow-has-no-attribute-app
- 投稿日:2020-05-22T05:01:25+09:00
import error:No module named 'tensorflow.keras.utils'
何をしたかったか
tensorflow.keras.utils
を用いた構造のプロットを行いたかった。コード
sample.pyfrom tensorflow.keras.utils import plot_model plot_model(model)エラー文原文
No module named 'tensorflow.keras.utils'
エラー文訳(Deep L翻訳)
tensorflow.keras.utils' という名前のモジュールがありません。
原因
tensorflowのversionの問題かな?
改善案
エラーが起こっていた時のtensorflowのバージョンが、2.2.0でした。
別端末では、実行できていたのでその端末のバージョンの2.1.0にダウングレードしたら、実行することができました。改善コード
pip3 uninstall tensorflow pip3 install tensorflow==2.1.0