Ubuntuで Altキーを Ctrl にする方法
やり方
正確には,左Altキーを押したら左Ctrlキーとして動作させる.
Ubuntu 20.04で動作を確認した.
以下を参考に xmodmap をいじる方法で実現する.
現状のキーマップを保存しといた方が無難.
$ xmodmap -pke > ~/.Xmodmap_default
キーコードを調べる
置き換えるキーコードを xev で調べる.
$ xev | grep keycode
調べたいキーを打ち込めば, keycode が出てくるのでメモする.
左コントロールを押した例,この場合は keycode 37
state 0x0, keycode 37 (keysym 0xffe3, Control_L)
自分の環境の左Altは 64だった.
.Xmodmap の作成
好きなエディタで開く.
$ vim ~/.Xmodmap
以下のように編集する. ! はコメント文なので,不要なら消しても良い.
! 既存の左Alt(キーコード64)を削除. remove mod1 = Alt_L ! キーコード64を左コントロールに割り当てる keycode 64 = Control_L ! コントロールキーとして,追加する add control = Control_L
.Xmodmap の適用
以下のコマンドで実行する.
$ xmodmap ~/.Xmodmap
ログイン時に自動で適用させる
下記リンクのように,~/.xinitrc や /etc/X11/xinit/xinitrc を編集する必要がある.
[[ -f ~/.Xmodmap ]] && xmodmap ~/.Xmodmap
なぜしたのか
Crow Translate とマウスジェスチャ を使った 英語PDF 読み
問題
Webブラウザで英語論文を流し見している際に,わからない単語や熟語をいちいち翻訳サイトへコピペして読むのが面倒. 特にPDFの場合,ブラウザの翻訳アドオンや拡張機能はうまく動作しない*1ので,個人的に不満です.
アドオン例
Firefoxだと GitHub - itsecurityco/to-google-translate: Highlight text on a web page and send it to Google Translate
解決方法
Crow Translate というソフトを使えば,先の問題を解決できました. さらに,マウスジェスチャソフトを使えば,マウスのみで翻訳作業が完結するの便利です. また,ブラウザに依存した拡張機能でないので,evinceなどのPDFビューアでも動作するので,個人的に気にってます.
Crow Translate ができること
- 単語または文章の翻訳
- 単語または文章の読み上げ
公式サイトを見た感じ,対応している環境は Linux系とWindowで, 私はUbuntu 18.04でversion 1.0.0 の動作を確認しています.
翻訳手順
実際の翻訳手順としては以下のような流れです.
- バックグラウンドでCrow Translate を動作
- 翻訳したい文字列(文章でもOK)を選択
- 翻訳コマンドを入力
- 翻訳ポップアウトがマウスカーソル周辺に出現!
感想とマウスジェスチャのすすめ
タブなりウィンドウなりをいちいち切り替えて翻訳する必要がなく, 翻訳の質は Google翻訳*2で,ザッと読むには十分なレベルで個人的には満足です.
また,私はマウスジェスチャーソフト*3を使ってコマンドを入力するようにしているので, マウスの操作のみで,英語PDFをサクサク読め便利でおすすめです.
*2:Bing翻訳などにも変更可
*3:私の場合は easystroke https://github.com/thjaeger/easystroke/wiki
いまさら chainer で Neural Style Transfer (画風変換)
Neural Style Transfer (画風変換)とは
2016年ごろから、Prismaをはじめとする写真をおしゃれに変換するアプリが出始め、人々の注目を集めています。
この写真の画風を変換する処理は Neural Style Tranfer という最近勃興している Deep Convolutional Neural Network (DCNN) を利用した技術です。
関係する論文として、Image Style Transfer Using Convolutional Neural Networks (2016)が挙げれます。この論文がNeural Style Transferの基礎となっているみたいです。
ざっくり説明すると、
ある程度良い特徴を学習しているNeural Networkに対して、2枚の画像(コンテツ画像とスタイル画像)からコンテンツ特徴とスタイル特徴を抽出します。 この2つの特徴を持った画像を生成するという技術です。
詳しい解説は Shinya Yuki さんなどの真面目なブログなどを見て下さい。私も Neural Style Transfer を理解するために読み参考にしました。
なぜ今、Neural Style Transfer
先日、投稿した記事より、せっかくCUDAを入れなおしたので、動作確認と勉強を兼ねて chainer で作ることにしました。 chan-qp.hatenablog.com
なお、以前からchainerを用いた Neural Style Transferは存在します。
実装
OS : Ubuntu 16.04 GPU : GTX750Ti
chainer version 3.2.0
githubに .ipynb形式であげています。 github.com
- 入出力例
- 変化の様子
1000回くらい回しました結果です。
感想
Optimizerのパラメータをいじっていい感じの結果を見つけるのに、時間を費やし苦労しました。
また、chainer のOptimizer は Linkクラスをセットアップしないといけない点があり、はまりかけました。
暇なときに結果を追加するかも…
nvidia-smi が消えてからのCUDA復旧
環境
OS : Ubuntu 16.04 LTS
状況
先日、nvidia-smi
を入力したら、コマンドが存在しないことになっていた。(アップデート・アップグレード時にやらかした?)
復旧すべく
先人たち
を参考に
apt-get purge nvidia-* apt-get install nvidia-390
とか、
CUDAを使いたいので、
apt-get purge cuda* apt-get install cuda
とかしても、nvidia-smi
がない状態で正しく復旧できなかった。
復旧方法
- NVIDIAの公式から runfileをダウンロードして、DriverとCUDAを入れなおす。
Driverも別のrunfileがダウンロードできますが、一緒にインストールできるのでCUDAを使うなら一緒でよいと思います。
DriverとCUDAを入れる前は以前あったDriverとCUDAをアンインストールしておく。
deb等のパッケージを使ったアップデート・インストールがうまくいかなったので、やってみたらうまくいきました。
Login Loop
私の環境だけかもしれませんが、 runfileでインストールしたら、login loop(パスワードを入力しても再び login 画面へ戻される)の現象が行ったので、 BOOT時のPRIMARY DISPLAYをオンボードからPCIに変更したら login loop は改善しました。 (なんでなんだろう…)
Layer-wise Relevance Propagation を Chainer で実装する
1. Layer-wise Relevance Propagation(LRP)
元論文が これ で、詳しいことは以下参照。
私はLRPを
一度データを順伝搬させて、出力層から各層の出力と重みを元に貢献度を求めていく手法
だと理解しています。
2. Chainer
国産のニューラルネットワーク用のフレームワークです。
一度、順伝搬させるとデータが数珠つなぎ的に残るので、個人的には使いやすくて好きです。
Chainer: A flexible framework for neural networks
3. 実装 (chainer v2.0.0)
Chainerは一度、順伝搬させるとデータと生成された層の種類を参照できるので、それを利用して実装します*1。
現在は最低限、線形結合と畳込み、プーリングのみに対応しています。 また、入力zのshapeは(データ数, 出力ニューロン数)を想定しています。
import chainer import numpy as np def LRP(z, epsilon=0): creator = z.creator var = z # relevance value r = np.zeros(z.data.shape) for i, d in enumerate(z.data): r[i, d.argmax()] = d.max() while(creator is not None): x = creator.inputs[0].data y = creator.outputs[0]().data if len(creator.inputs) > 1: w = creator.inputs[1].data if creator.label == "LinearFunction": _y = y + epsilon*np.sign(y) r = x.reshape(r.shape[0], -1) * (np.dot(r/_y, w)) elif creator.label == "Convolution2DFunction": _y = y + epsilon*np.sign(y) r = x * chainer.functions.deconvolution_2d(r.reshape(y.shape)/_y, w).data elif creator.label == "MaxPooling2D": r = chainer.functions.unpooling_2d( r.reshape(y.shape), ksize=creator.kh, stride=creator.sy, outsize=x.shape[2:]).data var = creator.inputs[0] creator = var.creator return r
一応、出力層のデータが消えないように以下のhookを順伝搬の際に追加しました。
from chainer.function import FunctionHook class RetainOutputHook(FunctionHook): def forward_postprocess(self, function, in_data): function.retain_outputs([0]) ''' Example with RetainOutputHook(): z = model.predict(x) '''
使用例はgithubに上げます。
*1:バグなどがあるかもしれません
chainer v2 導入メモ
環境
OS: Ubuntu 16.04
CUDA 8.0, cuDNN v5
cuda, cudnnはインスール済み
step 1.
pip install -U chainer
step 2.
pip install -U cupy
参考
Installation Guide — Chainer 2.0.0 documentation
CuPy – NumPy-like API accelerated with CUDA — CuPy 1.0.0.1 documentation