備忘録とか日常とか

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

Windowsノート グラフィック設定を電源接続時と同じにする

所持していた古いノートPCにWindows10をクリーンインストールしたところ,
グラフィック設定が変わってしまったのでメモしておく.
具体的には

  • 電源に接続すると,一瞬画面が暗転して元の画面に戻る
  • 電源接続時はぬるぬる動くのに,バッテリー駆動時はなんかカクカクする(リフレッシュレートが変わっている)
  • 背景が暗いページを表示すると画面輝度が暗くなる.明るいページだとまた明るくなる

のような症状が現れた.
一応直し方をメモしておく.


環境
TOSHIBA dynabook R731(古い)
windows10 pro をクリーンインストールしたところ,
Intel(R) HD Graphics 3000 が自動で取得された.


リフレッシュレートを設定

インテルのグラフィックプロパティを立ち上げ,
「電源」-> 「バッテリー駆動」から
「ディスプレイ リフレッシュレートの切替」のチェックを外す.

「ディスプレイ」-> 「一般設定」の
リフレッシュレートを 60Hz に設定する

これで電源を抜き差しするたびに画面が暗転することはなくなり,
かつバッテリー駆動時でもぬるぬる動くようになる.


画面の輝度調整を無効

同じくインテルのグラフィックプロパティから,
「電源」-> 「バッテリー駆動」から
「ディスプレイ省電力テクノロジー」のチェックを外す.

かつ「バッテリー駆動」「電源接続」の両方の電源プランを
「最長バッテリー駆動時間」に設定する.


これで画面輝度が一定になる.
ならない場合はコントロールパネル -> 電源オプション -> プラン設定の変更から
「詳細な電源の変更」を開き,「ディスプレイ」->「自動輝度調整を有効にする」をオフにする
これでたぶんいける

バッテリー駆動時と電源接続時で画面輝度を変えたくないなら
「ディスプレイの明るさ」からそれぞれ同じ輝度に設定しておく



とりあえず電源回りは解決したけど
根本的にスペック足りてないしなこれ

新しいPC欲しいなぁ...新型macbook air早く出ないかなぁ...

Deeplearningライブラリ「Keras」でつまずいたこと

DeeplearningライブラリのKerasを使っているときにはまったことをいくつかメモ。
ほぼ自分用かもしれない


今までTheanoを使ってアルゴリズムの勉強かついろいろ実験していたのだが、
勉強にはなるものの一から新しいアルゴリズムを実装するのはなかなかしんどいので
Theanoのラッパーとして使えるKerasを使ってみた

他にも色々あるっぽいけど評判良さそうなので。。
そのうち浮気するかもしれん


ちょっと使って見たところ、何個か細かい点でつまずいたのでメモしておく。
バックエンドはTheanoしか使っていないのでTensorflowについてはわかりません

ラベルはバイナリベクトルで扱う

まずこれ。
keras.datasetsからmnistなどのデータセットを取ってこれる。
mnistの場合だと以下

import keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

mnist.load_data()の戻り値はタプル*2

Xは(n_samples, row, column)という形のnp.arrayで、
yは0~9のint型の数値を持つ(n_samples,)という形のnp.arrayとなっている
Kerasはラベルを数値ではなく、0or1を要素に持つベクトルで扱うらしい
つまりあるサンプルに対するターゲットを「3」だとすると

[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]

みたいな感じにしなければならない。

これは以下のように解決できる。

from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

(n_samples, n_classes)というnp.arrayがそれぞれのyに代入される。

入力データは[0,1]の範囲に正規化しなければならない

これが一番わかりにくかった
mnistの場合だと,まず入力データはint型になっているので変換する
その後画素値の最大である255で割り算しておく

X_train = X_train.reshape(X_train.shape[0], 28, 28).astype("float32")
X_train /= 255.0

こうしないと一向に学習が進まない。
Theano使ってるときは特にこういった処理はしなくても学習できたので
判明するまで丸二日くらいかかった

ドキュメントのわかりやすいとこに書いといてほしいです。。

poolingのフィルタがはみ出る場合は端っこのピクセルを無視する

細かい点だけど。
Theanoでプーリングを行う場合はtheano.tensor.signal.poolを使うのだが
フィルタサイズやストライドに加えてignore_borderという引数をとる。
これは例えばフィルタサイズ(3,3)、ストライド(2,2)みたいな設定にしたときに、
特徴マップの端でフィルタがはみ出した場合の扱いを決定する引数である。
図の例↓

f:id:may46onez:20151221223401p:plain

ignore_border=Trueとすると、はみ出た分のプーリングは行わない
つまり上図の例だと出力の特徴マップは(2,2)となる

この引数が、TheanoのデフォルトではFalseになっているのが
KerasだとTrueになっている

あまり性能に影響は出ないと思われるが、特徴マップのサイズがあまりにも小さくなりすぎると
認識率が落ちることが(自分の経験では)多々あったので
自分でネットワーク構造を考える場合は気に留めといたほうがいいかもしれない。

シークバー処理中にValueErrorを吐かれる

Kerasのいいところの一つに、学習状況などをシークバーでお知らせしてくれる機能がある
こんなの↓

Epoch 1/20
60816/60816 [==============================] - 19s - loss: 0.1665 - acc: 0.9597 
Epoch 2/20
31200/60816 [==============>...............] - ETA: 8s - loss: 0.1583 - acc: 0.9612

あとどれぐらいで学習が終わるか、lossがどれぐらい減少しているか、
学習データに対する認識率はどうか、
validationセットを指定した場合はそれに対する認識率もリアルタイムで表示される。

非常に便利な機能なのだが、
たまに以下のようなエラーを吐くことがある

ValueError: I/O operation on closed file

これはipythonでのバグらしいのだが、
今のところこれを根本的に解決する方法がないらしい・・・
丸一日かけて学習していたモデルが途中で止まったらかなりげんなりするだろう。
現に自分はした。

とりあえずの解決策としては、model.fit()の引数にverbose=0とする
これでシークバーが表示されなくなるのでエラーは回避できるが、
せっかくの便利機能が使えなくなる。。


公式の対応に期待か。

半角/全角の変換をmac風にする(windows10, Linux)

先日のWWDC2016は個人的には残念な結果でした。。
ハードに関する情報は一切なく、iOSやらSiriやら開発者向けの内容が多かったです。
まあ「初めからそういう発表会だから!」と言われればその通りだけど・・・


以前からmacbook airを買おうと画策していたのですが
いよいよ買い時がわからなくなってきたので、
気分だけでもmac使ってる風になろう!
ということでタイトルの通り。


macではスペースキーの左右に英数/かなキーが用意されており、
半角/全角キー(キーボードの左上)まで手を伸ばす必要がありません。
windows/Linuxでは変換/無変換をそれらに割り当てることでmac風な入力が可能となります。
要はIMEのオンオフをそれらに割り当てるということ

慣れればそこそこ作業スピードが上がりそうです。
以下その方法↓


Linux

ubuntu14.04で確認。多分それ以外でも可能

Mozcのインストール

Linuxには標準で日本語入力機能が搭載されていないので、IMEをインストールします。
(ubuntu14.04には初めから入っていたので必要なし)

$ sudo apt-get install ibus-mozc

Mozcの設定

superキー(windowsキー)を押して「mozc」と打ち込み、"Mozcの設定"を選択。
「キー設定の選択」の欄の編集ボタンをクリック。

するとMozcキー設定というウィンドウが開くので、以下のように設定する。

  • モード「直接入力」、入力キー「Henkan」のコマンドを「IMEを有効化」にする
  • モード「入力文字なし」、入力キー「Muhenkan」のコマンドを「IMEを無効化」にする


設定後に新しくウィンドウを立ち上げて確認。
変換キーで全角、無変換キーで半角入力が可能となる。

何かの拍子に設定が狂って変換/無変換キーが使えなくなった時のために
全角/半角キーの設定は変更しないことをおすすめします。。

設定を戻したいときは「キー設定の選択」欄で「MS-IME」を選択すると元に戻ります。

Windows10

windowsキーを押してCortanaに「IME」と打つ。(ちょー便利!)
Microsoft IMEの設定」というのが出るのでEnter


開いたウィンドウで「詳細設定」ボタンを押す。


全般タブの編集操作の欄で、キー設定 -> 変更を押す。
するとキー割り当てのウィンドウが出てくる
こんなの↓

f:id:may46onez:20160623212321p:plain


あとは

  • 「キー」列が「変換」の行で、「入力/変換済み文字なし」列のところを「IME-オン」にする
  • 「キー」列が「無変換」の行で、「入力/変換済み文字なし」列のところを「IME-オフ」にする

これで完了。
windows10以外でもIME設定のところをいじればできるはず。


余談だがCortanaはすごい便利。(音声入力は知らん)
何か設定を変えたいときにキーワードを打って検索すると大体出てくる。
新スタートメニューもなかなかいい感じ。あんま使わないけど。


あとは仮想デスクトップ回りとかをもう少し洗練された感じにしてくれると使いやすくなるんだけどなー。
デスクトップ切り替えながらアクティブウィンドウ移動とか。
キー割り当てを変えられるとなお良いんだけどさすがに無理かな・・・

公式の対応に期待です。

BUMP OF CHICKENの初スタジアムツアー”BFLY” in 大阪 物販のコツ・ちょっとだけ感想

タイトルの通り!

BUMP OF CHICKENは今年20周年を迎えて,4月から初のスタジアムツアーを開始してます
大阪→愛知→福岡→神奈川という行ったり来たりのスケジュール(笑)

大阪・京セラドームでの初日ライブに行ってきたので記念に。


多少ネタバレ(?)を含む可能性があるので
今後のツアー参加予定の方はご注意ください。
演出については言及しません。

続きを読む

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()で繋げるとか...?

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