2018-12-27

Physics-Guided-GAN 物理モデルを考慮したGAN

ディープラーニングの勾配更新の際に、物理の知見を援用しようという提案が提出された。具体的には、物理的に不自然な度合いを数量化し、それをペナルティとして損失関数に加えるといったものだ。

解説記事があった
https://towardsdatascience.com/physics-guided-neural-networks-pgnns-8fe9dbad9414

まだ詳しく読んではいない。

2018-12-21

MacbookのEmacsでC+SPCキーでマークを打つにはShiftを同時に押す

Ctrl + spaceキーは範囲選択の開始に当てられているが、押すと、Spotlight searchが起動してしまう。しかし、Shiftキーを同時に押すと、期待通りにマークをうつことができた。

対処法については、調べると、Spotlight Searchを無効にする設定もよくヒットするが、わりと便利な機能なのでこれは有効なままにしておきたかったので、Shift同時押しで対応することにした。

参考
https://www.reddit.com/r/emacs/comments/31yjmv/how_do_you_use_cspc_on_mac_wo_changing_spotlight/

Appendix
こちらの早見表が見やすい
http://www.rsch.tuis.ac.jp/~ohmi/literacy/emacs/quick.html

MacOSでlsコマンドに色をつける

vim ./bash_profile

export CLICOLOR=1
export LSCOLORS=gxfxcxdxbxegedabagacad
export GREP_OPTIONS='--color=auto'

source ~/.bash_profile

参考
https://crunchify.com/how-to-change-mac-os-x-terminal-color/
http://nemoplus.hateblo.jp/entry/20090119/1232373540
https://github.com/trapd00r/LS_COLORS

2018-12-18

Cloudflareに移行したらサブドメインも設定しないといけない

開発中のウェブサイトを高速化のためにCloudflareのCDNに移行したところ、サブドメインの名前解決に失敗するようになった。サーバーはロリポップを使っていたが、ルートのドメインだけでなく、サブドメインはCloudflareで設定しないといけないらしい。

やり方は簡単で、Cloudflareを開いたら、DNSの項目を開き、CNAMEのレコードを追加すればいい。追加の際は、nameがサブドメイン(wwwなど)、domain nameがルートである (下記参照)。私の場合、設定後、即座に反映された。




また、サブドメインがつながらない原因がcloudflareにあると気がついたのは、
dig @8.8.8.8 サブドメインのURL
を実行したところ、ルートのドメインがcloudflareにつながり、サブドメインが見つからなかったことによる。

2018-12-11

GANに関する記事をメモ


[CVPR 2018 Tutorial on GANs] Introduction to Generative Adversarial Networks
https://qiita.com/yh-iro/items/3a046d10487a6701139a
CVPR2018のGANの手法がいくつか紹介されている。

KERASによるWGAN, SNGANの実装が置いてある

SNGANのKERASによる実装

はじめてのGAN
2017年以前のGANの紹介されていてわかりやすい。

2018-12-10

ディープラーニングを使って、画像からソースコードの生成

フロントの画像から、htmlやcssを自動生成する研究の紹介です。

電話応答やSiriなどに人の言葉の自動生成がよく知られているが、人が話す自然言語にくらべて、文脈自由文法であるプログラミング言語の方がはるかに単純な構造だし語彙も少ないので、ソースコードの自動生成の方がずっと容易なのであろう。

Floydhubに記載されたこちらの記事が参考になる。単語をみなone-hot-vectorになおして推定したようである。
https://blog.floydhub.com/turning-design-mockups-into-code-with-deep-learning/

Frontend developer Handbook 2018(*)には、軽いコーダーとフロントエンドエンジニアはようやく区別されるようになると書いてあった。区別がわからない人のために非常に簡単に説明すると、コーダーは、htmlやjavascriptやcssを使って簡単なページを作れる人を指す。一方、フロントエンドエンジニアは、ReactやDOJOやAngularを使い、画面をコンポーネント群に分けて設計も行う人たちのことを呼ぶ。このpix2codeプロジェクトは、コーダーの仕事を奪いうるものであり、フロントエンドエンジニアとの技術的な歴然たる差を見せつけたように感じられた。

さらによく調べると、code2pixというdecoderも開発したらしい。これでAutoencoderのようなものを作ったが簡単に成功しなかったとのこと。



もとになっている論文
https://arxiv.org/abs/1705.07962

airbnbによるプロトタイプの紹介記事
https://airbnb.design/sketching-interfaces/

code2pix
https://towardsdatascience.com/code2pix-deep-learning-compiler-for-graphical-user-interfaces-1256c346950b

Reference

Frontend developer Handbook 2018
https://frontendmasters.com/books/front-end-handbook/2018/

mvコマンドを使って多くのファイルの移動しようとしてargument list too longが出た時の対処法

mv source/* target/

としようとして、ファイル数が多すぎて (およそ10万件)エラーを発生した場合、

ls source | xargs -I{} source/{} target/

とすることで解決することを確認した。

他の方法はこちらにありますが、上記の方が個人的にはわかりやすかった。
https://stackoverflow.com/questions/11942422/moving-large-number-of-files

lsとfindの比較にはこちらが参考になる
https://qiita.com/stc1988/items/e3a1d7dccafe4ab573fa

2018-12-09

Break numpy 2d array into patches and get it back

Here is a code

def split_array(arr, nrows, ncols):
    h, w = arr.shape
    return (arr.reshape(h//nrows, nrows, -1, ncols)
            .swapaxes(1,2)
            .reshape(-1, nrows, ncols))

def inv_split_array(arr, rows, cols):
    sub_rows, sub_cols = arr[0].shape
    return  (subarr.reshape(rows // sub_rows, cols // sub_cols, sub_rows, sub_cols)
            .transpose((0, 2, 1, 3))
            .reshape(row, cols))


Sample outputs below

row, col = 2*4, 2*6
arr = np.array(range(1, row*col+1))
arr = arr.reshape(row, col)
print(arr)
subarr = split_array(arr, 2, 2)
print(subarr)
# arr2 = subarr.reshape(2,2,2,2).swapaxes(1,2).reshape(4,4)
subarr = subarr.reshape(4, 6, 2, 2).transpose((0, 2, 1, 3))
print(subarr)
arr2 = subarr.reshape(row, col)
print(arr2)

[[ 1  2  3  4  5  6  7  8  9 10 11 12]
 [13 14 15 16 17 18 19 20 21 22 23 24]
 [25 26 27 28 29 30 31 32 33 34 35 36]
 [37 38 39 40 41 42 43 44 45 46 47 48]
 [49 50 51 52 53 54 55 56 57 58 59 60]
 [61 62 63 64 65 66 67 68 69 70 71 72]
 [73 74 75 76 77 78 79 80 81 82 83 84]
 [85 86 87 88 89 90 91 92 93 94 95 96]]
[[[ 1  2]
  [13 14]]

 [[ 3  4]
  [15 16]]

 [[ 5  6]
  [17 18]]

 [[ 7  8]
  [19 20]]

 [[ 9 10]
  [21 22]]

 [[11 12]
  [23 24]]

 [[25 26]
  [37 38]]

 [[27 28]
  [39 40]]

 [[29 30]
  [41 42]]

 [[31 32]
  [43 44]]

 [[33 34]
  [45 46]]

 [[35 36]
  [47 48]]

 [[49 50]
  [61 62]]

 [[51 52]
  [63 64]]

 [[53 54]
  [65 66]]

 [[55 56]
  [67 68]]

 [[57 58]
  [69 70]]

 [[59 60]
  [71 72]]

 [[73 74]
  [85 86]]

 [[75 76]
  [87 88]]

 [[77 78]
  [89 90]]

 [[79 80]
  [91 92]]

 [[81 82]
  [93 94]]

 [[83 84]
  [95 96]]]
[[[[ 1  2]
   [ 3  4]
   [ 5  6]
   [ 7  8]
   [ 9 10]
   [11 12]]

  [[13 14]
   [15 16]
   [17 18]
   [19 20]
   [21 22]
   [23 24]]]


 [[[25 26]
   [27 28]
   [29 30]
   [31 32]
   [33 34]
   [35 36]]

  [[37 38]
   [39 40]
   [41 42]
   [43 44]
   [45 46]
   [47 48]]]


 [[[49 50]
   [51 52]
   [53 54]
   [55 56]
   [57 58]
   [59 60]]

  [[61 62]
   [63 64]
   [65 66]
   [67 68]
   [69 70]
   [71 72]]]


 [[[73 74]
   [75 76]
   [77 78]
   [79 80]
   [81 82]
   [83 84]]

  [[85 86]
   [87 88]
   [89 90]
   [91 92]
   [93 94]
   [95 96]]]]
[[ 1  2  3  4  5  6  7  8  9 10 11 12]
 [13 14 15 16 17 18 19 20 21 22 23 24]
 [25 26 27 28 29 30 31 32 33 34 35 36]
 [37 38 39 40 41 42 43 44 45 46 47 48]
 [49 50 51 52 53 54 55 56 57 58 59 60]
 [61 62 63 64 65 66 67 68 69 70 71 72]
 [73 74 75 76 77 78 79 80 81 82 83 84]
 [85 86 87 88 89 90 91 92 93 94 95 96]]


2018-12-08

MNISTを使ったautoencoderの比較

I ran 10 epoch on my Macbook Pro. It took around 10+ minutes. Running condition were

- Input size was (32, 32, 1)
- Output of autoencoder was the input of discriminator.
- Discriminator outputs (2, 2, 1) i.e. four patches.
- 1000 batch / epoch
- 1 sample / batch
- Loss function of autoencoder + discriminator(untrainable) was mse(discriminator) + 100 * mae(autoencoder)
- Loss function of discriminator was mse
- Optimizer was Adam(0.0002, 0.5) for autoencoder and discriminator

, and also I changed the last of two conditions and trained again.

Network architecture is shown afater result.

Result

3 conv + 3 deconv

Looks nicest among the results.

3 conv + 3 deconv + res

It may need more time to train.

3 conv + 3 deconv + skip


5 conv + 5 deconv


3 conv + 3 deconv with optimizer, SGD(momentum=0.2) for autoencoder



3 conv + 3 deconv with mse for autoencoder loss


It looks a little blurrer than mae loss.

I compared loss and accuracy of optimizer Adam and SGD and SGD was faster to converge and achieved less loss.

Learning loss and accuracy of Adam is below.





Learning loss and accuracy of SGD is below.





Network Architecture

Network Architecture of 3 conv + 3 deconv

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 32, 32, 1)         0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 16, 16, 2)         34        
_________________________________________________________________
leaky_re_lu_5 (LeakyReLU)    (None, 16, 16, 2)         0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 8, 8, 8)           264       
_________________________________________________________________
leaky_re_lu_6 (LeakyReLU)    (None, 8, 8, 8)           0         
_________________________________________________________________
batch_normalization_4 (Batch (None, 8, 8, 8)           32        
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 4, 4, 16)          2064      
_________________________________________________________________
leaky_re_lu_7 (LeakyReLU)    (None, 4, 4, 16)          0         
_________________________________________________________________
batch_normalization_5 (Batch (None, 4, 4, 16)          64        
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 8, 8, 16)          0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 8, 8, 16)          4112      
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 8, 16)          64        
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 16, 16, 16)        0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 16, 16, 8)         2056      
_________________________________________________________________
batch_normalization_7 (Batch (None, 16, 16, 8)         32        
_________________________________________________________________
up_sampling2d_3 (UpSampling2 (None, 32, 32, 8)         0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 32, 32, 1)         129       
=================================================================
Total params: 8,851
Trainable params: 8,755
Non-trainable params: 96

Network Architecture of discriminator

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 32, 32, 1)    0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            (None, 32, 32, 1)    0                                            
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 32, 32, 2)    0           input_1[0][0]                    
                                                                 input_2[0][0]                    
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 16, 16, 64)   2112        concatenate_1[0][0]              
__________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU)       (None, 16, 16, 64)   0           conv2d_1[0][0]                   
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 8, 8, 128)    131200      leaky_re_lu_1[0][0]              
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU)       (None, 8, 8, 128)    0           conv2d_2[0][0]                   
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 8, 8, 128)    512         leaky_re_lu_2[0][0]              
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 4, 4, 256)    524544      batch_normalization_1[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_3 (LeakyReLU)       (None, 4, 4, 256)    0           conv2d_3[0][0]                   
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 4, 4, 256)    1024        leaky_re_lu_3[0][0]              
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 2, 2, 512)    2097664     batch_normalization_2[0][0]      
__________________________________________________________________________________________________
leaky_re_lu_4 (LeakyReLU)       (None, 2, 2, 512)    0           conv2d_4[0][0]                   
__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, 2, 2, 512)    2048        leaky_re_lu_4[0][0]              
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 2, 2, 1)      8193        batch_normalization_3[0][0]      
==================================================================================================
Total params: 5,532,802
Trainable params: 2,765,505
Non-trainable params: 2,767,297

2018-11-30

MacOSにMySQL8.0.11をインストールしてmysql -uroot が使えずはまった話

sockのpermissionで怒られたりpidファイルがないと怒られたりしながら、大変な苦労をしてしまった。

参考になったサイトは記事の最下部に記した。terminalで

$ mysqld_safe --skip-grant-tables &

というコマンドをsudoなしで実行すると、mysqlが認証なしでforgroundで起動した。そのターミナルはmysqlを起動したまま、別のterminalを開いた。そのターミナルで、 $ mysql -urootを実行してmysqlに入り、

mysql> flush privileges;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
mysql> flush privileges;

を実行することでパスワードを変更する。flush privilegesは最初にも実行しないと、passwordを変更する権限が得られなかった。

https://stackoverflow.com/questions/2101694/how-to-set-root-password-to-null
https://unix.stackexchange.com/questions/58655/turn-off-skip-grant-tables-in-mysql

2018-11-27

store key pair in AWS ec2

~/.aws/credentials
seems nice to store your key as described in boto documents

chmod 700 ~/.aws/credentials
chmod 004 ~/.aws/rootkey.csv

[Raspberry Pi] 赤外線を保存する Record infrared light

前記事: [Raspberry Pi] 赤外線を読み取る Detect infrared light

前回の記事では、赤外線モジュールに赤外線を感知させるところまでやりました。今回は、Raspberry Piに赤外線リモコンのコードを覚えさせます。


LIRCの再起動

$ sudo /etc/init.d/lirc stop
$ sudo /etc/init.d/lirc start

とし、LIRCを再起動します。


リモコンのコードを書き出す

今回は、電気 (light) のリモコン (remote controller) をlight_cont.confに書き出します。これはリモコンごとにファイルに書き出します。ファイル名はリモコンの番号や社名などにするとよいです。


$ sudo irrecord -n -d /dev/lirc0 light_cont.conf

とします。さらに続けてEnterを二度押し、リモコンの学習させたいボタンを全て押します。今回のリモコンは天井ライト用の三洋電機のSLR-271、赤外線受信モジュールはPL-IRM1261-C438 (PARA LIGHT)です。

もし、
irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

irrecord: could not open /dev/lirc0
irrecord: default_init(): Device or resource busy
irrecord: could not init hardware (lircd running ? --> close it, check permissions)


と出たら、

$ sudo /etc/init.d/lirc stop

としてLIRCを止めておきます。うまくいけば、次のように学習が始まります。


pi@raspberrypi:~ $ sudo irrecord -n -d /dev/lirc0 light_cont.conf

irrecord -  application for recording IR-codes for usage with lirc

Copyright (C) 1998,1999 Christoph Bartelmus(lirc@bartelmus.de)

This program will record the signals from your remote control
and create a config file for lircd.


A proper config file for lircd is maybe the most vital part of this
package, so you should invest some time to create a working config
file. Although I put a good deal of effort in this program it is often
not possible to automatically recognize all features of a remote
control. Often short-comings of the receiver hardware make it nearly
impossible. If you have problems to create a config file READ THE
DOCUMENTATION of this package, especially section "Adding new remote
controls" for how to get help.

If there already is a remote control of the same brand available at
http://www.lirc.org/remotes/ you might also want to try using such a
remote as a template. The config files already contain all
parameters of the protocol used by remotes of a certain brand and
knowing these parameters makes the job of this program much
easier. There are also template files for the most common protocols
available in the remotes/generic/ directory of the source
distribution of this package. You can use a template files by
providing the path of the file as command line parameter.

Please send the finished config files to <lirc@bartelmus.de> so that I
can make them available to others. Don't forget to put all information
that you can get about the remote control in the header of the file.

Press RETURN to continue.


Now start pressing buttons on your remote control.

It is very important that you press many different buttons and hold them
down for approximately one second. Each button should generate at least one
dot but in no case more than ten dots of output.
Don't stop pressing buttons until two lines of dots (2x80) have been
generated.

Press RETURN now to start recording.
................................................................................
Found gap: 7622
Please keep on pressing buttons like described above.
................................................................................
RC-5 remote control found.
No header found.
No lead pulse found.
No repeat code found.
Unknown encoding found.
Creating config file in raw mode.
Now enter the names for the buttons.

Please enter the name for the next button (press <ENTER> to finish recording)
light

Now hold down button "light".
Sorry, something went wrong.
Try again.
Sorry, something went wrong.
Try again.
Sorry, something went wrong.
Try again.
Sorry, something went wrong.
Try again.
Sorry, something went wrong.

この環境では、うまくいきませんでした。リモコンにはボタンが一つで、チャンネルというピンが一個ついていて、1-2を切り替えられます。調べると、ボタンの数が二個のリモコンでも成功している人はいます。

赤外線受信モジュールを交換したらうまくいきました。最初に使った受信モジュールは感度が高すぎてノイズが混ざってしまうため、問題があったようです。


LIRCから使えるようにファイルをコピーします

$ sudo sh -c "cat light_cont.conf > /etc/lirc/lircd.conf"

http://www.bytecreation.com/blog/2013/10/13/raspberry-pi-ultrasonic-sensor-hc-sr04


参考
赤外線リモコン - Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた。(しかも御坂美琴ちゃんが応答してくれる) - Qiita
Raspberry Pi2でリモコンを使って水槽の照明をつける | Tiger Star パソコンと金魚
[Raspberry Pi]赤外線リモコンを使う

ルーマニア革命の動画

1989年の冬にニコラエ・チャウシェスクの独裁政権が革命によって倒れる七日間の動画が上がっていた。革命の一ヶ月後の放送なので、もう30年近く前のテレビ放送だ。
一気に最後まで観てしまった。

遊牧生活は自殺率を高くするのか




仮説だが、 『遊牧民の自殺率は定住民の自殺率よりも高い』のではないだろうか。というのも、実体験から、帰る場所が不安定といった、どこかにアンカーを降ろさない生活をしていると、いつでも死んでよい、いつでも消えてよいような気がしてくるからだ。

荷物が少ないこと

荷物が少ないことをよいとする人たちがいる。ミニマリズムを崇拝し、何もない部屋でless is moreを説き、断捨離という新語をありがたく使い、座禅をよくわかってないのにZEN LIFEを語る人たちだ。ほら、この動画のように。



荷物が少ないのは、身軽なようでいながら、見方を変えれば、まるで死ぬ準備をしているようだ。持ち物がないのは、世の中に未練がなさすぎる。私の持ち物も全てリュックに全ておさまる。三日間の洋服と、仕事に使うノートパソコンと、一冊の本ぐらいしかない。この一年間で三回引っ越した。もはや荷物なんか持っていられない。洋服もシーズンが変わるごとに捨てている。ファストファッションありがとう。靴も革靴があればいい。オンもオフも足りるから。本当は、フランス語のテキストや中国語の問題集なども持っておきたい。持っておきたいというか、今は持っている。今は仮住まいの部屋に何冊かの本が置いてある。また出て行くことになるころには全て読み終わり処分していることだろう。

未練や執着がないのは仏教では望ましいが、出家は、残された人からしたら、生きながら死なれるようなものだった。出家は「世を捨つ」とも言う。愛した女が出家してしまって涙の止まらない男の話もよくある。

伝統的な遊牧民は自殺率が高いのか

Interfoto/Almay


遊牧民の自殺率の調査は何かを教えてくれるだろうか。コロラド大学アンシュッツ・メディカル・キャンパスのJames (Jay) H. Shore教授によるIndian (native american)の自殺率の報告について、Risk Factors for Youth Suicide, 2013 という本の中で取り上げられていた。


suicide rates are high among traditionally nomadic tribes and lower among agricultural village tribes. 自殺率は伝統的な遊牧民の間で高く、農耕民族の間では低い (Risk Factors for Youth Suicide edited by Lucy Davidson, Markku Linnoila, Google Books)


しかし、本書で筆者は続けて、「自殺率の高さには、村落、集団的な影響よりも、アメリカ政府の取り組みが破壊的な影響を及ぼしているのは明白である」と述べていた。それが、たとえ、ネイティブアメリカン保護の活動であっても、である。


it is evident that the controls of the Federal government, including movement of Indians to reservations, was more disruptive of the cultural patterns of nomadic, than of the village-based, groups.


また、別の書籍では次のような報告もあった。定住生活をしている部族の自殺率の低い一例だが、狩猟採集時代についての記載がないので、比較ができない。

The navajo, who have thw lowest suicide rate, were nomadic hunters and gatherers who later settled down and turned to agriculture. (ナヴァホ族の自殺率は低い。彼らはかつて狩猟採集の遊牧民族であったが後に定住して濃厚部族となった。) (Suicide: A Global Perspective By Maurizio Pompili)

遊牧民の自殺率を数えている人などなかなかいないのであろう。国勢調査もない、警察による報告もないような遊牧部族の自殺率をどうやって調べているのかは、むしろ気になるところなので、その手法を論文を読んで確かめたいぐらいだ。

孤独について

海部町 (現、海陽町)

さて、ここまで出家と遊牧民について軽く書いたが、実際、遊牧民族だからという理由で自殺率が高いわけではないのかもしれない。そもそも、東京で根無し草の生活をしている人たちと、伝統的な遊牧民族では比較にならないのではないだろうか。
東京でノマド生活をしている人のイメージは、仕事は抱えており、それなりに優秀であるが、社交性に欠け、家族も持たず、活躍しているように見えながら孤独であり、いざというときに覚悟を決められない。nomadic生活を送る性格から明らかなように、いつでも逃げられる姿勢をとっている。次の記事には、イギリスで孤独担当大臣が誕生して、孤独問題を扱うとある。それだけ孤独は深刻な問題らしい。

孤独<1>10~44歳で死因1位の自殺は孤独とも密接に関連

人には精神的な居場所があればいいのかもしれない。「岡檀(2013), 生き心地の良い町 この自殺率の低さには理由(わけ)がある, 講談社」によれば、徳島県の海部町では、老人が多いが、みな人におせっかいをやき、相手の顔色もうかがわない勝手な人たちばかりだと。しかし、それでも自殺率が圧倒的に日本国内で低い。私の記憶に不明瞭なところもあるかもしれないが、雨が降れば人の家の洗濯物も勝手に取り込んでくれて、魚が余れば勝手に人の家の中に投げ込んでおすそわけをする、といった話もあった。この話から察するに、決して気にかけているというわけではない。心配してくれているというわけでもない。みな、勝手なのだ。たとえノマドのような生活をしていても、そういった勝手な人たちの間にいたら気が楽なのかもしれない。

2018-11-24

所有格の-sとofの使い分け

非常にためになる記事で、何年間もブラウザのブックマークにいたので紹介したい。
http://d.hatena.ne.jp/rhb/20091223/p1

大まかに言えば、-sは人に使い、ofは無生物に使います。

しかし、today's paperのように、人の集合でもない無生物のtodayに'sがつく例の説明がなくて困った。慣用表現であろうか。次のように、-sとofでは明確に意味が異なr

today's newspapers(今日の新聞)
newspapers of today(現代の新聞)

pix2pixの学習過程の描画

pix2pixを使ってposeからアニメ画像の生成の学習を進めたときの途中経過をtest画像で描画した。

5枚で学習

『情報幾何学」の新展開が届きました。

ディープラーニングの裏にある数学を理解したいと思っていたところ、情報幾何という分野があることを知り、本書を購入。多様体、リーマン幾何学、統計的推論から機械学習まで盛りだくさん。読みます。

2018-11-20

[WordPress] WP TOTAL CACHEを使うとレイアウトが崩れた。minifyが原因でした。

wordpressで高速化のためにWP TOTAL CACHEを導入したらスタイルが崩れたときの話。

状況

親テーマのstorefrontを継承したstorefront-childというテーマを作り、home.cssを作って読み込ませた。
WP TOTAL CACHEを使用してページキャッシュやminifyを行ったところ、home.cssの一部が読まれなくなった。

原因

ソースコードをよく見ると、minifyされたhome.cssはwp-content/cache/minifyにある英数字の文字列.cssというminifyファイルとして保存されており、それはhtml中のheadの最初に呼ばれていた。home.cssには、親テーマのcssを上書きしている部分があり、親テーマよりもhome.cssのminifyされたファイルが先に呼び出されていたために、上書きがきかなくなっていた様子。

解決策

呼び出し順序を変えられるようには見えないので、WP TOTAL CACHEのminify機能は使わないことにした。

2018-11-16

FontAwesome ver 5 をCSSの擬似要素で使うときは font-family: "Font Awesome 5 Free" で指定

.anchor-product {
  background-color: lightgreen;
  font-weight: bold;
  color: black;
  border-radius: 25px;
  font-size: 10pt;
  padding: 0.1rem 0.2rem;
}

.anchor-product::before {
  font-family: "Font Awesome 5 Free";
  content: "\f07a";
  padding-right: 5px;
}

とすると



のように表示された。 ver4までは

font-family: "FontAwesome"

だったので注意。<i>では表示されるのに、CSS擬似要素では表示されず困惑した。

2018-11-10

PatchGANの実装方法は一つ一つのPatchを作る必要はなく、画像全体を入力とすればよいことの説明

PatchGANを含む、たとえばpix2pixのソースコードを見ていても、Patchをそれぞれiterateしてるような記述がないじゃないかと思っていたが、それでいいらしい。

https://nodaki.hatenablog.com/entry/2018/07/27/235914

Q: And looks like discriminator you've implemented is just a conv net, not a patchgan that was mentioned in the paper.
A: Which is patch ij in the input? Well, output X_ij is just a neuron in a convnet, and we can trace back its receptive field to see which input pixels it is sensitive to.
(Question: PatchGAN Discriminator · Issue #39 · junyanz/pytorch-CycleGAN-and-pix2pix · GitHub)

kerasのpix2pixのコード。

pix2pixのソースコードを書きました。主に、 https://github.com/eriklindernoren/Keras-GAN/tree/master/pix2pix にあるものをベースに、リファクタしつつ、notebook形式にしました。まだクラス間の無駄な結合などもありますが、とりあえず動くようになりました。 下記にhtmlを直接貼り付けました。
試みに、同一のデータを3つ、1 batchに1データ、1epochに3batchを入れて、12epochまで学習したときの画像(ほとんど学習は進んでいない)。
pix2pix

Pix2Pix

In [1]:
from __future__ import print_function, division
import scipy

from keras.datasets import mnist
from keras_contrib.layers.normalization import InstanceNormalization
from keras.layers import Input, Dense, Reshape, Flatten, Dropout, Concatenate
from keras.layers import BatchNormalization, Activation, ZeroPadding2D
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.convolutional import UpSampling2D, Conv2D
from keras.models import Sequential, Model
from keras.optimizers import Adam
import datetime
import matplotlib.pyplot as plt
import sys
from data_loader import DataLoader
import numpy as np
import os
import glob
import skimage
import imageio
/Users/n/.pyenv/versions/3.6.1/envs/ssd/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
Using TensorFlow backend.
/Users/n/.pyenv/versions/3.6.1/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
In [2]:
class DataLoader():
    """
    .
    ├── README.md
    ├── datasets
    │   ├── test
    │   │   ├── source
    │   │   │   ├── 0.jpg
    │   │   │   └── 1.jpg
    │   │   └── target
    │   │       ├── 0.jpg
    │   │       └── 1.jpg
    │   └── train
    │       ├── source
    │       │   ├── 0.jpg
    │       │   ├── 1.jpg
    │       │   └── 2.jpg
    │       └── target
    │           ├── 0.jpg
    │           ├── 1.jpg
    │           └── 2.jpg
    ├── images
    └── pix2pix.ipynb
    
    """
    def __init__(self, dataset_path='datasets', img_res=(256, 256)):
        self.dataset_path = dataset_path
        self.img_res = img_res
        
    def _imread(self, path):
        return imageio.imread(path, as_gray=False, pilmode='RGB').astype(np.float)

    def load_data(self, batch_size=1, is_training=True):
        data_type = "train" if is_training else "test"
        source_paths_list = glob.glob('{}/{}/source/*'.format(self.dataset_path, data_type))
        target_paths_list = [path.replace('source', 'target') for path in source_paths_list]
        
        source_paths = np.array(source_paths_list)
        target_paths = np.array(source_paths_list)
        
        indexes = np.random.randint(len(source_paths), size=batch_size)
        
        source_batches = source_paths[indexes]
        target_batches = target_paths[indexes]
        
        imgs_source = []
        imgs_target = []
        
        for source_path, target_path in zip(source_batches, target_batches):
            img_source = self._imread(source_path)
            img_target = self._imread(target_path)

            img_source = skimage.transform.resize(img_source, self.img_res)
            img_target = skimage.transform.resize(img_target, self.img_res)

            # Do random horizontal flip on training
            if is_training and np.random.random() < 0.5:
                img_source = np.fliplr(img_source)
                img_target = np.fliplr(img_target)

            imgs_source.append(img_source)
            imgs_target.append(img_target)

        imgs_source = np.array(imgs_source) / 255
        imgs_target = np.array(imgs_target) / 255

        return imgs_source, imgs_target

    def generate_batch(self, batch_size=1, is_training=True):
        data_type = "train" if is_training else "test"
        source_paths_list = glob.glob('{}/{}/source/*'.format(self.dataset_path, data_type))
        target_paths_list = [path.replace('source', 'target') for path in source_paths_list]
        
        source_paths = np.array(source_paths_list)
        target_paths = np.array(source_paths_list)

        n_batches = len(source_paths) // batch_size

        while True:
            for i in range(n_batches):
                source_batch = source_paths[i * batch_size : (i + 1) * batch_size]
                target_batch = target_paths[i * batch_size : (i + 1) * batch_size]
                imgs_source, imgs_target = [], []
                for source_path, target_path in zip(source_batch, target_batch):
                    img_source = self._imread(source_path)
                    img_target = self._imread(target_path)

                    img_source = skimage.transform.resize(img_source, self.img_res)
                    img_target = skimage.transform.resize(img_target, self.img_res)

                    if is_training and np.random.random() > 0.5:
                        img_source = np.fliplr(img_source)
                        img_target = np.fliplr(img_source)

                    imgs_source.append(img_source)
                    imgs_target.append(img_target)

                imgs_source = np.array(imgs_source) / 255
                imgs_target = np.array(imgs_target) / 255

                yield imgs_source, imgs_target
In [6]:
class Pix2Pix():
    """
    Build Pix2pix class
    """
    def __init__(self):
        # Input shape
        self.img_rows = 256
        self.img_cols = 256
        self.channels = 3
        # channel last
        self.img_shape = (self.img_rows, self.img_cols, self.channels)

        # Calculate output shape of D (PatchGAN)
        patch = int(self.img_rows / 2**4)
        self.disc_patch = (patch, patch, 1)

        # Number of filters in the first layer of G and D
        self.gf = 64
        self.df = 64

        optimizer = Adam(0.0002, 0.5)

        # Build and compile the discriminator
        self.discriminator = self.build_discriminator()
        self.discriminator.compile(
            loss='mse',
            optimizer=optimizer,
            metrics=['accuracy']
        )

        #-------------------------
        # Construct Computational
        #   Graph of Generator
        #-------------------------

        # Build the generator
        self.generator = self.build_generator()

        # Input image
        img_source = Input(shape=self.img_shape)

        # convert source image into fake image
        img_fake = self.generator(img_source)

        # For the combined model we will only train the generator
        self.discriminator.trainable = False

        # Discriminators determines validity of (source, fake)
        valid = self.discriminator([img_source, img_fake])

        self.combined = Model(inputs=[img_source], outputs=[valid, img_fake])
        self.combined.compile(loss=['mae', 'mae'],
                              loss_weights=[1, 100],
                              optimizer=optimizer)

    def build_generator(self):
        """
        U-Net Generator
        generator: input image -> output image
        """

        def conv2d(layer_input, filters, f_size=4, bn=True):
            """Layers used during downsampling"""
            d = Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input)
            d = LeakyReLU(alpha=0.2)(d)
            if bn:
                d = BatchNormalization(momentum=0.8)(d)
            return d

        def deconv2d(layer_input, skip_input, filters, f_size=4, dropout_rate=0):
            """Layers used during upsampling"""
            u = UpSampling2D(size=2)(layer_input)
            u = Conv2D(filters, kernel_size=f_size, strides=1, padding='same', activation='relu')(u)
            if dropout_rate:
                u = Dropout(dropout_rate)(u)
            u = BatchNormalization(momentum=0.8)(u)
            u = Concatenate()([u, skip_input])
            return u

        # Image input
        d0 = Input(shape=self.img_shape)

        # Downsampling
        d1 = conv2d(d0, self.gf, bn=False)
        d2 = conv2d(d1, self.gf*2)
        d3 = conv2d(d2, self.gf*4)
        d4 = conv2d(d3, self.gf*8)
        d5 = conv2d(d4, self.gf*8)
        d6 = conv2d(d5, self.gf*8)
        d7 = conv2d(d6, self.gf*8)

        # Upsampling
        u1 = deconv2d(d7, d6, self.gf*8)
        u2 = deconv2d(u1, d5, self.gf*8)
        u3 = deconv2d(u2, d4, self.gf*8)
        u4 = deconv2d(u3, d3, self.gf*4)
        u5 = deconv2d(u4, d2, self.gf*2)
        u6 = deconv2d(u5, d1, self.gf)

        u7 = UpSampling2D(size=2)(u6)
        output_img = Conv2D(self.channels, kernel_size=4, strides=1, padding='same', activation='tanh')(u7)

        return Model(d0, output_img)

    def build_discriminator(self):
        """
        we train discriminator to judge
        (source image, target image) as genuine, and
        (source image, fake image)   as fake.
        """

        def d_layer(layer_input, filters, f_size=4, bn=True):
            """Discriminator layer"""
            d = Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input)
            d = LeakyReLU(alpha=0.2)(d)
            if bn:
                d = BatchNormalization(momentum=0.8)(d)
            return d

        img_source = Input(shape=self.img_shape)
        img_target = Input(shape=self.img_shape)

        # Concatenate image and conditioning image by channels to produce input
        combined_imgs = Concatenate(axis=-1)([img_source, img_target])

        d1 = d_layer(combined_imgs, self.df, bn=False)
        d2 = d_layer(d1, self.df*2)
        d3 = d_layer(d2, self.df*4)
        d4 = d_layer(d3, self.df*8)

        validity = Conv2D(1, kernel_size=4, strides=1, padding='same')(d4)

        return Model([img_source, img_target], validity)

    def train(self, epochs, gen_train_data, train_steps, test_steps, batch_size=1, savefig_epoch_interval=50, gen_test_data=None, load_data=None):

        start_time = datetime.datetime.now()
        
        self.load_data = load_data

        # Adversarial loss ground truths
        valid = np.ones((batch_size,) + self.disc_patch)
        fake = np.zeros((batch_size,) + self.disc_patch)

        self.d_losses = []
        self.d_accs = []
        self.g_losses = []
        
        self.d_val_losses = []
        self.d_val_accs = []
        self.g_val_losses = []
        
        for epoch in range(1, epochs + 1):
            d_losses_epoch = []
            d_accs_epoch = []
            g_losses_epoch = []
            for batch_i, (imgs_source, imgs_target) in enumerate(gen_train_data):
                if train_steps == batch_i: break

                # ---------------------
                #  Train Discriminator
                # ---------------------

                # Condition on B and generate a translated version
                imgs_fake = self.generator.predict(imgs_source)

                # Train the discriminators (original images = real / generated = Fake)
                d_loss_real = self.discriminator.train_on_batch([imgs_source, imgs_target], valid)
                d_loss_fake = self.discriminator.train_on_batch([imgs_source, imgs_fake], fake)
                d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

                # -----------------
                #  Train Generator
                # -----------------

                # Train the generators
                g_loss = self.combined.train_on_batch([imgs_source], [valid, imgs_fake])

                d_losses_epoch.append(d_loss[0])
                d_accs_epoch.append(d_loss[1])
                g_losses_epoch.append(g_loss[0])
            
            d_loss = np.mean(d_losses_epoch)
            d_acc = np.mean(d_accs_epoch)
            g_loss = np.mean(g_losses_epoch)
            
            self.d_losses.append(d_loss)
            self.d_accs.append(d_acc)
            self.g_losses.append(g_loss)
                
            d_val_losses_epoch = []
            d_val_accs_epoch = []
            g_val_losses_epoch = []
            for batch_i, (imgs_source, imgs_target) in enumerate(gen_test_data):
                if test_steps == batch_i: break

                # ---------------------
                #  Test Discriminator
                # ---------------------
                imgs_fake = self.generator.predict(imgs_source)
                d_val_loss_real = self.discriminator.test_on_batch([imgs_source, imgs_target], valid)
                d_val_loss_fake = self.discriminator.test_on_batch([imgs_source, imgs_fake], fake)
                d_val_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
                
                # ---------------------
                #  Test Generator
                # ---------------------
                g_val_loss = self.combined.test_on_batch([imgs_source], [valid, imgs_fake])
                
                d_val_losses_epoch.append(d_val_loss[0])
                d_val_accs_epoch.append(d_val_loss[1])
                g_val_losses_epoch.append(g_val_loss[0])

            d_val_loss = np.mean(d_val_losses_epoch)
            d_val_acc = np.mean(d_val_accs_epoch)
            g_val_loss = np.mean(g_val_losses_epoch)
            
            self.d_val_losses.append(d_val_loss)
            self.d_val_accs.append(d_val_acc)
            self.g_val_losses.append(g_val_loss)

            # Plot the progress
            elapsed_min = (datetime.datetime.now() - start_time).total_seconds()
            
            
            print ("[Epoch {}/{}] [D loss: {:.3g}, acc: {:.1%}] [G loss: {:.3g}] time:{:.0f}:{:.1g}".format(
                epoch, epochs, d_loss, d_acc, g_loss, elapsed_min // 60, elapsed_min % 60 )
            )

            # Draw generated image at every epoch_interval.
            if epoch % savefig_epoch_interval == 0 or epoch == 1:
                self.sample_images(epoch)

    def sample_images(self, epoch):
        os.makedirs('images', exist_ok=True)
        r, c = 3, 3

        imgs_source, imgs_target = self.load_data(batch_size=3, is_training=False)
        imgs_fake = self.generator.predict(imgs_source)

        gen_imgs = np.concatenate([imgs_source, imgs_fake, imgs_target])

        # Rescale images 0 - 1
        gen_imgs = np.clip(gen_imgs, 0, 1)

        titles = ['Source', 'Generated', 'Target']
        fig, axs = plt.subplots(r, c)
        cnt = 0
        for i in range(r):
            for j in range(c):
                axs[i,j].imshow(gen_imgs[cnt])
                axs[i, j].set_title(titles[i])
                axs[i,j].axis('off')
                cnt += 1
        fig.savefig("images/{}.png".format(epoch))
        plt.close()
In [7]:
pix2pix = Pix2Pix()
pix2pix.generator.summary()
pix2pix.discriminator.summary()
pix2pix.combined.summary()
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_7 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
conv2d_25 (Conv2D)              (None, 128, 128, 64) 3136        input_7[0][0]                    
__________________________________________________________________________________________________
leaky_re_lu_16 (LeakyReLU)      (None, 128, 128, 64) 0           conv2d_25[0][0]                  
__________________________________________________________________________________________________
conv2d_26 (Conv2D)              (None, 64, 64, 128)  131200      leaky_re_lu_16[0][0]             
__________________________________________________________________________________________________
leaky_re_lu_17 (LeakyReLU)      (None, 64, 64, 128)  0           conv2d_26[0][0]                  
__________________________________________________________________________________________________
batch_normalization_19 (BatchNo (None, 64, 64, 128)  512         leaky_re_lu_17[0][0]             
__________________________________________________________________________________________________
conv2d_27 (Conv2D)              (None, 32, 32, 256)  524544      batch_normalization_19[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_18 (LeakyReLU)      (None, 32, 32, 256)  0           conv2d_27[0][0]                  
__________________________________________________________________________________________________
batch_normalization_20 (BatchNo (None, 32, 32, 256)  1024        leaky_re_lu_18[0][0]             
__________________________________________________________________________________________________
conv2d_28 (Conv2D)              (None, 16, 16, 512)  2097664     batch_normalization_20[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_19 (LeakyReLU)      (None, 16, 16, 512)  0           conv2d_28[0][0]                  
__________________________________________________________________________________________________
batch_normalization_21 (BatchNo (None, 16, 16, 512)  2048        leaky_re_lu_19[0][0]             
__________________________________________________________________________________________________
conv2d_29 (Conv2D)              (None, 8, 8, 512)    4194816     batch_normalization_21[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_20 (LeakyReLU)      (None, 8, 8, 512)    0           conv2d_29[0][0]                  
__________________________________________________________________________________________________
batch_normalization_22 (BatchNo (None, 8, 8, 512)    2048        leaky_re_lu_20[0][0]             
__________________________________________________________________________________________________
conv2d_30 (Conv2D)              (None, 4, 4, 512)    4194816     batch_normalization_22[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_21 (LeakyReLU)      (None, 4, 4, 512)    0           conv2d_30[0][0]                  
__________________________________________________________________________________________________
batch_normalization_23 (BatchNo (None, 4, 4, 512)    2048        leaky_re_lu_21[0][0]             
__________________________________________________________________________________________________
conv2d_31 (Conv2D)              (None, 2, 2, 512)    4194816     batch_normalization_23[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_22 (LeakyReLU)      (None, 2, 2, 512)    0           conv2d_31[0][0]                  
__________________________________________________________________________________________________
batch_normalization_24 (BatchNo (None, 2, 2, 512)    2048        leaky_re_lu_22[0][0]             
__________________________________________________________________________________________________
up_sampling2d_8 (UpSampling2D)  (None, 4, 4, 512)    0           batch_normalization_24[0][0]     
__________________________________________________________________________________________________
conv2d_32 (Conv2D)              (None, 4, 4, 512)    4194816     up_sampling2d_8[0][0]            
__________________________________________________________________________________________________
batch_normalization_25 (BatchNo (None, 4, 4, 512)    2048        conv2d_32[0][0]                  
__________________________________________________________________________________________________
concatenate_9 (Concatenate)     (None, 4, 4, 1024)   0           batch_normalization_25[0][0]     
                                                                 batch_normalization_23[0][0]     
__________________________________________________________________________________________________
up_sampling2d_9 (UpSampling2D)  (None, 8, 8, 1024)   0           concatenate_9[0][0]              
__________________________________________________________________________________________________
conv2d_33 (Conv2D)              (None, 8, 8, 512)    8389120     up_sampling2d_9[0][0]            
__________________________________________________________________________________________________
batch_normalization_26 (BatchNo (None, 8, 8, 512)    2048        conv2d_33[0][0]                  
__________________________________________________________________________________________________
concatenate_10 (Concatenate)    (None, 8, 8, 1024)   0           batch_normalization_26[0][0]     
                                                                 batch_normalization_22[0][0]     
__________________________________________________________________________________________________
up_sampling2d_10 (UpSampling2D) (None, 16, 16, 1024) 0           concatenate_10[0][0]             
__________________________________________________________________________________________________
conv2d_34 (Conv2D)              (None, 16, 16, 512)  8389120     up_sampling2d_10[0][0]           
__________________________________________________________________________________________________
batch_normalization_27 (BatchNo (None, 16, 16, 512)  2048        conv2d_34[0][0]                  
__________________________________________________________________________________________________
concatenate_11 (Concatenate)    (None, 16, 16, 1024) 0           batch_normalization_27[0][0]     
                                                                 batch_normalization_21[0][0]     
__________________________________________________________________________________________________
up_sampling2d_11 (UpSampling2D) (None, 32, 32, 1024) 0           concatenate_11[0][0]             
__________________________________________________________________________________________________
conv2d_35 (Conv2D)              (None, 32, 32, 256)  4194560     up_sampling2d_11[0][0]           
__________________________________________________________________________________________________
batch_normalization_28 (BatchNo (None, 32, 32, 256)  1024        conv2d_35[0][0]                  
__________________________________________________________________________________________________
concatenate_12 (Concatenate)    (None, 32, 32, 512)  0           batch_normalization_28[0][0]     
                                                                 batch_normalization_20[0][0]     
__________________________________________________________________________________________________
up_sampling2d_12 (UpSampling2D) (None, 64, 64, 512)  0           concatenate_12[0][0]             
__________________________________________________________________________________________________
conv2d_36 (Conv2D)              (None, 64, 64, 128)  1048704     up_sampling2d_12[0][0]           
__________________________________________________________________________________________________
batch_normalization_29 (BatchNo (None, 64, 64, 128)  512         conv2d_36[0][0]                  
__________________________________________________________________________________________________
concatenate_13 (Concatenate)    (None, 64, 64, 256)  0           batch_normalization_29[0][0]     
                                                                 batch_normalization_19[0][0]     
__________________________________________________________________________________________________
up_sampling2d_13 (UpSampling2D) (None, 128, 128, 256 0           concatenate_13[0][0]             
__________________________________________________________________________________________________
conv2d_37 (Conv2D)              (None, 128, 128, 64) 262208      up_sampling2d_13[0][0]           
__________________________________________________________________________________________________
batch_normalization_30 (BatchNo (None, 128, 128, 64) 256         conv2d_37[0][0]                  
__________________________________________________________________________________________________
concatenate_14 (Concatenate)    (None, 128, 128, 128 0           batch_normalization_30[0][0]     
                                                                 leaky_re_lu_16[0][0]             
__________________________________________________________________________________________________
up_sampling2d_14 (UpSampling2D) (None, 256, 256, 128 0           concatenate_14[0][0]             
__________________________________________________________________________________________________
conv2d_38 (Conv2D)              (None, 256, 256, 3)  6147        up_sampling2d_14[0][0]           
==================================================================================================
Total params: 41,843,331
Trainable params: 41,834,499
Non-trainable params: 8,832
__________________________________________________________________________________________________
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_5 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
input_6 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
concatenate_8 (Concatenate)     (None, 256, 256, 6)  0           input_5[0][0]                    
                                                                 input_6[0][0]                    
__________________________________________________________________________________________________
conv2d_20 (Conv2D)              (None, 128, 128, 64) 6208        concatenate_8[0][0]              
__________________________________________________________________________________________________
leaky_re_lu_12 (LeakyReLU)      (None, 128, 128, 64) 0           conv2d_20[0][0]                  
__________________________________________________________________________________________________
conv2d_21 (Conv2D)              (None, 64, 64, 128)  131200      leaky_re_lu_12[0][0]             
__________________________________________________________________________________________________
leaky_re_lu_13 (LeakyReLU)      (None, 64, 64, 128)  0           conv2d_21[0][0]                  
__________________________________________________________________________________________________
batch_normalization_16 (BatchNo (None, 64, 64, 128)  512         leaky_re_lu_13[0][0]             
__________________________________________________________________________________________________
conv2d_22 (Conv2D)              (None, 32, 32, 256)  524544      batch_normalization_16[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_14 (LeakyReLU)      (None, 32, 32, 256)  0           conv2d_22[0][0]                  
__________________________________________________________________________________________________
batch_normalization_17 (BatchNo (None, 32, 32, 256)  1024        leaky_re_lu_14[0][0]             
__________________________________________________________________________________________________
conv2d_23 (Conv2D)              (None, 16, 16, 512)  2097664     batch_normalization_17[0][0]     
__________________________________________________________________________________________________
leaky_re_lu_15 (LeakyReLU)      (None, 16, 16, 512)  0           conv2d_23[0][0]                  
__________________________________________________________________________________________________
batch_normalization_18 (BatchNo (None, 16, 16, 512)  2048        leaky_re_lu_15[0][0]             
__________________________________________________________________________________________________
conv2d_24 (Conv2D)              (None, 16, 16, 1)    8193        batch_normalization_18[0][0]     
==================================================================================================
Total params: 5,540,994
Trainable params: 2,769,601
Non-trainable params: 2,771,393
__________________________________________________________________________________________________
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_8 (InputLayer)            (None, 256, 256, 3)  0                                            
__________________________________________________________________________________________________
model_5 (Model)                 (None, 256, 256, 3)  41843331    input_8[0][0]                    
__________________________________________________________________________________________________
model_4 (Model)                 (None, 16, 16, 1)    2771393     input_8[0][0]                    
                                                                 model_5[1][0]                    
==================================================================================================
Total params: 44,614,724
Trainable params: 41,834,499
Non-trainable params: 2,780,225
__________________________________________________________________________________________________
/Users/n/.pyenv/versions/3.6.1/envs/ssd/lib/python3.6/site-packages/keras/engine/training.py:490: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?
  'Discrepancy between trainable weights and collected trainable'
In [8]:
data_generator = DataLoader(dataset_path='./datasets', img_res=(256, 256))
pix2pix.train(epochs=30,
              gen_train_data=data_generator.generate_batch(batch_size=1),
              batch_size=1,
              train_steps=3,
              test_steps=3,
              savefig_epoch_interval=2,
              gen_test_data=data_generator.generate_batch(batch_size=1, is_training=False),
              load_data=data_generator.load_data
             )
/Users/n/.pyenv/versions/3.6.1/envs/ssd/lib/python3.6/site-packages/skimage/transform/_warps.py:105: UserWarning: The default mode, 'constant', will be changed to 'reflect' in skimage 0.15.
  warn("The default mode, 'constant', will be changed to 'reflect' in "
/Users/n/.pyenv/versions/3.6.1/envs/ssd/lib/python3.6/site-packages/skimage/transform/_warps.py:110: UserWarning: Anti-aliasing will be enabled by default in skimage 0.15 to avoid aliasing artifacts when down-sampling images.
  warn("Anti-aliasing will be enabled by default in skimage 0.15 to "
/Users/n/.pyenv/versions/3.6.1/envs/ssd/lib/python3.6/site-packages/keras/engine/training.py:490: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?
  'Discrepancy between trainable weights and collected trainable'
[Epoch 1/30] [D loss: 10.6, acc: 18.6%] [G loss: 63.1] time:0:0.36689636666666664
[Epoch 2/30] [D loss: 7.8, acc: 25.1%] [G loss: 31.7] time:0:0.6425304166666667
[Epoch 3/30] [D loss: 4.83, acc: 24.5%] [G loss: 17.5] time:0:0.9134282333333333
[Epoch 4/30] [D loss: 0.84, acc: 54.0%] [G loss: 34] time:0:1.1452397333333333
[Epoch 5/30] [D loss: 0.276, acc: 71.5%] [G loss: 25.6] time:0:1.4189897333333334
[Epoch 6/30] [D loss: 0.21, acc: 77.5%] [G loss: 26.6] time:0:1.64643995
[Epoch 7/30] [D loss: 0.416, acc: 66.3%] [G loss: 69.4] time:0:1.9197473666666667
[Epoch 8/30] [D loss: 0.524, acc: 61.5%] [G loss: 57.1] time:0:2.1526652833333335
[Epoch 9/30] [D loss: 0.427, acc: 64.1%] [G loss: 49.3] time:0:2.4215071166666666
[Epoch 10/30] [D loss: 3.64, acc: 57.8%] [G loss: 61.3] time:0:2.6590558
[Epoch 11/30] [D loss: 1.15, acc: 52.1%] [G loss: 56.5] time:0:2.9228746833333332
[Epoch 12/30] [D loss: 0.195, acc: 77.5%] [G loss: 41.9] time:0:3.1476740333333333
[Epoch 13/30] [D loss: 0.162, acc: 83.5%] [G loss: 82.3] time:0:3.403893816666667
[Epoch 14/30] [D loss: 0.257, acc: 80.6%] [G loss: 87.6] time:0:3.6299401666666666
[Epoch 15/30] [D loss: 0.291, acc: 73.9%] [G loss: 61.6] time:0:3.910651516666667
[Epoch 16/30] [D loss: 0.332, acc: 67.3%] [G loss: 49.9] time:0:4.155374416666667
[Epoch 17/30] [D loss: 0.263, acc: 73.0%] [G loss: 49.1] time:0:4.430737533333333
[Epoch 18/30] [D loss: 0.509, acc: 61.7%] [G loss: 22.4] time:0:4.656643866666667
[Epoch 19/30] [D loss: 0.499, acc: 60.0%] [G loss: 90.5] time:0:4.921009049999999
[Epoch 20/30] [D loss: 0.66, acc: 50.6%] [G loss: 60.3] time:0:5.15392355
[Epoch 21/30] [D loss: 0.293, acc: 71.9%] [G loss: 47.9] time:0:5.4340141
[Epoch 22/30] [D loss: 0.881, acc: 69.7%] [G loss: 42] time:0:5.731224083333333
[Epoch 23/30] [D loss: 0.226, acc: 75.6%] [G loss: 84.4] time:0:6.031099916666666
[Epoch 24/30] [D loss: 2.5, acc: 60.8%] [G loss: 57] time:0:6.258769633333333
[Epoch 25/30] [D loss: 0.246, acc: 76.2%] [G loss: 36.5] time:0:6.5440083666666675
[Epoch 26/30] [D loss: 0.215, acc: 79.9%] [G loss: 42.6] time:0:6.794150516666666
[Epoch 27/30] [D loss: 0.183, acc: 83.2%] [G loss: 104] time:0:7.056668033333334
[Epoch 28/30] [D loss: 0.059, acc: 93.8%] [G loss: 105] time:0:7.285253916666666
[Epoch 29/30] [D loss: 0.0429, acc: 97.1%] [G loss: 70.5] time:0:7.545301283333333
[Epoch 30/30] [D loss: 0.0361, acc: 98.2%] [G loss: 51.3] time:0:7.771382833333333
In [11]:
# --------
# Plot generator and discriminator accuracy and loss all
# --------
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = [i + 1 for i in range(30)]
plt.plot(x, pix2pix.d_val_losses, label="d_val_loss")
plt.plot(x, pix2pix.d_val_accs,   label="d_val_acc")
plt.plot(x, pix2pix.g_val_losses, label="g_val_loss")
plt.plot(x, pix2pix.d_losses,     label='d_loss')
plt.plot(x, pix2pix.d_accs,       label="d_acc")
plt.plot(x, pix2pix.g_losses,     label="g_loss")
plt.xlabel('Epochs')
plt.ylabel('a.u.')
plt.legend()
plt.yscale('log')
plt.title('Scores of pix2pix on CIFAR-10')
plt.show()

飲食店への商品持ち込みを批判する人への反論

持ち込み商品の反対意見について反反論がある。持ち込み商品については、それはマナー違反だからと言う人が多い。商品を持ち込んでいる客がいると、注意したところでバイト代の上がらないバイト、給料の上がらない正社員は注意をし、さらに周りの客でも注意をする人がいる。彼らにその理由を聞くと、「...