備忘録とか日常とか

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

windows8で仮想デスクトップ環境を導入する

仮想デスクトップの便利さに今更気づいたので、windows8でも使えるようにしようと思った。
windows10では標準で仮想デスクトップ機能がついているらしいがまだアップデートする気になれない・・・
たぶん何も不具合とかないとは思うけど、慣れた環境を手放すのは割と勇気がいると思う

仮想デスクトップアプリ「Dexpot」

使うのは「Dexpot」というアプリケーション。
最大20の仮想デスクトップを構築でき、カスタマイズ性も高いことで評判になってるらしい。
ショートカットキーやらマウスジェスチャーやら壁紙やら色々自分で設定できる。
そして個人利用だと無料で使える。

とりあえず以下からダウンロードできる
2016/2/23現在でバージョン1.6が最新
http://dexpot.de/?id=download

普通にインストールできます

設定

デフォルトだと使いにくいので最低限の設定をする
タスクバーからDexpotを右クリックして「Settings」を選択する。

まずスタートアップで動いてほしいので、「general」の項目をいじる
f:id:may46onez:20160223224149p:plain

「Start」の欄の「Start with Windows」と「Hide splash screen」にチェックを入れる。
管理者で実行とかもできるのでその辺はご自由に。


次にデスクトップ切り替えのコマンドを設定する。
これは「Controls」の項目
f:id:may46onez:20160223224454p:plain
「Switch desktop」の中の「Next desktop」と「Previous desktop」を追加する(デフォルトではたぶん空になってる)
Ubuntu14.04と同じにしたかったのでCtl + Alt + 矢印キーを設定した。

あと「Move window and switch」を設定する。
これはウインドウを隣のデスクトップに移動し、デスクトップを切り替えるときに用いる。
「Move window」はウインドウを移動させるだけで、デスクトップ切り替えは行われない。

例によってUbuntuと同じにするため
「to next desktop」と「to previous desktop」をCtl + Alt + Shift + 矢印キーとした。


最後にタスクバーに仮想デスクトップの縮小版を表示する(これはまあお好きに)
「Plugins and Extras」の項目
f:id:may46onez:20160223225345p:plain
「Plugins」の中の「Taskbar pager」にチェックを入れる

作業がはかどる

各デスクトップで別々のウインドウを立ち上げておくと、いちいち他のウインドウに切り替える手間が省ける
ウインドウいっぱい立ち上げる人は使うと便利かと。

scikit-learnでsvm 基本的な使い方

今更だがsvmを使いたかったのでscikit-learnで使い方を調べた。
公式ドキュメントが整っているのでそっち見ただけでもわかる。
1.4. Support Vector Machines — scikit-learn 0.19.2 documentation


以下参考
Scikit-learnでハイパーパラメータのグリッドサーチ
scikit-learnによる多クラスSVM
2013.07.15 はじパタlt scikit-learnで始める機械学習

とりあえず使う

とりあえず使うというだけなら何も考えず

from sklearn import svm

clf = svm.SVC()
clf.fit(train_features, train_labels)

とすれば識別器の学習ができる。
その後テストデータに対して推定を行うには

test_pred = clf.predict(test_features)

でおけ。
変数test_predには推定ラベルが羅列したnumpy.ndarrayが入る。
これを真値と比較して結果を見るには、

from sklearn.metrics import classification_report, accuracy_score

print classification_report(test_labels, test_pred)
print accuracy_score(test_labels, test_pred)

とすれば、結果をF値と認識率で評価してくれる。
F値については以下参照
F値 - 機械学習の「朱鷺の杜Wiki」


いやそんなの興味ねーから、Confusion matrixくださいよって時は

from sklearn.metrics import confusion_matrix

print confusion_matrix(test_labels, test_pred)

で表示できる。F値とかは何か結果がごまかされてる感があるけど
Confusion matrix見せとけばとりあえず誰でも納得する、ような気がする


カーネルなどのパラメータを指定する場合は

clf = svm.SVC(kernel='rbf', C=1, gamma=0.1)

のように指定する。
デフォルトではRBFカーネルで、C=1.0, gamma= 1/特徴数 となっている。

チューニングする

svmの性能を引き出すには各種パラメータを調整する必要がある
まずカーネルだが、上で述べたようにsvm.SVCはデフォルトではRBFカーネルを使う
基本的にはRBF、特徴の次元数が大きい時は線形カーネルでもいいらしい
RBFカーネルでは調整するパラメータは{\gamma}{C}、線形は{C}だけ
これをグリッドサーチで探索する
(詳しいことは勉強中・・・こことかわかりやすいのかも)

なんとscikit-learnでは一行でグリッドサーチする関数が用意されている。

parameters = [{'kernel':('rbf'), 'C':numpy.logspace(-4, 4, 9), 'gamma':numpy.logspace(-4, 4, 9)},
              {'kearnel':('rbf'), 'C':numpy.logspace(-4, 4, 9)} ]
clf = grid_search.GridSearchCV(svm.SVC(), parameters, n_jobs = -1)
clf.fit(train_features, train_labels)

print clf.best_estimator_

parametersで指定したパラメータでグリッドサーチを行う。
n_jobsでCPUのコア数を指定して並列計算してくれる。(-1で自動決定)
ただしその分使用するメモリ量も大きくなる。当たり前だけど。
特徴量の次元が大きい場合、メモリが足りなくなってエラーになることがあるので注意。

print clf.best_estimator_でベストパラメータを表示できる。


ここでGridSearchCVcvという引数を整数で指定すると、
指定したfold数でCross-validationをやってくれる。もういたれりつくせりである。

結果はclf.grid_scores_に入っているので下みたいに表示できる。

print"mean score for cross-validation:\n"
for params, mean_score, all_scores in clf.grid_scores_:
    print "{:.3f} (+/- {:.3f}) for {}".format(mean_score, all_scores.std() / 2, params)

clf.grid_scores_には
params(cross-validationのパラメータ),
mean_score(cross_validation後の平均認識率),
all_score(各foldでの認識率)が格納されている。
ついでにall_score.std()標準偏差を求めて{\pm \sigma} を表示するようにしてる。
format関数って便利だね


結果はこんな感じ↓

mean score for cross-validation:

0.782 (+/- 0.004) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.0001}
0.854 (+/- 0.002) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.001}
0.786 (+/- 0.006) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.01}
0.798 (+/- 0.003) for {'kernel': 'rbf', 'C': 0.0001, 'gamma': 0.1}
...

パラメータによってはすごい数になる。

詳しくはドキュメント参照。
sklearn.grid_search.GridSearchCV — scikit-learn 0.19.2 documentation

テストデータの推定は上と同じようにできる。

One-versus-Rest か One-versus-One か

多クラス分類を行う場合、一つの特徴量がどのクラスに分類されるかを決定するのに2つの方法がある。

  • ある特定のクラスに入るか、それ以外に入るか(One-versus-Rest、以後ovr)
  • ある特定のクラスに入るか、別のある特定のクラスに入るか(One-versus-One、以後ovo)

{K}クラス分類問題を考えた時、
ovrでは{K}個の分類器を利用し、
ovoでは{K(K-1)/2}個の分類器を利用する、という違いがある。


svm.SVCdecision_function_shapeという引数でこれらを指定できる。
デフォルトでは'ovo'となっているが、'ovr'のほうが推奨されている(識別性能が良い?)
2016/2/20の時点ではバージョン1.7.0が最新だが、1.8ではデフォルトを'ovr'にすると公式で宣言されてるから
結構性能が違ってくるのかもしれない。

感想

アホでも使えるレベルにしてくれていて助かる。
あとは理論的なことを勉強せねば・・・

deja-dup-monitorに振り回された話

普段は基本的にPCつけっぱなので,たまに再起動したりすると何かしら起こることがある.
ログインできなかったりとか.

今回もその一つで,起動数分後にPCが急激に重くなる症状が出た
(環境はUbuntu14.04LTS)
一応解決したのでメモ。参考元は以下
google chrome - How to prevent deja-dup-monitor from running, or completely delete it? - Ask Ubuntu


何回再起動しても同じなので,システムモニターで挙動を見てみると
起動後何もしてないのにメモリ使用量がどんどん上がっていき、100%近くまでいってフリーズした
RAM128GBでフリーズとかどんだけだよ。。

プロセスをみると"deja-dup-monitor"なるプログラムがほぼ全メモリを食っていた。
調べてみたところ、Deja Dup Backup Toolというアプリによるものらしい。
が、このソフト自体は最初からインストール済みなのでこれが直接の原因ではない

さらに調べるとGoogleが提供するリモートデスクトップアプリである
Chrome remote desktopを導入するとこの問題が起きるらしいということがわかった
確かにLinux版はベータ版とか書いてたけどまさかこんな不具合があるとは・・・てか普通気付くだろこれ


とりあえず解決法としては

  • Deja Dup Backup Toolを消す
  • Chrome remote desktopを消す

のどちらかでいいっぽい。
ほとんど使ってないのでChrome remote desktopを消すことにした。


これのせいで1時間ぐらいあたふたしてしまった
なんにせよベータ版は油断禁物ってことで。

ubuntu14.04 theanoとかgpgpu環境構築メモ

まっさらなlinux環境にtheano, pylearn2のgpgpu環境を導入する手順をメモする
ほぼ自分用みたいなとこある

環境は以下
ubuntu14.04LTS
GeForce GTX 970

インストール

ubuntu14.04にはpython2.7が最初から入っているのでパッケージから入れてく。

sudo apt-get install python-numpy python-scipy python-dev python-matplotlib python-pip python-setuptools  python-nose g++ libopenblas-dev git
sudo pip install Theano
git clone git://github.com/lisa-lab/pylearn2.git
cd pylearn2
python setup.py develop

できたら

import pylearn2

とかして確認。

pylearn2のデータパスを追加しておく。
ホームディレクトリ内の .bashrc の末尾に以下を追加

export PYTHON_DATA_PATH="/home/username/pylearn2data"

別に場所はどこでもいいと思うので適当に。

CUDA入れる

以前Caffeのインストールを試みた時に、CUDAのパッケージからそのままインストールするとうまく行かなかった(今はわからん)。CUDAのパッケージにビデオドライバも含まれているらしく、先にドライバを入れてたのでそのせいかもしれない。
なのでtoolkitとサンプルを別々に入れる。
参考は以下
Caffe(本家サイト版)をインストールして試してみる - 論理 Hearts Club Band

GPUドライバの導入はこの記事の下の方で書いたのでその通りにする。
まずCUDAの最新版を入手する↓
CUDA Toolkit 9.2 Download | NVIDIA Developer
2016/2/11現在で最新は7.5

環境を選択してrunファイルをダウンロード
作業しやすいようにホームディレクトリにおいておく

その後ランレベルを変えるため再起動する。
ぶっちゃけこの辺の仕組みとか理由とかわかってない・・・Linux勉強しなきゃなあ

GRUBのメニュー画面に入る(自動で表示しない場合はUbuntu起動中にEscキーぽちぽちする)
カーソルをUbuntuに合わせた状態で「e」キーを押してオプションを表示

linux の行のところに"quiet splash"って書いてあるので、その直後に"text 3"と追記する。
その後F10で起動
この設定は今回のみ有効となっている。


できたらCUDAインストーラの実行権限を変更して、

sudo chmod 755 cuda_7.5.18_linux.run

インストーラを生成するため-extractオプションをつけて実行する

sudo ./cuda_7.5.18_linux.run -extract=$HOME/nvidia_install

するとディレクトリが生成され、中にドライバ、ツールキット、サンプルのインストーラが入っている。
生成されたディレクトリ内に入り、

sudo ./cuda-linux64-rel-7.5.18-19867135.run

を実行

するとEULAが表示されるのでスペースキーで進んでいく
各項目について聞かれるので、以下のように入力する

  • ソフトウェア使用許諾: "accept"
  • インストールパス:[Enter]
  • デスクトップメニューショートカットの作成:[Enter]
  • シンボリックリンクの作成:[Enter]

Installation Completeと表示されたら完了。


同様の手順でサンプルもインストールする。

sudo ./cuda-samples-linux-7.5.18-19867135.run

各項目について以下で回答。

  • ソフトウェア使用許諾: "accept"
  • インストールパス: [Enter]


ここまでできたら再起動しておく。

theanoでgpu設定

theanoでgpuを使えるようにする。
以下のテキストを.theanorcというファイルとしてホームディレクトリに保存する。

[global]
floatX = float32
device = gpu0

[lib]
cnmem = True

[cuda] 
root = /usr/local/cuda-7.5

cudaの項目はバージョンに合わせて変更する。

その後pythonを起動し、以下のcheck.pyを実行する

# check.py


from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print f.maker.fgraph.toposort()
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print 'Looping %d times took' % iters, t1 - t0, 'seconds'
print 'Result is', r
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print 'Used the cpu'
else:
    print 'Used the gpu'

実行後、最後に"Used the gpu" と表示されればgpuが使えてることになる。

Anaconda入れる

ここは別に入れなくてもいい
まあ使えるとなにかと便利なので

Anacondaを公式からダウンロードしてくる
https://www.continuum.io/downloads
bashする

bash bash Anaconda2-2.5.0-Linux-x86_64.sh

指示に従ってインストール
パスを追加するか聞かれるので、追加する。

するとubuntuに元から入ってた方のpythonパッケージが使えなくなるので、パスを通す。
.bashrcに以下を追加

export PYTHONPATH="/usr/local/lib/python2.7/dist-packages:/home/username/pylearn2:"$PYTHONPATH

できたらpythonを起動して以下を試す。

import pylearn2

GPU使ってますよーみたいなメッセージが出ればおけ。

空の内蔵HDDにUbuntu14.04をインストールしてマルチブート(nvidia GPU使用)

いろいろあって仮想環境ではないLinuxが必要になったので、HDDを増設して新たにubuntuをインストールすることにした。
自分みたいな情弱はデュアルブートする勇気はまだない・・・というかCドライブが128GBのSSDなのでそんなことする余裕もない。

とりあえず内蔵HDDを買ってきた。
かなり急だったので全然メーカーとか調べてなかったが、近所の某工房にはでかでかとPOPが出てたのでこれを購入。

安さにびっくり。500GBでこのお値段。しかも1TBでもそんなに値段が変わらない。
まあ今回はLinuxブート用なので1TBも使うわけないと思い、500GBにしました。
あと忘れずにSATAケーブルも買う。電源ケーブルは分岐が余ってたので買わなかった。


メインはWindows8.1を使い、別HDDにUbuntu14.04をインストールする。
普通にisoファイルをDVDに焼いてインストールできると高を括っていたが、なんかできない。

「情弱がマルチブートを試みるのは無謀だったか・・・」

と諦めかけたが、試行錯誤した結果なんとか入ったっぽいので手順をメモしておく。
どうやらnvidia製のGPUがつながってるとき特有の症状があるらしい。

参考元は以下
Carpe Diem Ubuntuでインストールディスクが起動しない場合
http://kledgeb.blogspot.jp/2014/04/ubuntu-1404-uefi-2-uefipcubuntu-1404.html
Ubuntu に最新の NVIDIA Driver をインストールする。 - ZONDEEL BLOG


環境は
Windows8.1のシステムドライブ
windows用Dドライブ
空のHDD(ubuntu14.04インストール用)
GeForce GTX970



試す前に、万が一に備えてバックアップを取る。
自分はBTOで買ったプリインストールのWindows8.1だったのでwindowsのインストールディスクとかは付属してなかった(最近のはメーカー製でもついてこないのが多い?)。とりあえずイメージバックアップと回復ドライブを作ることを推奨する。
下を参考にすればだいたいできるはず。
https://121ware.com/qasearch/1007/app/servlet/qadoc?QID=015953
Windows8.1 回復ドライブの作成と復元(リカバリ)手順 : 下手の横好き!

自分みたいな情弱はまともにバックアップとかとったこと無い。ゆえに回復がどうたら言われてもぱっとしない。
回復ドライブとイメージバックアップの違いは以下がわかりやすかったかも。
fanblogs.jp


また自分みたい(ry 、空のHDDでさえもパーティションを切るのが怖かった
失敗を恐れに恐れた
その結果「Ubuntu以外のHDDはずせばええやん!」と思い、インストールをしてみた

すると一応インストールはできた。が、他のHDDをつなぐとうんともすんとも言わなくなる。。
BIOS設定とかいじってみるけど変わらず。内部でHDDの順番とか認識してるのかもしれない
なのでHDDは全部つないだ状態でインストールを行う必要がある


Ubuntu14.04 のインストールディスクを書き込む

インストールディスクがないことには始まらないので作ることにする。
windows8には標準でDVDにisoイメージを焼く機能がついてたので、それを使うことにする。

下記のサイトからubuntu14.04のisoファイルをダウンロード
Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team

その後、空のDVD-Rを挿入して
isoファイルを右クリック -> 「ディスクイメージの書き込み」 を選択。
するとツールが立ち上がって書き込み先を聞かれるので、
DVDドライブを指定して「書き込み」を押す。
ディスク確認は別にしなくてよい。

「ディスクイメージの書き込み」がない場合、isoファイルが他のプログラムと関連付けされてるので直す。
isoファイルを右クリック -> プロパティ -> 全般タブ、プログラム欄の変更ボタンを押す
プログラム一覧が出るので「エクスプローラ」を選択する。これで書き込みできる。


長々と書いたがここを見たほうがわかりやすい。

ubuntuをインストールするHDDを増設

これはまあ適当に。
SATAポートとかつなぐ順番があるのかと思ってたけど、テキトーにつないでも何も起きなかったのであんまり関係ないのかもしれない。とかゆうと詳しい人に怒られるだろうから、心配な人は周囲の詳しい人(あるいはgoogle先生)の教えを請うのが良さそうです

上で述べたように、インストールの際は全てのHDDをつなぐ必要がある(はず)。
少なくとも自分の場合はうまく行かなかったので。
ubuntu以外のディストリならできるかもしれないが試したことはない。


初めてのHDD増設だったがゆえにドライブベイにHDDをセットするのにクソ時間かかったのはまた別の話
危うくインストール前に物理的に破壊するとこだった

BIOS設定してDVDからブート

作成したインストールディスクを入れ、シャットダウンして起動、BIOSを立ち上げる。
これはメーカーによって立ち上げ方が違うだろうけど、F2とDelポチポチしとけば何とかなる。
boot priorityをCD/DVDが1番になるようにし、設定保存して再起動。

すると真っ黒い画面に

Try ubuntu without installing
Install Ubuntu
...

みたいなのが出る。ここでそのままInstall Ubuntuを選びたいところだがそうはしない
nvidia製のGPUを使ってる場合はUbuntuが起動しないと思われる
(確定的ではない、つまりよくわからん)

そこでカーソルを「Install Ubuntu」に合わせ、キーボードで'e'を入力
ブートパラメータがずらっと表示される。
その中の「quiet splash」を「nomodeset」に書き換える。できたらF10で起動。


すごい低解像度でubuntuの画面が起動したらめでたし。

パーティションを切る

いよいよHDDにパーティションを切っていく。
のだがスクショとか撮ってないので、下のサイトのほうがわかりやすいです。。
http://kledgeb.blogspot.jp/2014/04/ubuntu-1404-uefi-2-uefipcubuntu-1404.html

概要をざっくりまとめると

ubuntuではwindowsのように、「システムドライブだからC:」とかそういうのはない。これはおそらくポートの接続順とかになってるのではなかろうか。各HDDがどれであるかは把握しておく必要がある(まあパーティション情報見たらわかる)
パーティションは作られた順にsda1, sda2, ... となる。
ubuntuwindowsパーティションのフォーマットが違うので、ubuntu側からwindowsをいじるときは注意する。
スワップ領域とはメモリの中身を一時的にHDDに退避させる領域である。メモリが十分にあるならそこまで必要ではない。


手順は以下。

1. パーティションテーブルを作る

インストールするHDDを選択し、「新しいパーティションテーブル」のボタンを押す。
自分の場合は/dev/sdc にインストールした。
確認するダイアログが出るけど続ける。


2. EFIシステムパーティションを作る

インストールするHDD下にできた「空き領域」を選択し、左下の方にある「+」ボタンを押す。
ウインドウがでるので、利用方法を「EFIブートパーティション」にする
サイズは100MB程度あれば十分。自分は128MBとした
パーティションタイプは基本パーティション、場所は空き領域の始点とする。これは他のパーティションでも同じ。


3. ルートパーティションを作る

2.がおわると/dev/sdc1 ができ、タイプがefiとなっているはず。間に空き領域があったり数値が若干違ったりするけど失敗じゃないのでびびらない。
一番下の空き領域を選択し、同じように「+」ボタンを押す
今度は利用方法を「ext4 ジャーナリングファイルシステム」とする。
マウントポイントは「/」を入力
サイズだが、スワップ領域以外を全てルートに使う。なのでスワップに使う領域を予め決めておく。自分はスワップに4GB割り当てることにしたので、ルートパーティションのサイズは「空き領域 - 4000」MBと入力した。


4. スワップパーティションを作る

3.が終わると予め決めた分だけ空き領域が残る。それを選択して「+」ボタン。
利用方法を「スワップ領域」として、サイズは空き領域全て使う。


5. ブートローダの設定

最後に、「ブートローダをインストールするデバイス」という項目で、2.でつくったEFIシステムパーティションを選択する。自分は/dev/sdc1だった。タイプがefiになっていることを確認。



ここまでできたらインストールを押す。その後も指示に従うだけ。
お疲れ様でした!


...と言いたいところだが、このままではnvidiaGPU使ったら起動できない問題が解決していない。
次でGPUドライバをインストールする。


GPUドライバをインストール

ubuntuをインストールできたら自動的に再起動される。その時にDVDを取り出す。
再起動時にBIOSで、Boot順をUbuntuが入っているHDDが1番になるように設定する。

するとGRUBのブート画面が出る。(出ない場合はnvidiaGPU問題により起動が止まっているかも。その際は再起動してubuntu起動中にEscキーをポチポチしてGRUBを呼び出す)
こんな画面↓
f:id:may46onez:20160204194446j:plain
画像元:http://eiji-kb.hatenablog.com/entry/2015/07/29/200733


ブート画面に入れたら、Ubuntuにカーソルをあわせ、
最初にやったように'e'押して「quiet splash」->「nomodeset」としてF10で起動

CUIでいじるとこがあるので、ディレクトリネームを英語にしておく。
前回記事参照。

以下URLから、自分のGPUにあったrunファイルをダウンロードする。
http://www.nvidia.co.jp/Download/index.aspx?lang=jp
その後はここを参考にする。


ctr + alt + F1 でCUIモードにした後、以下のコマンドを入力

sudo apt-get purge nvidia*
sudo service lightdm stop
sudo service gdm stop
sudo chmod 755 ~/Downloads/NVIDIA-Linux-x86_64-340.32.run  # ここは各自ファイル名置き換え
cd Downloads
sudo ./NVIDIA-Linux-x86_64-340.32.run                      # ここも同様

ここからはここが参考になる
なにやら青い画面が出てくるので、「Accept」を選択

自分の環境ではプレインストールスクリプトがどうちゃら、みたいなのが出た
気にせず「Continue installation」を選択

次は署名がどうたら言われる
めげずに「install without signing」を押す。その後何度か確認みたいなのが出るので「OK」で。

今度はNVIDIA XドライバをXconfigurationに反映させるか尋ねてくる。
いらいらせず「Yes」を選択する。
何事もなければインストール完了する。その後sudo rebootで再起動。


これでGRUBブート画面からUbuntuを「そのまま」選択し、何も起こらなければインストール完了。
ドライバが入ったことで高解像度になってるはず。
今度こそお疲れ様でした。。。

ちなみにwindowsを起動したいときは、GRUBの画面でWindows Boot Managerを選択すればよい。

まとめ

UbuntuWindowsで別HDDによるマルチブートするなら、
HDDを全てつないだ状態でUbuntuインストールを行う。

nvidiaGPUを使う場合は少々めんどい。

パーティションは情弱でもある程度切れる。


この環境を構築するにあたって参考にさせていただいた先人達の努力に感謝。