備忘録とか日常とか

学んだこととかを書きます。

matlabとnumpy reshapeの違い その2(多次元配列)

以前もnumpy(python)とmatlabのreshapeという関数の仕様の違いについて書いた
may46onez.hatenablog.com

今度は多次元配列(3次元)で引っかかったのでメモしておく。

numpy.reshapeの仕様

numpyで一次元配列(ベクトル)から3次元の配列にreshapeすると以下のようになる。
例として3x4x2の配列を作る。

>>> a = numpy.arange(24)
>>> a.reshape((3,4,2))
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])

これはmatlab風に書くと、

a(:,:,1) =

     0     2     4     6
     8    10    12    14
    16    18    20    22


a(:,:,2) =

     1     3     5     7
     9    11    13    15
    17    19    21    23

という配列である。
numpyでは要素を最後の次元から埋めるので(この場合第3次元, 3x4x2の2から埋める)
a(1,1,:)に0,1が入り、次にa(1,2,:)に2,3が入り...というふうに。

matlabの仕様

一方matlabで同じことをすると、

>> a = 0:23;
>> reshape(a, [3,4,2])

ans(:,:,1) =

     0     3     6     9
     1     4     7    10
     2     5     8    11


ans(:,:,2) =

    12    15    18    21
    13    16    19    22
    14    17    20    23

matlabでは要素を最初の次元から埋める
次元が増えても同じっぽい

解決法

ちょっと調べたけど一発でこの差異をなくす方法がわからない。。
2次元配列をちまちまreshapeしてからcat()で繋げるとか...?

もうちょっといいやり方があるような気もするけど...

Bengio先生著のDeep learning本が凄そう

ここ最近Deep learning(あるいは人工知能)関係の記事を目にしない日はない
そういっても過言ではないほど何かしらの情報が出回ってるように思う


正直言って機械学習の諸分野に興味はあるものの、
こうハイペースに畳みかけて来られるとちょっと勉強するのも億劫になってしまう。
Convolutional neural netだけに。。


今ではもうDeep learningや機械学習に関する色んな書籍やら解説スライドやらが出回っているので
勉強する環境はかなり整ったように思う、

基礎知識は知ってて当然として話を進めるものも多いように思う
線形代数や確率・統計論をはじめとするいわゆる数学的な知識だとか。

まあちゃんと一から教科書引っ張り出して勉強すればよいのだけども・・・


僕の場合、いざ線形代数とかを勉強してみても、
「で、これどう使うの?」
となることが多いです。理解力に乏しいので。。

Bengio先生ばんざい

そんな人のための画期的な本が今まさに出版されようとしてる
Bengio先生らのDeep learning

この本はDeep learningが現在のような脚光を浴びるようになった歴史から
機械学習に必要な数学的基礎知識、代表的なアルゴリズム
さらに最新の研究まで取り上げている。

ちょっとだけ読んでみたところ
基礎の数学部分では、本質的な説明がなされており
今まであやふやだった概念の理解に大いに役立った


あとこの言葉が印象に残った

Many mathematical objects can be understood better by breaking them into
constituent parts, or finding some properties of them that are universal, not causedby the way we choose to represent them.

決して専門家同士で意思疎通を図るためのものではありませんよ、ということらしい
おかげさまで機械学習における線形代数の本質が垣間見れたような気がしますよ。


現在この本は校正中らしく、もうじき出版になると思われる
ドラフト版は無料で見れる。
コピー対策のためにpdfは用意しませんて言ってるんだけど
ブラウザの印刷メニューから普通にpdf保存できるんだよな・・・いいんかな保存しても


Bengio先生といえばニューラルネットの第一人者として君臨されているお方です
そんな人の書いた本が無料で読めるんだから読まない手はない!
ただし全編英語!!

しばらくこれで機械学習と英語勉強しようと思います

複数のpdfを結合してしおりをつける(windows)

複数にわかれたpdfファイルを結合し、かつページ数が増えたpdfに対ししおりを作成する必要に迫られたので、手順をメモしておく。

pdfファイル結合

pdfの結合に関しては、今の時代便利になったもので
以下のサイトに結合したいpdfファイルをアップロードすれば自動で結合してくれる。
smallpdf.com
専用のソフトをインストールする必要がないというのは個人的にありがたい。。

しおりをつける

次にしおりを作る。
しおりというのは、クリックしたら目的のページへ飛べるリンク機能である。
大体どのビューアでも左端に表示できると思う

↓こういうやつ
f:id:may46onez:20160331233825g:plain

Adobeが公式に売り出しているのがAcrobatというpdf編集ソフトなのだが、
どうやら高価らしいのでフリーソフトを使うことにする。

今回使ったのはJPdfBookmarksというソフト。
ここからダウンロードできる
こちらもインストール不要。

手順としては
1. JPdfBookmarksからpdfファイルを開く
2. しおりを作成したいページまで移動し、左端のしおり作成ボタンを押す
3. 保存する(新規に保存することも可能)

である。
このページが画像付きでわかりやすいかも。
章立てごとにしおりを階層構造にすることもできるし、
しおりデータをテキストファイルとしてエクスポートする機能もある。


特にページ数が長いpdfだったり、タブレットに入れて読むつもりなら
読みやすさが段違いなのでしおり作成は必須ですね。

linux 新規アカウントを追加、管理者権限を付与

よく調べては忘れるのでメモする。
システム設定>ユーザーアカウントから追加することもできるが、
十分な強度のパスワードを設定しないとアカウントを有効にできない。

都合により短めのパスワードを設定しなければいけなかったので
コマンドからアカウント追加して管理者権限をつける。

ユーザー作成

「user_name」というユーザーを新規作成する。
以下のコマンドを使う。

sudo adduser user_name

これだけ。
するとUNIXパスワードを求められるので、好きなパスワードを設定する。
その後は名前とか電話番号とか聞かれるが、特に必要なければ空エンターでおけ。


useraddではホームディレクトリが生成されないので注意する。

管理者権限を与える

作ったアカウントに管理者権限を与える。

sudo usermod -G sudo user_name

これでおけ。
確認するには

su - user_name

として、@より左がuser_nameになっているかを確認する。

試しにsudo権限が必要なコマンドを打ってみる

sudo reboot

実行できたら完了。
次回からGUIでそのままログインできる。

Ubuntuアップデートしたらログインできなくなった(nvidia GPU使用)

いつものようにUbuntu14.04のアップデートが来たので、
促されるままにアップデート・再起動したらGUIでログインできなくなった話。
何とか直せたのでメモしておく。
結論から言うとnvidiaGPUのせいらしい。
かなり試行錯誤したのでもっとスマートにやる方法も多分あるけど一応。。

環境:
Ubuntu14.04
GeForce GTX970

参考元は以下
Ubuntuで認証画面を無限ループさせる方法と対処 - 拾い物のコンパス
本の虫: Ubuntu 14.04のUnityの設定をぶっ壊した場合の修復方法
Ubuntu14.04にCaffeをインストールしたらCUIでしか起動しなくなったからどうにかした話 - モノクロタイム
ubuntuにnVidiaドライバを入れたらUnityが起動しない場合の対処 - Qiita
Ubuntu 14.04 で 最新の NVIDIA ドライバーにアップデートする - ZONDEEL BLOG


症状

「あ・・・ありのまま今起こったことを話すぜ!
パスワードを入力すると、一瞬真っ暗な画面になったと思ったら
もう一度ログイン画面に戻っていた・・・
何を言っているのかわからねーと思うが
おれも何をされたのかわからなかった・・・」

と、冗談はさておき
いわゆるログインループにハマったわけである。
ログイン時の「ポコポンっ」みたいな音がトラウマになってしまった

画面の解像度が低くなっていたので
この時点でおそらくグラフィック周りの問題だろうなーとは思ったが
とりあえず色々試す羽目になった。
Ctl+Alt+F1で仮想コンソールは立ち上げることはできた。


試したこと

色々調べてみた結果、
ログインループにハマった時にまず試してみることがあるらしい。
Ctl+Alt+F1で仮想コンソールを立ち上げてログインしたあと、
homeディレクトリ直下にある以下のファイルを削除する

rm .Xauthority .ICEauthority

Xサーバの認証に使うファイルらしい。削除しても次回ログイン時に再生成される。
アップデートの時にこのへんの設定に不具合が生じる場合があるとかないとか。

ちなみに自分の場合は直りませんでした。


次、Unityの初期化をやってみる。
このサイトに従って以下のコマンドで初期化を図る。

sudo apt-get install unity-tweak-tool
unity-tweak-tool --reset-unity

unity-tweak-toolは公式のレポジトリに入っており、Unityの設定初期化とかを1行でやってくれるすごいやつらしい。
これを試してrebootするも、自分の場合ではダメでした。


めげずに次、そういえばDeep learningのライブラリであるcaffeを導入した時も
同じようなログインループに陥ったことを思い出す。その時は確かnvidia周りのファイルが原因だったような・・・

てことで以下のコマンドを叩く。

sudo apt-get purge nvidia*

で、rebootする。やっぱりログインできない。
ぶっちゃけこれで出来なかったら自分の知ってる範囲でやれることはやったので
やむなしクリーンインストールも視野に入れてた。。


nVidiaドライバのアップデートで解決

苦し紛れにやってみたら直った。
かなり苦し紛れなので正しい手順かどうかはわからん

とりあえず使っているドライバのバージョンを調べるため、以下のサイトでGPUの型番を入力する。
NVIDIAドライバダウンロード
自分の場合はGTX970だったので、バージョン361.28と出た(2016/2/25現在)

その後、以下のコマンドを打ち込む

sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-cache search 'nvidia-[0-9]+$'

するとインストール可能なバージョン一覧がずらっと出てくるのだが・・・

nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-310 - Transitional package for nvidia-310
nvidia-319 - Transitional package for nvidia-319
nvidia-304 - NVIDIA legacy binary driver - version 304.131
nvidia-331 - Transitional package for nvidia-331
nvidia-340 - NVIDIA binary driver - version 340.96
nvidia-346 - Transitional package for nvidia-346
nvidia-352 - NVIDIA binary driver - version 352.63

ふむふむ。バージョン361ないやんけ!
やっていいかどうかわからないけど、仕方なく352を入れてみる。

sudo apt-get install nvidia-352

で、おそるおそるrebootするとログインできた。
解像度も元の高解像度に戻ってました
たすかった・・・これでよかったのかはわからんけど・・・


theanoが使えなくなってた

ここからは個人的な環境の話だが、deep learningに使うtheanoのライブラリで問題が発生した。
GPUを使っての演算ができなくなっていたのである。

これでは困るので再度NVIDIAドライバダウンロードのサイトでドライバをダウンロードしてくる。
再起動後、GRUBメニューでUbuntuを選択した状態で'e'キーを押し、起動オプションをいじる。
'quiet splash'と書いてあるところの直後に'text 3'を追加してF10キーを押す。

するとランレベル3でCUIログインになるはずなので、
予めドライバをダウンロードしたディレクトリに移動して以下を実行。

sudo service lightdm stop
sudo service gdm stop
sudo chmod 755 ~/Downloads/NVIDIA-Linux-x86_64-361.28.run 
sudo ./NVIDIA-Linux-x86_64-340.32.run

するとインストールが始まる。
何を省いていいかわからないので基本yesで答えたが、32bitドライバは入れなかった。

終わってから再起動し、

python
import theano

として問題なく動いたので一安心。


後日談

ひと通りやったあとにこんなサイトを見つけた。
www.rokudw.net

もしかしたらこのサイトの方法で一発だったのかもしれない。
まあ直ったのでよしとしようか。


linuxではなにかとGPU関係で問題が起こるので
そのへんもっと情弱にもわかりやすくしてほしいです(怒)


【追記16/5/1】
どうやらnvidiaのドライバダウンロードのサイトから入手できる最新版(ここでは361.--)のドライバは
ubuntu14.04LTSの最新アップデートでは動作しないようです.
CUDAのインストーラに付いてくるGPUドライバのバージョンも352になっているので
公式がgpgpuには361を使わないことを推奨しているのかもしれません.
おとなしく352を入れておきましょう.

【追記18/1/27】
二年越しの更新
日付でわかるかと思いますがかなり古い情報です。
現在もこのバグが存在するかは不明ですが、原因はnvidia公式サイトのrunfileによるドライバインストールであると思われます(たぶん)
ubuntunvidia GPUを導入する場合はubuntuの公式リポジトリからドライバをインストールすることをお勧めします。

sudo apt search nvidia

nvidia-xxxみたいなやつをインストールすればおkかと。