20200522のTensorFlowに関する記事は4件です。

TensorFlow 2.0 の Frechet Inception Distance (FID) の計算の tf.linalg.sqrtm() で Nan が出るときの応急処置

概要

[1] の numpy で書かれたコードを TensorFlow 2.0 に移植するため、FID の計算を TensorFlow のみでしようとしていたところ、scipy.linalg.sqrtm() では計算可能な 2048x2048ndarray の平方根を求めようとしても、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 の計算より数十倍遅いので、修正方法が分かり次第追記する。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を学習しなければなりません。
これは、事実上可能ではありますが、面倒くさいです。
コメント 2020-05-22 234300.png
この画像は、論文内のものですが、k=4だとすると、4*3=12個のGeneratorが必要だということを表しています。

そんな問題を解決するために、StarGANでは、1つのGeneratorで複数のドメインの変換を行うアルゴリズムを導入しています。
コメント 2020-05-22 234328.png
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などなどです。
もっと知りたい人はこちらを参照ください。

コメント 2020-05-22 215619.png

ダウンロードディレクトリには、上のような画像と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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.py

2.環境

OS:Windows10 Enterprise 1809 64bit
Python:3.7.6
TensorFlow_gpu:v2.1.0

3.困ったこと

サンプルコードなので,問題なく実行できるかと思いきや,なぜか以下の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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

import error:No module named 'tensorflow.keras.utils'

何をしたかったか

tensorflow.keras.utilsを用いた構造のプロットを行いたかった。

コード

sample.py
from 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む