Google Colaboratoryをsshで操作する。

Google Colaboratoryをsshで操作する方法がわかったので情報を整理する。

引用情報

https://towardsdatascience.com/colab-free-gpu-ssh-visual-studio-code-server-36fe1d3c5243

手順

  1. ngrokのtalkenを取得する。
  2. Colabにngorkをインストールし実行する。
  3. 手元のPC(mac)でremote接続する。

1. ngrokのtalkenを取得する。

https://ngrok.com/

ngrokで無料の登録をし、authentication setting にてAuthtokenを取得します。

f:id:unachan_kz:20200716223138p:plain

2. Colabにngorkをインストールし実行する。

# Install useful stuff
! apt install --yes ssh screen nano htop ranger git > /dev/null
# SSH setting
! echo "root:carbonara" | chpasswd
! echo "PasswordAuthentication yes" > /etc/ssh/sshd_config
! echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! service ssh restart > /dev/null
# Download ngrok
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
# Run ngrok

PUT_YOUR_TOKEN_HEREには1. で取得したAuthtokenを代入します。

authtoken = "PUT_YOUR_TOKEN_HERE"
get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 22 &')
! sleep 3
# Get the address for SSH
import requests
from re import sub
r = requests.get('http://localhost:4040/api/tunnels')
str_ssh = r.json()['tunnels'][0]['public_url']
str_ssh = sub("tcp://", "", str_ssh)
str_ssh = sub(":", " -p ", str_ssh)
str_ssh = "ssh root@" + str_ssh
print(str_ssh)
  1. 手元のPC(mac)でremote接続する。
ssh root@0.tcp.ngrok.io -p 14407

passwordを求められた場合には、carbonaraを入力する。

無事にログインできました。

補足

何度かトライしてると以下の様なエラーが発生してしまう。この点は調査を進めていく。

ConnectionError: HTTPConnectionPool(host='localhost', port=4040): Max retries exceeded with url: /api/tunnels (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7feef3c55b70>: Failed to establish a new connection: [Errno 111] Connection refused',))

VAEのいろいろ

最近読んでいる本で、VAEにはいろんな種類の派生技術があることがわかった。 このため、整理する。

参考書

AIが筆跡を覚えることが可能だと思わせる技術(Conditional VAE)

Conditional VAEは、潜在変数だけではなくDecoderに入力することでラベルを指定した生成を行う。

下記は、指定したラベルの手書き数字画像が生成された結果 f:id:unachan_kz:20200628182922p:plain

それぞれ縦横2つの潜在変数を変化させているが、同じ文字でも書き方が変化していることがわかる。 VAEは教師なし学習であるが、これに対して教師あり学習の要素を加えて反響しあり学習にすることで、復元するデータの指定を行うことが可能になる。

参考論文

https://arxiv.org/pdf/1406.5298.pdf

潜在変数を使って画像などの特徴を要素分解できる興味深い技術(β-VAE)

β-VAEは、画像特徴の「disentanglement」、すなわち「もつれ」をとくことが特徴で、画像の禿頭を潜在空間上で分離することができる。

例えば、顔の画像の場合、1つ目の潜在変数が目の形、2つ目の潜在変数が顔の向きのように、潜在変数の各要素が独立した異なる特徴を担当する事になる。 これにより、例えば1つ目の潜在変数が独立した異なる特徴を担当することになる。 潜在変数の例

  • 1つ目の調整をすることで目の形を変えることができる。

  • 2つ目の潜在変数を調整することで顔向きを調整することが可能になる。

f:id:unachan_kz:20200628184310p:plain

β-VAEは顔の向きと表情意外は変化していないが、VAEはそれ以外も変化している。

参考文献

https://openreview.net/pdf?id=Sy2fzU9gl

https://github.com/Yagami360/MachineLearning-Papers_Survey/issues/27

高品質な画像生成が可能になる。(Vector Quantised VAE)

VAEには潜在変数がデータの特徴をうまく捉えることができなくなる"posterior collapse"と呼ばれる現象がある。 これにより生成画像がぼやけたものになってしまう問題がある。

この問題に対処するために、Vector Quantised VAEでは潜在変数を離散値(0, 1, 2, 3....)に変換する。 これは、画像をEncoderに入力し、出力である潜在変数のベクトルを「コードブック」にマッピングすることで実装される。 画像を離散的な潜在空間に圧縮することにより、高品質な画像の生成が可能になる。 f:id:unachan_kz:20200628185809p:plain

f:id:unachan_kz:20200628185836p:plain

参考資料

https://arxiv.org/pdf/1711.00937.pdf

補足:コードブックとは

ベクトル量子化Vector Quantization: VQ)とは、ベクトルで表されたデータ集合を有限個の代表的なパターン(セントロイド)に置き換える処理のことです。代表パターン(セントロイド)のリストはコードブック(code book)と呼ばれます。また、クラスタの番号をコードと呼びます。各ベクトルデータは、距離が一番近いコードに置き換えられます。大量のデータを少ない代表パターンで置き換えることができるためデータの圧縮に使えます。ただし、コードブックから元のデータは復元できないため非可逆圧縮になります。

aidiary.hatenablog.com

更に高品質な画像生成が可能になる。(Vector Quantised VAE-2)

VQ-VAE-2は、VQ-VAEを階層構造にすることで更に高解像度の画像を生成できるようにした技術。 VQ-VAE-2では、潜在表現を異なるスケールごとに、階層的に学習する。 潜在表現は元の画像よりも大幅に小さくなるが、これをDecoderすることでより非常に鮮明でリアルな画像を再構成することが可能。

f:id:unachan_kz:20200628190546p:plain

f:id:unachan_kz:20200628190640p:plain

参考資料

https://arxiv.org/pdf/1906.00446.pdf

補助資料にも詳細に色々とまとめられてます。

Generating Diverse High-Fidelity Images with VQ-VAE-2

www.slideshare.net

本記事の参考資料

なお本まとめは、下記の本から色々と引用させて頂きました。 手を動かして学ぶシリーズですが、いろいろと学ぶことが多い本です。

sinGAN②

コロナウィルスがなかなか収束しませんね。 今年は、五島に帰れないかもしれませんね。

五島の写真をみてると五島に帰りたくなります。

さて本日は、SinGANを試した結果②です。

SinGAN②

SinGANを用いてanimationを試してみた。

島の畑の風景

f:id:unachan_kz:20160305110653j:plain

SinGANを用いて動画した結果

f:id:unachan_kz:20200627195028g:plain

f:id:unachan_kz:20200627195111p:plain

SinGANを用いて動画した結果

f:id:unachan_kz:20200627195217g:plain

SinGAN参考資料

補助資料みてると本当いろんなことできるんですね。 https://tomer.net.technion.ac.il/files/2019/09/SingleImageGan_SM.pdf

Training End-to-end Single Image Generators without GANs

GAN無しで一枚の画像から高画質の画像を作り出す手法も提案されてますね。 試したいけど、コードが見つからない。

Training End-to-end Single Image Generators without GANs

五島の高浜海水浴場の写真を利用してSinGANを試してみた。

コロナウィルスの影響でなかなか外出できない。 このため、私の故郷である五島の写真をみて、故郷に帰りたいなぁって思ってしまう。

時間はたくさんあるので、私の島である五島の写真を用いて、最新ディープラーニングの生成系の アルゴリズムであるSinGANを試してみた。

SinGANの結果

まずどんなことができるか?をみていきましょう。

入力画像 高浜海水浴場

f:id:unachan_kz:20200621175607p:plain

アニメーション化

静止画を学習させることで、実際に波が動いている画像になってます。

f:id:unachan_kz:20200621175929g:plain

python animation.py --input_name  takahama.png

画像生成

f:id:unachan_kz:20200621180448p:plain f:id:unachan_kz:20200621180528p:plain

python main_train.py --input_name takahama.png
python random_samples.py --input_name takahama.png --mode random_samples --gen_start_scale 1

paint化

入力画像

f:id:unachan_kz:20200621184535p:plain

paint画像

f:id:unachan_kz:20200621184447p:plain

python paint2image.py --input_name takahama.png --ref_name takahama_paint.png --paint_start_scale morning 7

SR

4倍になっているようです。

f:id:unachan_kz:20200621200307p:plain

スケールを5倍にしてみた。ギザギザはしてますが、すごい! f:id:unachan_kz:20200621211400p:plain

6倍、別の処理が必要ですね。 f:id:unachan_kz:20200621222614p:plain

SinGAN

今回、私が SinGANに注目した理由としては、

  1. 一枚の画像のみで、DNNが生成した画像を作ることができる。

  2. ペイントなどを利用すれば、画像をセグメンテーションみたいに利用できるため。

  3. 楽しいため。

github.com

SinGANとは

下記の解説がわかりやすいです。 github.com

patchGANを追加している説明は下記がわかりやすい。 hotcocoastudy.hatenablog.jp

学習環境

google colaboratoryを用いました。

環境設定について

python -m pip install -r requirements.txt

pytorchのバージョンでエラーが発生したため、pytorchのバージョンを下記にしました。
pip install torch==1.4.0 torchvision==0.5.0

五島について

コロナが落ち着いたら、五島を訪れてください。 良いところですよー

www.city.goto.nagasaki.jp

力をつけて、いつか、五島に帰った時にAI技術について興味がある方に語れたら良いなぁ。 努力しなきゃ。

scikit-image を用いてセグメンテーションしてみた。

簡単にセグメンテーションする方法が分からなかったので、scikit-image セグメンテーションをしてみた。

f:id:unachan_kz:20200621194534p:plain

f:id:unachan_kz:20200621194701p:plain

参考文献

コード

github.com

計算グラフの可視化

普段、深層学習のモデルの説明をする際に苦労することはありませんか。

私は、資料作りに苦労することあります。

今日は、深層学習の計算グラフの可視化方法に触れます。

Kerasやtensorflowを普段利用してる場合でしたら、tensorboardを使えば、可能ですが、本日はpythonを用いてみます。

 参考図書

ゼロから作るDeep Learning ❸ ―フレームワーク編

ゼロから作るDeep Learning ❸ ―フレームワーク編

  • 作者:斎藤 康毅
  • 発売日: 2020/04/20
  • メディア: 単行本(ソフトカバー)

y=x1+x2

2変数の足し算を行ってみます。 基本的には、dezeroutils.pyget_dot_graphを用いて可視化します。 y=x1+x2をnumpyを用いて計算する際に、x0.namex0のVariableインスタンス属性に名前を設定します。 この変数をget_dot_graphに引数として渡し、下記pythonコードを実行することで計算グラフを可視化することができます。

import numpy as np
from dezero import Variable
from dezero.utils import get_dot_graph

x0 = Variable(np.array(1.0))
x1 = Variable(np.array(1.0))
y= x0+x1

# 変数に名前を付ける。
x0.name="x0"
x1.name="x1"
y.name="y"

txt=get_dot_graph(y, verbose=False)
print(txt)

with open("sample.dot","w") as o:
    o.write(txt)

f:id:unachan_kz:20200606211229p:plain

dotコマンドの自動化

なるべく自動化したいので、普段私は、コマンド実行する際に、Makefilepython実行とdotコマンドの実行を行います。

Makefileの例を下記に示しますのでご確認いただけたらと思います。

all: scratch_dot_img.py
    python scratch_dot_img.py
    dot sample.dot -T png -o sample.png

コマンド実行

make

TOC(Theory of Constraints)理論

「ザ・ゴール」の著者、ゴールドラット博士が開発した全体最適マネジメント理論TOC(Theory Of Constraints)について少し考えてみた。

ザ・ゴール

ザ・ゴール

繋がりとばらつきのあるシステム

組織の中における仕事の流れをみてみると、例えば、営業→設計→生産設計の仕事の中で、全く同じ能力を前提で考えるのは無理がある。

f:id:unachan_kz:20200606190445p:plain

仕事は左から右へつながって流れているが、個々の組織が1日に処理できる能力には、それぞれ20, 15, 10, 12, 16とばらつきがある。 このシステムの中で1日のアウトプットとしては、10になる。

ボトルネックの10以上アウトプットが出ることは不可能なのである。

ボトルネックが分かっていれば、ボトルネックに対策を打てば、ボトルネックボトルネックでなくなり、システム全体の生産性も上がるはずである。

しかし、それを実践するのは現実には困難なことが多い。 なぜなら、みんなが一生懸命働いているのにボトルネックになっているのは、ボトルネックだとわかっていても簡単に増やせないリソース、 例えば、優秀な人や高価な設備のことが多い。

ボトルネックだとわかっていても簡単に増やせないリソースにこそがボトルネックになりがちである。

簡単に増やせないリソースとは、言い換えると希少リソースである。 その希少リソースの仕事の中身を調べてみると、本当に優秀な人しかできない仕事をしているかというと必ずしもそうでは無い。

「1日のうちで、自分しかできない仕事を集中している時間はどれくらいあるだろうか?」

システム全体の製薬となっている希少リソースが本来もっている能力を発揮していることは現実には驚くほどすくない。

繋がりとばらつきのあるところには、どこかに必ず制約がある。そこに集中することが全体に成果をもたらす。

制約にフォーカスを当てた議論は大事

下記のことは、下記本から引用しました。非常にわかりやすく考える視点が多いです。 また触れたいです。