前に逃げる

理系の大学院生。ディープラーニング初心者。

PytorchによるAutoEncoder Familyの実装

AutoEncoderとはニューラルネットワークによる次元削減の手法で、日本語では自己符号化器と呼ばれています。DeepLearningの手法の中では使い道がよくわからないこともあり比較的不人気な気がします。(個人的には教師なしで抽象的な情報を取り出すのはとても面白そうだと思います。)

今回は自分の勉強のためにPyTorchでAutoEncoderを実装します。コードはこちら

AutoEncoder

まずは3層MLPの一番簡単な奴。ネットワーク定義はこんな感じ。

class AutoEncoder(nn.Module):
    def __init__(self, input_size, embedding_dimension):
        # initialization of class
        super(AutoEncoder, self).__init__()

        # define the network
        self.layer1 = nn.Linear(input_size, 32)
        self.layer2 = nn.Linear(32, input_size)
        self.encoder = nn.Sequential(
                        self.layer1,
                        nn.ReLU()
                        )
        self.decoder = nn.Sequential(
                        self.layer2,
                        nn.Sigmoid()
                        )

    def forward(self, x):
        encoded = self.encoder(x)
        decoded = self.decoder(encoded)

        return encoded, decoded

    def initialization(self, mean=0, std=0.01):
        nn.init.normal(self.layer1.weight, mean, std)
        nn.init.normal(self.layer2.weight, mean, std)

シンプルですね。中間層の前にReLUを入れてしまっているのがちょっと微妙かも。パラメータの初期化は平均0標準偏差0.01の正規分布にしてます。実験では中間層のノードの数は10にしています。

再構成の結果はこんな感じ。

f:id:dl-kento:20180222195026p:plain

Deep AutoEncoder

今度は層の数を増やし、10層のNNを学習してみます。画像を見るとうまく学習できていないことがわかります。DeepなNNの学習の難しさが見て取れますね。

f:id:dl-kento:20180222195554p:plain

Stacked AutoEncoder

単に層を深くするだけでは学習がうまく行かないので工夫を加えます。層ごとに事前学習をしていくのですが、方法が2つあります。ひとつは入力に近い層から1層ずつ学習する方法。ふたつ目は両端の層から中心の層に向かって学習していく方法です。(下図参照)今回はJ. Xieらの論文*1を参考にして後者の方法で学習をします。初期化方法や学習率も論文に合わせています.

f:id:dl-kento:20180225141350j:plain:w500

実装は、クラスの中で層を積み上げる数に応じてアトリビュートを作成しています(ここが動的にできると良い?)また、学習時にはoptimizerを定義するときに学習するレイヤーを指定しています。かなり見苦しいコードになってしまったので早く修正したいところではあります。

結果はこちら。層が深くなっても学習できています。見栄えも良くなった気がします。

f:id:dl-kento:20180222200132p:plain

まとめ

今回はAE~Stacked AEまでを実装しました。また新しく実装したものがあれば追記したいと思います。

*1:Xie, Junyuan et al. “Unsupervised Deep Embedding for Clustering Analysis.” ICML (2016). https://arxiv.org/abs/1511.06335

リモートセンシングの分類タスク向けデータセット

めっちゃたくさんあった。でも、ソースはほぼGoogle Earthです。リンクは気が向いたら載せます。

Data Set class samples (per class) size resolution source
UC-Merced dataset 21 100 256 x 256 0.3m (1foot) the USGS National Map Urban Area Imagery collection
WHU-RS19 dataset 19 50 600 x 600 ~0.5m Google Earth
RSSCN7 7 400 400 x 400 Google Earth
AID dataset 30 200 ~ 400 600 x 600 0.5~8m Google Earth
PatternNet 38 800 256 x 256 0.062~4.693m Google Earth & Google Map API
SAT-4 dataset 4 約10'000 28 x 28 1m aircraft
SAT-6 dataset 6 約54'000 28 x 28 1m aircraft
RSI-CB 256 35 約685 256 x256 0.3~3m Google Earth & Bing Map
RSI-CB 256 45 約800 128 x 128 0.3~3m Google Earth & Bing Map
NWPU-RESISC45 dataset 45 700 256x256 0.2~30m Google Earth
SIRI-WHU 12 200 200 x 200 2m Google Earth
Brazillian Coffee Scenes 3 64 x 64 1'438~36'577 (計 51'004) おそらく 10m SPOT

JetsonTX1にcaffe2をビルド

Jetson TX1にcaffe2をインストール

f:id:dl-kento:20180204230929p:plain

Jetsonで物体検出とかやりたい.庭に遊びに来る猫とか鳥とかを自動で撮影できたらいいな. 手順は公式HPのと大体同じです.

依存ライブラリをインストール

Caffe2の公式ページを参考に依存ライブラリをインストール

sudo apt-get update
sudo apt-get install -y --no-install-recommends \
      build-essential \
      cmake \
      git \
      libgoogle-glog-dev \
      libgtest-dev \
      libiomp-dev \
      libleveldb-dev \
      liblmdb-dev \
      libopencv-dev \
      libopenmpi-dev \
      libsnappy-dev \
      libprotobuf-dev \
      openmpi-bin \
      openmpi-doc \
      protobuf-compiler \
      python-dev \
      python-pip

sudo pip install \
      future \
      numpy \
      protobuf

sudo apt-get install -y --no-install-recommends libgflags-dev

しかし、libopencv-devが入らなかったのでスキップ。 OpenCVJetPackインストール時に入るようなので大丈夫っぽい。

Caffe2のリポジトリをクローン&ビルド

# リポジトリのクローン
git clone --recursive https://github.com/caffe2/caffe2.git && cd caffe2

# cmake
mkdir build && cd build
cmake ..

# make
sudo make install

ビルドは結構時間かかりました.

環境変数

.bashrcにパスを通しておきました.

export PYTHONPATH=/usr/local:$PYTHONPATH
export PYTHONPATH=$PYTHONPATH:/home/ubuntu/caffe2/build
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

動作確認

python -m caffe2.python.operator_test.relu_op_test

Windows10にpytorchをオフラインでインストール

f:id:dl-kento:20171227162318j:plain

pytorchとは

pytorchはchainerからフォークされたdefine-by-runのディープラーニングフレームワークで、主に研究開発用途で使われているみたいです。chainerからの派生だけあって非常に使い易いフレームワークです。

最近自分の周りでもpytorchを使う人が増えてきていて、勢いを増しているフレームワークです。

研究室にGeoforce GTX1080を積んだゲーミングPC(Arien Ware)があるのでそこにpytorchをインストールしましたが、一筋縄ではいかなかったので記録を残します。

今回は下のコマンドでAnacondaに仮想環境を作りその中で作業を行っています。

conda create -n pytorch python=3.6 numpy pyyaml mkl

結論から言うとcondaコマンドを使いオフラインでインストールするとできました。結果だけ見たい人は画面の下までスクロールしてください。

作業環境

  • OS: Windows10
  • GPU: GTX1080
  • Aconda: 4.4.0
  • python: 3.6.2

conda installでインストールできない!?

元々pytorchはLinuxmacOSしかサポートされておらず、公式からのインストールは出来ないのでAnaconda Cloudからのインストールになります。

conda install -c peterjc123 pytorch

このコマンドでインストールできるはずが、エラーが出て失敗した。。。

UnsatisfiableError: The following specifications were found to be in conflict:
  - pytorch
Use "conda info " to see the dependencies for each package.

pytorch元から入ってないしconflictする意味が分からん。ここから泥沼に嵌っていきました。以下失敗例。

  • Virtual Box で Ubuntu の環境を作ろうとしたが、失敗。Virtual Box からはGPUが認識できないみたいです。
  • wheelファイルをダウンロードしてきてpipでインストールしてみたが、import時にエラーが出た。

conflict を避けるため、offline でインストール

pytorch の GitHub issue を見ていたら「オフラインでpytorchをインストールしろ」との記述を発見。オフラインでインストールってどうやってやるんだとウェブを漁っていると中国語のページにたどり着きました。そこに書いてあった方法がこちら。

まず、Windows用のpytorchのソースコードをダウンロードし、そのディレクトリで以下のコマンドを実行します。

conda install --offline pytorch????.tar.bz2

これでいけました。ソースコードの最新版はAnacondaCloudに、レガシー版はこちらのページ(作者のGitHubページ)からリンクで飛べます。

まとめ

今回実感したのは中国語のページが非常にわかりやすかったということです。英語よりも、日本語よりもわかりやすかった。ディープラーニング人口が多いだけありますね。これからはわからないことは中国語のページも参考にしていこうと思います。

参考リンク

日本語ページ

qiita.com

abrakatabura.hatenablog.com

中国語ページ

PyTorch在64位Windows下的Conda包

www.ptorch.com

tiff画像を扱うpythonモジュール"tifffile"の紹介

tifffile を使おう

あまり無い機会だとは思いますがディープラーニングの源泉画像としてtif形式のものを用いることがあります。 たとえば地理画像の解析をする場合、tiff形式で提供されていることも多く、また4バンド以上の画像を扱わなければいけない場合があります。

gdalというライブラリも多機能で結構便利なのですが使い勝手がやや悪いことがネックになっていました。 自分の環境でgdalのインストールに失敗したこともあって、代わりのライブラリを探していたということもあります。

そんな時に見つけたのがtifffileというそのままの名前のモジュールです。 試してみたところ使い勝手が非常に良かったため紹介させていただきます。

インストール

※anaconda環境の場合


conda install -c conda-forge tifffile

(参照)https://anaconda.org/conda-forge/tifffile

画像の読みこみ

imreadというメソッドを使います


>>> import tifffile
>>> image = tifffile.imread('image.tif')
>>> image.shape
(6000, 6000, 4)

書き方はちょっとopenCVっぽいですね。。。

画像の保存

imsaveというメソッドです


>>> import tifffile
>>> import numpy as np

>>> data = np.random.randint(0,256,(600,600,3))
>>> data = data.astype(np.uint8)
>>> tifffile.imsave('image.tif', data)

ノイズ画像が保存できました。

f:id:dl-kento:20171223140157j:plain



(参考)https://pypi.python.org/pypi/tifffile

Jetson セットアップで詰まったところ

インターンでJetsonTX2を使っているのですが、色々と詰まったところがあったので記録。

先日公開した記事で参考にしたページなどを載せています。

 

dl-kento.hatenablog.com

JetsonのPost Installationが上手くいかない

JetsonにOSの焼き込み後、母艦のPCからJetsonにCUDAやcudnnなどをインストール。インストーラーでJetsonのIPアドレスとパスワードを入力した後、Xtermの画面が開いてインストールが始まるのですが何故かストップ。。。

秘密鍵の設定をして、ssh接続する時にパスワードなしで入れるようにするのが解決策だった。ssh-keygenなどを使い、設定。

 

Post Installationが途中で止まる

上記のようにssh接続の設定してPost Installationが始まるようになったけど、何故か終わらない。よく見たら同じメッセージが無限ループしてた。。。

流れるメッセージに目をこらすと"Clock skew is detected"との文字が、確かにJetsonと母艦の時計ずれてるなーと思いつつ同僚に時刻合わせの設定をしてもらい解決。

 

バックアップを取る

セットアップはもう二度とやりたくない、、ということでバックアップを取ることにしました。 以下のページにある方法を参考に実施。

Jetson/TX2 Cloning - eLinux.org

てかこのサイトめっちゃ役に立つな。

Jetson TX2のセットアップに役立つリンク集

最近バイトでJetsonを使っているので役立ったサイトのリンクをまとめます。

 

セットアップに役立つサイト

nvidia公式ユーザーガイド

ユーザーガイド 

インストール手順(スクショあり)
インストール手順(スクショなし)
インストール動画
 
NVIDIA Developer Forums も大変役立ちました。
 
 

セットアップ後に役立ちそうなサイト

caffeのインストール(めっちゃ簡単)

http://www.jetsonhacks.com/2017/03/24/caffe-deep-learning-framework-nvidia-jetson-tx2/

faster R-CNN (caffeの実装) のセットアップ(めっちゃわかりやすかった)

https://github.com/eiichiromomma/CVMLAB/wiki/DeepLearning-py-faster-rcnn

各種デモ
カメラモジュールの販売について
インストール後の作業
 
高速化
他にもあれば追加します