文字エンコードを変換する

お題はありふれたもので、いろいろなブログで語られているものです。
実際の作業では、足りない点もあるので、補足するメモです。

ここでの紹介は、

半角カタカナが全角カタカナになる
・"~"が一致しない文字コードになる
・文字エンコードが混在している
といったときの対処メモです。

目的

マルチプラットフォームで開発していると、ソースコードの文字エンコードが統一されず、困ることがあります。

実際に統一する場合、UTF-8 BOM付きになることが多いと思います。
理由は、BOMが付くことでファイルフォーマットが確定すること。
バイト文字が使えること。
多くの開発ツールがサポートしていること。

などが挙げられます。

 文字エンコードの知識

文字エンコード変換で一番困るのが、Windows上のShiftJIS日本語入りのソースコードUTF-8(BOM)に変換する場合です。
Windwosで作ったShiftJISファイルはCP932と呼ばれるShiftJISの亜種みたいなもので、ISO規格のShiftJIS=ISO-2022-JPと違います。
CP932をISO-2022-JPとして変換すると、半角カタカナが全角になったり、"~"が一致しない文字コードになったりします。

変換ツール

変換ツールは、"nkf"を使います。
Linuxですが、機能が使いやすいです。
WindwosからはVM経由の共有フォルダで、Windwos上のファイルを変換できますので、LinuxがゲストOSのVMを使います。(cgwinでもいいですよ)

コマンド

Windwos用のShiftJISファイルをUTF-8 BOM付きにするコマンド。

nkf --ic=CP932 --oc=UTF-8-BOM --overwrite filename

ファイルがわかっている場合や少ない場合は、これでいいです。
半角カタカナが全角カタカナになる
・"~"が一致しない文字コードになる
が解決します。

 

ファイルが多い場合や、一部のファイルがUTF-8だった場合はどうでしょう。

--ic=932 は「入力ファイルは、CP932形式ですよ」と教えているのに、実際のファイルがUTF-8だったら変換後のファイルは文字化けしてしまいます。

--ic を省略すると入力ファイルを自動で解釈してくれまが、ShiftJISファイルを自動解釈するとISO-2022-JPで解釈されるので、半角カタカナ問題を解決できません。

そこで、全ファイルをまずCP932にしちゃいます。

find . -type f | xargs nkf --oc=CP932 --overwrite

次に、UTF-8 BOM付きに変換です。

find . -type f | xargs nkf --ic=CP932 --oc=UTF-8-BOM --overwrite

2回に分けているのは、UTF-8依存文字が欠落するので、差分を取って後で直せるようにしています。--overwriteで上書きしているのでコピーを忘れずに。

・文字エンコードが混在している
の解決方法でした。

ついでに

解決できない問題。
・CP932をUTF-8ISO-2022-JPで誤変換したファイルを元ファイルに戻したい

CP932は半角・全角カタカナが混在しますが、ISO-2022-JPUTF-8に変換すると、どちらも全角カタカナになります。
その後、UTF-8からCP932にしようとしても、元のファイルが半角だったか全角だったか情報がなくなっているので、戻すことはできません。

Apple Developer Programの法人登録(2016/9/28)

お題の通り。時間がたつとサイト内容が変わるので、
ネットで調べた内容と実際の手順は結構ちがっていたりする。

というわけで、
やった手順をおさらいする。

Apple IDの取得
手順通りで問題なく取得終了。
法人登録なので、法人domainのメールアドレスにした。

Apple Developer Program

サポートを参考にやりました。

登録 - サポート - Apple Developer

「申請者が、企業、・・・」というところの行を読む。

 

手順

最初に同意が求められるので、チェック外して進む。
※チェックは2つともメール配信の有無なのでほしい人はそのままでOK

 

Apple Developer から「プログラム」→右上の「登録」ボタン

・「登録を開始する」ボタン

ここで英語のページに飛ぶ。

・Entity Type - Company / Organization を選択、「Continue」ボタン

・Authority to Sign Legal Agreements
会社の創立者、責任者かという項目(のはず)
社長や取締役なら上を、平社員(管理者)なら下を選ぶ。

・Verfication Contact
自分の情報を入れる。日本のCountry Codeは"81"です。

・Organization Information

会社の情報。ここが大変。
D-U-N-S Numberが必須。自社は登録済みだったので、照会でいけた。

登録が必要な方は、別サイトを参照ください。

国内の検索サイトもあるけど、Appleのサポートから照会したほうがいい。
理由はレスポンスが早い。英語で入力しないといけないが。。。

上記の日本語のサポートの「D-U-N-S 番号」の”詳細は~”リンクにいく
「D-U-N-S 番号検索ツール」のリンクにいく

"Look up your D-U-N-S Number"

ここから英語で入力。

全部入れたら「Continue」ボタン
住所は厳密じゃなくてもよさげ。
おそらくPOST number/Phone numberは正確にするべき。
選択できる会社がリストで出るので、自社を選んで「Continue」ボタン
D-U-N-S Numberが入ったメールが届きます。

Organization Information の 入力欄を埋めます。
会社名はD-U-N-S Number取得時に取れた英語の名前を使う。
D-U-N-S Numberを入力。
残り埋める。
「Continue」ボタン

確認フォームが表示され、D-U-N-S Numberが自社であればチェックつけて進む。
受け付けたよ、登録処理中になる。
完了メールが通知されるまで待ってね。

デバイスドライバ開発めも

LINUXでLANドライバを調査したときのめも。
Etherドライバだけ見てたので、他を見落としてた。

 

・Etherドライバ
IntelとかRealtekのコントローラチップ制御

・EtherPHY
MIIとかRGMIIの物理レイヤー

・EtherPHYを制御するインターフェース
MDIOなどのバスIF

 

・ソフトウェアの構成

Etherドライバ
+ BUS(BUS IF driver) / BUS interface
+ PHY(Driver PHY) / PHY device

BUS
+ PHY(Driver PHY) / PHY device

 

・Etherドライバ(driver/net/ethernet)
バスとPHY層を生成し、制御をする。
・BUS IF(driver/net/phy/mdio_bus.c)
接続されたPHYを制御する。
・PHYデバイス(driver/net/phy/phy_device.c)
制御コマンドを実行する。

Deep Learningのフレームワーク近況

慣れないPythonチュートリアルを勉強中。
課題でXOR分類器をコーディングしてみたり。

本題。

tensorflow
0.7.1がリリース。
Download and Setupの手順も更新されている。(こういうところ、すごく親切)

linux GPU版だけ引用する。

# Ubuntu/Linux 64-bit, GPU enabled:
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

CUDA toolkit 7.5 と cuDNNのv4対応版のバイナリと思われる。

CNTK
特に動きはなさそう。
ImageReaderに手が入ったっぽい。

chainer
1.7.0がリリース。
こちらもcuDNN v4に対応したようだ。

整理すると、
・CUDA toolkit 7.5 + cuDNN v4
tensorflow 0.7.1
chainer 1.7.0
→ どちらも問題なくGPUで動作した。

・CUDA toolkit 7.0 + cuDNN v4
CNTK beta(2016.02.08)

以上。

tensorflowのチュートリアル(MNISTビギナー編)

チュートリアルを翻訳していく。

MNIST For ML Beginners

MNISTは機械学習の"Hello World"だよ。

手書き数字の画像と数字のデータセットを使って、訓練して数字を予測するん。
ソフトマックス(多項ロジスティック)回帰と呼ばれる、単純なモデルで説明するよん。

ソースコードは"tensorflow/examples/tutorials/mnist/mnist_softmax.py"かな。

MNISTデータ

MNISTデータを"input_data.py"でダウンロードするようにしておいた。
下のコードをコピーしてデータを使いな。

訓練データ:55000、テストデータ:10000.、検証データ:5000だ。
これがいい感じの割合なんだ。

xsに28x28=784次元ベクトル(値は0~1)を55000個。
ysに0~9の数字(値は0か1で1種類)を55000個。

準備完了。モデル設計をはじめよう。

ソフトマックス回帰

画像をみてそれが0~9のどれに一致するかを確率で出すことにする。
確率をだすならソフトマックスでやるんだ。
複雑なモデルであっても最後の層はそうすることになる。

んで数式だ。
evidence(i)は各数字の結果
x(j)は784の入力
w(i,j)は結合線の重み
b(i)はバイアス
合計して求める。
それをsoftmaxで確率にする。

行列でいろいろやって、最後はシンプルに。
画像引用な。

実装

Pythonで実装するよ。
行列計算はnumpyをつかうとモデルと分離しやすい。

・tensorflow使うぜ定義:
import tensorflow as tf

・変数使うぜ定義:
x = tf.placeholder(tf.float32, [None, 784])

決まってない変数のところは、入力データの数を入るようにするべ。
んでこれは、浮動小数点(float32)の784個の2次元配列になってんよ。

・あと重みとバイアスが必要だな
これは変更できる数(Variable)にしとく。
W = tf.Variable(tf.zeros([ 784、10 ]))
b = tf.Variable(tf.zeros([ 10 ]))

初期値は0になってる。訓練で覚えていくから気にしなくていい。

次は行列のところをやるんだけど、1行で書けちゃう。
tensorflowすごい!
y = tf.nn.softmax(tf.matmul(x、W)+ b)

これでおしまいだ。簡単だろ?

訓練

コストとロスを定義する。
一般的には交差エントロピーを使うのがいいんだ。詳しくはググってくれ。
変数を追加しよう。
y_ = tf.placeholder(tf.float32, [None, 10])

で交差エントロピーっと、
cross_entropy = -tf.reduce_sun(y_*tf.log(y))

yの対数を計算して、要素に対応するy_をかけて、
reduce_sumがすべての要素に追加する。これは1枚の画像だけな。

バックプロパゲーションで訓練してやんよー
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

学習率は0.01で、勾配降下法をつかう。

訓練の前に初期化する操作:
init = tf.initialize_all_variables()

訓練開始:
sess = tf.Session()
sess.run(init)

訓練は1000回ループだー
for i in range(1000):
  batch_xs, batch_ys = mnist.train.next.batch(100)
  train_step.run({x: batch_xs, y_: batch_ys})

バッチは100個のランダムで取得する。
train_stepになんかする。(ここはよくわからんなー)

評価

tf.argmax使うと配列の最大値がとれるよ。
yとy_で比較できんよ。
tf.reduse_meanで平均値をとれる。
精度を表示するよ。だいたい91%くらいかな。
あまりよくない。ちょっといじれば97%くらいにできるぜ。
すげーのだと99.7%のもあんよ。

え、こんなもん。がっかりだって?
上級者向けのコースがありまっせ。旦那。

Deep MNIST for Experts

翻訳おしまい。

Deep LearningのGPU環境構築

(2016/3/4追記)この記事の内容は古くなっています。
tensorflow 0.7.1, chainer 1.7.0の場合、CUDA 7.5 + cuDNN v4を設定すること。

Ubuntu 14.04 LTS 64bitのインストール

システムの更新

$ sudo apt-get update
$ sudo apt-get dist-upgrade

リセット

nVidiaドライバのインストール

システム設定→ソフトウェアとアップデート→追加のドライバー
NVIDIA binary driver を選択
変更の適用

CUDA toolkitのインストール
事前にダウンロードする

$ sudo dpkg -i cuda-repo-ubuntu1404_7.0-local_7.0-28_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

.bashrcに追記

export CUDA_HOME=/usr/local/cuda-7.0
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

cuDNNライブラリ

$ wget http://developer.download.nvidia.com/compute/redist/cudnn/v4/cudnn-7.0-linux-x64-v4.0-rc.tgz
$ tar -xzvf ./cudnn-7.0-linux-x64-v4.0-rc.tgz
$ sudo mkdir /usr/local/cudnn-v4-rc
$ sudo cp -r cuda /usr/local/cudnn-v4-rc

.bashrcに追記

export CUDNN_HOME=/usr/local/cudnn-v4-rc/cuda
export CPATH=$CUDNN_HOME/include:$CPATH
export LIBRARY_PATH=$CUDNN_HOME/lib64:$LIBRARY_PATH
export LD_LIBRARY_PATH=$CUDNN_HOME/lib64:$LD_LIBRARY_PATH

ファイルのコピー

$ cp /usr/local/cudnn-v4-rc/cuda/include/cudnn.h $CUDA_PATH/include
$ cp /usr/local/cudnn-v4-rc/cuda/lib64/libcudnn* $CUDA_PATH/lib64

※追記
tensorflow 0.7.0のバイナリだと実行時にCUDNNのエラーがでる。
v3-prodのcuDnnに変えれば実行できる。
v4ができそうな記載あるからソースからビルドするも、
bazelのビルドエラーが解決できない。

CNTK の cuDNN v4 ビルドエラー対応

エラー:

1>C:/CNTK/Source/Math/CuDnnConvolutionEngine.cu(507): error : argument of type "const float *" is incompatible with parameter of type "void *"

 

原因:

cuDNN v4 Rc から cuDNN v4 Prodで、APIの引数が変わった。

Some change between cuDNN 4.0 rc and cnDNN 4.0 prod will cause the build fault. · Issue #127 · Microsoft/CNTK · GitHub

 

対応:

Before

CUDNN_CALL(cudnnBatchNormalizationBackward(m_cudnn, mode, &C::One, &C::One, t(inT), ptr(in), t(inT), ptr(srcGrad), t(inT), ptr(grad),
t(scaleBiasT), ptr(scale), ptr(scaleGrad), ptr(biasGrad), CUDNN_BN_MIN_EPSILON, ptr(saveMean), ptr(saveInvStdDev)));

 

After

CUDNN_CALL(cudnnBatchNormalizationBackward(m_cudnn, mode, &C::One, &C::One, &C::One, &C::One, t(inT), ptr(in), t(inT), ptr(srcGrad), t(inT), ptr(grad),
t(scaleBiasT), ptr(scale), ptr(scaleGrad), ptr(biasGrad), CUDNN_BN_MIN_EPSILON, ptr(saveMean), ptr(saveInvStdDev)));