前に逃げる 〜理系大学院生のブログ〜

理系の大学院生。専攻は機械とか情報系。ディープラーニング初心者。

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

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

「『ONE PIECE』に学ぶ 最強ビジネスチームの作り方」は最強のONE PIECE本である

最近読んだ「『ONE PIECE』に学ぶ 最強ビジネスチームの作り方」がとても面白かった。実は僕は大のONE PIECE好きで、幼稚園の時から漫画を読み始めかれこれ20年近くONE PIECEのお世話になっている。そのため、コンビニに並ぶONE PIECEの考察本なんかはいやでも目に入ってしまう。今まで数々のONE PIECE本を目にしてきたが、そのほとんどがクソであるしかし、今回読んだ「『ONE PIECE』に学ぶ 最強ビジネスチームの作り方」はその他のワンピ本とは一線を画すとても素晴らしい本であったので感想を書こうと思う。

 

「ヤンキー」と「オタク」

ざっくりと内容の説明をすると、「最強ビジネスチームの作り方」では「ヤンキー」と「オタク」の二つの視点からONE PIECEを読み解いている。

「ヤンキー」とは仲間との絆や根性を大切にし帰属する組織を大切にする人のことを指す。いわゆる、マイルドヤンキー的な性質のことで、これは日本固有のローカルなタテ社会的な考え方である。作中のキャラクターではルフィ、サンジ、ナミなどが当てはまる。

一方「オタク」とは自分の関心が行動原理であり、情よりも理屈を優先する人のことである。インターネットが同じ関心を持つ仲間と繋がることを可能にした結果、オタク的な人間は数を増やしている。作中ではゾロ、ウソップ、ロビンが当てはまるとされている。(個人的にはウソップはヤンキーではないかと思ったが、、)

 

この二つの視点によってONE PIECEは新しい視点によって読み解かれる。まず、数々の名場面でルフィが叫ぶ「仲間との絆」や「海賊の誇り」は、「ヤンキー」的価値観を持つ人々の心を打つ。一方で広い世界観や複雑な伏線は「オタク」を考察へ導く。このように「ヤンキー」と「オタク」の二つの人種を満足させることにONE PIECEは成功しているのである。

「最強ビジネスチームの作り方」凄さはこの二つの視点を提案したことである。ちなみに本の後半では「ヤンキー」と「オタク」によって組織をどう作っていけば良いかが論じられている。

 

「最強ビジネスチームの作り方」は従来のワンピ本の一段階上をいく存在

本屋に並ぶ「ワンピ本」は二つの視点のうち一つの視点からしか書かれていないのが常である。例えばいわゆる「考察本」は「オタク」的な視点で書かれているし、「名言集」やその他のビジネス本は「ヤンキー」的な価値観を称賛することに終始している。

つまり、「最強ビジネスチームの作り方」はそれらの本より一段階上の視点を提示した画期的な内容となっている。

 

「最強ビジネスチーム」の元ネタは「タテ社会の人間関係」

ちなみに、「最強ビジネスチームの作り方」の下敷きになっているのは「タテ社会の人間関係(中根千枝)」というこれまたベストセラーの本である。(日本社会を語る上での古典と言えるほどの名著。)著作では、日本の支配的な価値観である「タテ社会」的な性質について解説していて、日本の社会を理解する上では欠かせない視点を提示している。

しかし前述したようにインターネットの普及ともに広がる「オタク」的な価値観を知ることはとても大切なことだと思う。会社などの組織に属する上で両者の価値観の違いを理解し、両方の関係を調整する必要に迫られることは必然であるからだ。

「最強ビジネスチームの作り方」はヤンキーとオタクが入り混じる組織のリーダーとしての心構えや振る舞い方を提案する。作中では「フラグセッター」と呼ばれているがその説明については是非著書を読んで知っていただけたらと思う。

個人的には「ヤンキー」と「オタク」という新たな視点を手に入れられて良かったと思う。自分の属する組織を考えるのに非常に役に立っているし、何より新しい視点で物事を考えるのは楽しいからである。

古谷経衡さんの『「意識高い系」の研究』を読んだ

先日、文筆家の古谷経衡さんの著書である『「意識高い系」の研究』を読みました。

 

リア充」や「意識高い系」の定義を明らかにしながら「意識高い系」の内面を分析する内容となってます。最終章では「列伝」と称し「意識高い系」の中でも象徴的な人物にスポットを当て分析、批判しています。

 

興味深かったのは「リア充」と「意識高い系」の定義です。古谷さんは「リア充」を、地元に固着し、先祖から相続した土地を持ち、スクールカーストで上位にいた存在としています。その定義を踏まえリア充は承認欲求を満たす必要がなく自己評価も相応であると述べています。一方で、「意識高い系」そうでない人間なので承認欲求が高く、自己評価が不当に高いとしています。

中盤以降は「意識高い系」の内面の分析と批判が行われます。古谷さんはここで、意識高い系が欲望をそれより上位の大義で覆い隠そうとすることを指摘ししています。「意識高い系」高い承認欲求を持ちつつも泥臭い努力をすることもない、「意識高い人」の亜種として位置付けています。

時折はさまれる「意識高い系」を見分ける方法についてのコラムは大変皮肉とユーモアに溢れたものになっており良いスパイスとなっていました。

 

個人的には「リア充」と「意識高い系」を地元に土着しているか否かで分類したところが非常に斬新だと感じられました。このような分類の方法は今までになかったのではないでしょうか。そしてこの分類には強い説得力も感じました。元々自分としても「マイルドヤンキー」と「意識高い系」を対比させて考えることが多かったからです。

自分の体験として、中学校時代にスクールカーストの高かった人たちは今現在も地元とつながりを持ち遊んでいることが多いように感じられます。(彼らはそれをわざわざアピールもしないのでSNSなどでそれを観測することは難しい)

一方で「意識高い系」として観測される元同級生(怪しいネットワークビジネスにはまっている)は、毎日のようにSNSで観測することができます。彼らはタワーマンションでのホームパーティと称した集まりを報告したり、芸能人と会ったことを自慢したり、「社会的に成功した自分」をアピールすることに余念がありません。中学校時代はスクールカーストが下位で、卒業後の地元の集まりに呼ばれることもありません。この本で述べられた「意識高い系」の特徴に見事に合致していました。

ディープラーニング セグメンテーション手法のまとめ

インターンで画像の分類をしているのですが、最近はFCNのようなセグメンテーションをタスクに使っているので代表的な手法をいくつかまとめようと思います。
 

Fully Convolutional Networks for Semantic Segmentation

 
AlexNetやVGGの全結合層をConvolution層に置き換えることで画像をピクセル単位で推定する(Semantic Segmentationする)手法を提案しました。非常に読み応えのある論文で、今までに10回くらい読んでいますが新しい発見が毎回あります。
 
 
ポイントはいくつがあるので、一つ一つまとめていきます
 
この論文の手法の最も重要な提案手法は、CNNの最後の全結合層をConvolutionに置き換えるということです。例えば、AlexNetのConv5の次の全結合層は6x6のConvolution層と見なすことができます。このようにCNNの全結合層をConvolution層に置き換えることで出力を分類クラスではなく二次元マップに変えることができます。f:id:dl-kento:20170430215326p:plain
 
この手法によって二次元画像から二次元のPredictionマップを出力することの利点は何でしょうか?論文では以下の利点があると述べられています。
一つ目は「任意のサイズの画像の入力が可能になる」ことです。全結合層に入力するマップのサイズは決まっていますが、Convolution層に変えることでその制限はなくなります。(小さすぎるマップは入力できませんがパディングを入れることで解決できます。)
二つ目は「Conv層の被りがなくなる」ことです。例えば大きいサイズの画像から224x224の画像を少しずつずらして切り出し一つ一つクラスを推定することでpredictionマップを生成することができます。しかし、そのような手法ではconv層などのフィルターは画像の同じ場所に何回も適用されるようになります。つまり、同じ計算を何度も繰り返していて効率が悪くなってしまうのです。FCNを適用しネットワークに大きいサイズの画像を入力することでこの問題は解決することができます。
 
二つの利点を述べましたが、一つこの手法には問題点があります。ストライドが2以上のフィルターによって解像度が落ちてしまうということです。例えばAlexNetやVGGでは解像度が1/32まで落ちてしまいます。論文では幾つか対策が述べられていますが、結局Deconvolution層を追加する案が提案されています。Deconvolution層では特徴マップの1ピクセルを任意の大きさに拡大します。そして、その重みも学習することができます。

 

 
最後に、スキップアーキテクチャーという手法を紹介します。CNNは畳み込みを繰り返すに連れて画像の高次な特徴を抽出します。一方でローカルな特徴はPoolingを繰り返すに連れて失われていきます。つまり下位のレイヤーはローカルな情報を持ち、上位のレイヤーは高次な特徴を持っているということです。このいいところを両取りしたのがスキップアーキテクチャーです。下位のレイヤーの特徴マップを上位の特徴マップと合流させます。これにより精度の向上が確認されました。f:id:dl-kento:20170430222915p:plain
 

SegNet

SegNetは2016年にIEEEで発表されました。風景画像のセグメンテーションを高速、省メモリで行う、というのが研究のモチベーションとなっています。では、高速化、省メモリ化の工夫とは一体どのようなものでしょうか。
 

一つはネットワーク構造にあります。FCNのネットワークの、全結合層を畳み込み層に置き換えた部分は計算量が多くなっていて学習に時間がかかったりメモリを多くとる原因となっていました。SegNetでは全結合層だった部分を削除したEncoder-Decoder構造を採用しています。これによって高速化、省メモリ化を達成できたようです。

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

 

SegNetの工夫は右半分のDecoder部分にもあります。Decoder部分のMaxPoolingで採用した値の場所を記録し、upsampling時にその場所を使って特徴マップを拡大します。これにより位置情報を正確化させているのです。

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

追記

先日さらにSegNetの論文を読み直したところ、実験上の工夫を発見しました。

セグメンテーションの課題ではどうしてもクラスごとにピクセル数の偏りが出てしまいます。そこで、採用されたのがClass balancing と言う手法です。クロスエントロピー誤差を取る時に各クラスのピクセル数に応じてその大きさを重み付けします。SegNetの論文では各クラスのピクセル数とその中央値の割合を使って行っています。これを行わないと各クラスのピクセル数の割合が事前確率のようになってしまい結果が引っ張られてしまいます。

 

U-net

U-netは医療画像のセグメンテーションのために提案されました 。セグメンテーションのタスクにおいて現時点でのstate-of-the-artと言われていてKaggleコンテストの優勝者が使っていたりします。

U-netではSegNetのようなEncoder-Decoder構造をしていて、Encoder部分とDecoder部分の対応した解像度の特徴マップをつないでいます。論文では図がU型に配置されていてこれがU-netの名前の由来だそうです。

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

 

その他の工夫としては、重み付けロスの採用があります。

医療画像のセグメンテーションにおいてオブジェクト同士の境界をはっきり出すことは重要です。そのため、境界部分のロスを大きくし、はっきりと判読できるよう工夫しています。つまり、タスクの目的にあった画像の前処理が必要ということです。かなり骨の折れる(辛い)作業になりそうですが、ディープラーニングの課題において前処理は重要なんですね。

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