One-hotベクトルを整数値のベクトルにnumpyでデコードする
どうもたっきーです.これはメモ.
はじめに
Kerasではkeras.utils.np_utils の to_categorical()という関数を用いれば簡単にOne-hotベクトルが生成できる.
これで多クラス分類の場合は、categorical_crossentropyを計算できる.
しかし,これを使って混合行列とかを表示したいとき,sklearn.metrics.confusion_matrix()に渡す値がOne-hotベクトルだと無理っぽくてラベルの整数値の配列を渡さなければいけないらしい.
(
つまり,
array([[ 1., 0., 0., ..., 0., 0., 0.],
[ 1., 0., 0., ..., 0., 0., 0.],
[ 1., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 1.],
[ 0., 0., 0., ..., 0., 0., 1.],
[ 0., 0., 0., ..., 0., 0., 1.]], dtype=float32)
みたいなOne-hotベクトルじゃなくて,
array([0, 0, 0, ..., 9, 9, 9])
のようなラベルの整数値の配列じゃないとダメってこと(この場合だと0〜9の10クラスの分類問題)
)
じゃあ,to_categorical()でOne-hotベクトル化する前の配列を使えばいいじゃん?ってなると思うけど,One-hotベクトル化した後のやつをnp.save()で保存していたので,元のクラスの整数値の配列は保存してなかった.
そこで”One-hotベクトル” → ”クラスの整数値”ってどうやって変換すんじゃい!!!!ってなったので調べたりしたのでメモる.
やりかた
np.argmax(one_hot, axis=1)でできるっぽい.
np.where()を使う方法もあるっぽいけど,np.argmax()のほうが分かりやすいのでこっちのがオススメである.
つまり,
Confusion matrix — scikit-learn 0.20.0 documentation
のようなやつで使いたいときは↓のように書けば良い.
%matplotlib inline import os import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix import itertools """ Kerasのモデルの定義や学習は省略 """ labels_pred = model.predict_classes(x_test,verbose=0) def plot_confusion_matrix(cm, classes, title='Confusion matrix', cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ cm_normalize = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] plt.imshow(cm_normalize, interpolation='nearest', cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=90) plt.yticks(tick_marks, classes) thresh = cm.max() / 2 for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], "d"), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.ylabel('True label') plt.xlabel('Predicted label') plt.tight_layout() # Compute confusion matrix cnf_matrix = confusion_matrix(np.argmax(y_test, axis=1), labels_pred) np.set_printoptions(precision=2) # Plot non-normalized confusion matrix plt.figure() plot_confusion_matrix(cnf_matrix, classes=class_name_modelnet, title='Normalized_confusion_matrix') plt.savefig('Normalized_confusion_matrix.svg') plt.show()
まとめ
np.argmax([One-hotベクトル], axis=1)で,
”One-hotベクトル” → ”クラスの整数値” に変換できる.
感想
どーせkerasのmodel.fit()に渡す配列はOne-hotベクトルじゃないとダメだからOne-hotベクトルに変換したやつをnp.save()で保存して使お!って思ってたけど,変換前のヤツも何気よく使うので困った.
てか,model.fit()に渡すのはOne-hotじゃなきゃいけないのに,model.predict_classes()で返ってくるのはラベルの整数値の配列なの,扱いにくくないか...?
numpy力が強いとコード書くとき強えなって思った(こなみかん)
今日学内コンビニで見つけたとても美味しいやつ
強い…! pic.twitter.com/fxfvSFJwME
— めめめっ (@tacky0612) October 18, 2018
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
直感 Deep Learning ―Python×Kerasでアイデアを形にするレシピ
- 作者: Antonio Gulli,Sujit Pal,大串正矢,久保隆宏,中山光樹
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
CentOSのキーボードの配列を変更する
どうも,たっきーです.
はじめに
僕は印字がカッコイイからという理由でMacBook ProのUS配列キーボードを使っているのですが,VirtualBoxなどで仮想マシン(CentOS7)を動かす際に,初期設定でキーボードにjp106配列が割り当てられている.
これによりキーボード上の印字されている文字とコンピュータに認識される文字(特に記号)があべこべになってしまう問題がある.今回はそれを回避する方法について書く.
環境
- MacBook Pro 13-inch(Late2016) US配列
- macOS High Sierra 10.13.6
- VirtualBox 5.2.18
- CentOS7
対策
localectl set-keymap usと叩けばいいらしい.(おしまい)
まずroot権限でログインする.
su -
ロケール確認以下のコマンドで.
# localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp106
X11 Layout: jp
X11 Model: jp106
X11 Options: terminate:ctrl_alt_bksp
これを見るとKeymapがjp106になっているのがわかる.
次に以下のコマンドで任意のキーボード配列に変更できる(この例だとUS配列)
localectl set-keymap us
もう一度ロケールを確認.
# localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: us
X11 Layout: us
X11 Model: pc105+inet
X11 Options: terminate:ctrl_alt_bksp
KeymapをUS配列に変更できた.
おわりに
他のOS,キーボード配列は試してないので分からん.
[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識
- 作者: 武内覚
- 出版社/メーカー: 技術評論社
- 発売日: 2018/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
ゼロからはじめるLinuxサーバー構築・運用ガイド 動かしながら学ぶWebサーバーの作り方
- 作者: 中島能和
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/06
- メディア: 大型本
- この商品を含むブログを見る
LinuxでファミレスとかカフェのWi-Fi接続できないのクソ(できるけどできない)
— 20万円下さい (@tacky0612) September 7, 2018
BOSSエフェクターのゴム足をキレイに剥がす方法
どうもたっきーです.
エフェクターボード組むとき,エフェクターの底面にマジックテープを貼ってボードに固定する人が多いと思いますが,BOSSのエフェクターってゴム足が付いてるままだと凸凹しててマジックテープ貼り難いですよね?
なので,今回はそのゴム足のキレイな剥がし方を紹介したいと思います.
キレイに剥がれないゴム足
僕はBOSSのエフェクターが好き(特に踏み心地とルックスが好き)でよく使うのですが,エフェクターボードに組み込みたいためにゴム足を外すときにうまく剥がせなくてマジックテープ貼ったときの接着力の低下が心配になる.接着力が足りないと運搬の際に剥がれたりしそうで怖い.
今回ゴム足を剥がすのはみんな大好きBD-2(中古).
とりあえずマイナスドライバーなりを使って雑にゴム足を剥がす.
もちろん,うまく剥がせずあとが残る.
シリコンリムーバーで剥がし残しを除去
これを残ったシール痕に吹いてゴシゴシするとありえん落ちる.
めちゃめちゃキレイな底面になった.
神経質な人は底面のネジ止めを外してからシリコーンリムーバー吹きかけたほうが良いかも.電子機器なので.
マジックテープを貼り付け
次にマジックテープを貼り付ける.おすすめはOne Controlのマジックテープ.
底面はシリコーンリムーバーで脱脂してあるので接着力がすごい.
あと,このように全面にキレイに貼れ,面積を稼げるのでマジックテープ⇔マジックテープ間の接着力も強い.
エフェクターボードに組み込み
とまあ,こんな感じで.
おしまい.
One Control ワンコントロール 面ファスナー HOOK&LOOP 1m HOOK (オス)
- 出版社/メーカー: One Control
- メディア: エレクトロニクス
- この商品を含むブログを見る
Holts(ホルツ) シリコーンリムーバー 300ml MH11102 [HTRC3]
- 出版社/メーカー: Holts(ホルツ)
- 発売日: 2011/11/11
- メディア: Automotive
- この商品を含むブログを見る
これ、気になる pic.twitter.com/48dXh1x7dk
— 20万円下さい (@tacky0612) September 5, 2018