日記20180507

日記じゃ

前処理大全が業務で役に立った

例えば、

a, 1
b, 2
c, 3     
b, 4
a, 5
a, 6 

a, [1,5,6]
b, [2,4]
c, [3]

という処理をしたかった。
pandasのgroupbyでどうにかなるのか?ってちょっと悩んだが、前処理大全でagg関数でlambdaを使う処理をやったことを思い出した。

agg("カラム名", lambda x: xの計算) の時のxは Seriesオブジェクトになっているのでtolist()でリスト化したら上手くいった。
gist.github.com
なお、SeriesGroupByにapply(list)してもできる模様。(その場合の返り値はDataFrameじゃなくてSeries)

ありがとう前処理大全!




Macの隠しファイル表示/非表示コマンド

以前、日記に以下のコマンドをターミナルに打てば良いと書いた。
tdual.hatenablog.com

defaults write com.apple.finder AppleShowAllFiles TRUE
killAll Finder

しかしもっと簡単なキーボードコマンドがあった。

[command] + [shift] + [.]

で切り替えられる。



TrelloのPower-UpsTwitterに変えた。

Power-Upsは無料プランなら一つのボードに一つ設定できる。
今までは、Githubにしてたのですが、どうも使わないのでTwitterが埋め込めるPower-Upsにした。
f:id:tdualdir:20180507171056p:plain



データドリブンなカナブン

日記20180506

日記じゃ。

Pycon mini Osakaの資料作り

資料を作った。7割くらい出来たけど、資料を作ってるとまたアーキテクチャを変えたり色々と実験したくなるので資料が進まない。
あと、資料にアーキテクチャ図を書こうと思ってTensorboardのグラフを載せようと思ったけどグラフの流れは縦向きなので如何せんスライドに貼りずらい。
Tensorboardのグラフは横向きに出来ないのか?




Tensorflowのデバイスのログ出力

Tensorflowのデバイス(CPU,GPU)のログ出力をするにはSessionで設定すれば良い。

import tensorflow as tf

a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

print(sess.run(c))

出力

2018-05-06 22:58:47.845758: I tensorflow/core/common_runtime/placer.cc:886] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:CPU:0
b: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-05-06 22:58:47.845783: I tensorflow/core/common_runtime/placer.cc:886] b: (Const)/job:localhost/replica:0/task:0/device:CPU:0
a: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-05-06 22:58:47.845808: I tensorflow/core/common_runtime/placer.cc:886] a: (Const)/job:localhost/replica:0/task:0/device:CPU:0

[[22. 28.]
 [49. 64.]]

インタープリタでやるとこれで良いのだがupyter notebook上で実行するとlogは出力されない・・・
あれ?って思ってjupter notebookのログを見るとそっちに出力されてた。
なんとかしてjupyter notebookで表示しようと思ったけど、C++のエラー標準出力は表示されないだと・・・
stackoverflow.com




分散表現という言葉

単語の埋め込みを分散表現(Distributed representation)とも言うが「分散」ってなんだ?って思って調べたけどなんか深そうだった。
一応、one-hotベクトルじゃなくて複数成分で単語を表現出来ているときに分散表現と呼ばれていると言える。
分布仮説との関係、認識の類似性としての表現、word2vecのように計算ができることなど色々な側面があってちゃんとまとめる必要がありそう。

日記20180505

日記じゃ

茨城のひたち海浜公園ネモフィラを見に行った。

ネモフィラっていう青い花Twitterなどで見かけて綺麗だったのと、せっかくのゴルデンウィークだしちょっと小旅行するかってことで「ひたち海浜公園」に行った。
国営ひたち海浜公園 – 海と空と緑がともだち。ひたち海浜公園は、茨城県ひたちなか市にある国営公園です。

最寄駅は「勝田駅」で、行きは品川から「JR特急ときわ」に乗って行って1時間30分くらい。
それにしても普通の運賃と特急券が別にあるシステムは面倒臭いし、ややこしいのでどうにかならんものか。
(日本人でもややこしいんだから海外の観光客なら尚更混乱するでしょうね。)

勝田駅からは専用のバスが出ていて15分かからないくらいでひたち海浜公園に着いた。
暑かったのでTシャツで行ったが、海の近くなので風が結構冷たかった。
入場料は大人400円で、中学生以下は無料という激安だった。

園内は思ったより広くて、たこ焼きやかき氷などの屋台があちこちにあってテーブルもたくさん設置されていてのんびり過ごせる感じだった。
肝心のネモフィラは10分程度歩いたら見えてきた。
小さな丘を登りながらネモフィラを楽しむ形になってた。
f:id:tdualdir:20180506115852j:plainf:id:tdualdir:20180506115931j:plainf:id:tdualdir:20180506115855j:plainf:id:tdualdir:20180506115911j:plainf:id:tdualdir:20180506115917j:plainf:id:tdualdir:20180506115919j:plain
ネモフィラで丘が青くなっているのは神秘的やな。


丘の頂上からは海が見えた。空も雲一つなくて見渡す限り青色で綺麗だった(写真はない。)


ネモフィラを見た後は厚切りポテトチップスを屋台で買って座って食べて、帰った。
帰りは特急に乗らなかったが、勝田から日暮里まで2時間以上かかった。眠かった。
久しぶりに歩いたので疲れたが、まあ、ゴールデンウィークっぽいことをしたのでよかった。ネモフィラも綺麗だったし。
今、wikiで調べたけどネモフィラって英語では"baby blue eyes"ともいうのか。なるほど。



character level cnnで文書の最大長を変えて実験

文書の最大長が長すぎると埋め込む前の次元が大きくなってしまって処理に時間がかかるので1000文字で切ってた。
もちろん1000文字以上の文書だと途中で切られているがそれでも十分に極性を表現できていると考える。(原論文でも1014とかで切ってた。)
ただ、実験として最大長を2000文字に変えてみた。
まだ途中だけど情報が多い分やはり収束は速い。
f:id:tdualdir:20180506123426p:plain
f:id:tdualdir:20180506123437p:plain
青い方が2000文字
赤い方が1000文字


Instant Hotspotを知らないうちに使ってた

私のiPadwifiしか使えないので外で使う時は毎回iPhoneテザリングで通信してたんだけどあることに気付いた。
iPhoneのインターネット共有をoffにしていてもiPadからwifiを見つけて接続できる・・・
なぜなんだって思って調べたらiOS8から使える「Instant Hotspot」っていう機能だった。
両端末でアップルアカウントにログインしていて、Bluetoothがonになっていれば、wifiで繋ごうとした時に自動でインターネット共有をonにしてくれる。
最近、iPadを再び使い出したので当たり前だと思って享受してたけど、よく考えたらめっちゃ便利な機能やな。

日記20180504

日記じゃ

Character level CNNでアーキテクチャを変える

原論文([1509.01626] Character-level Convolutional Networks for Text Classification)のアーキテクチャではどうも上手く学習できないのでアーキテクチャを全然違うものに変えた。
低次元空間に埋め込みした後に複数のカーネルサイズを通して、最後に結合して特徴を出力するやつ。

アーキテクチャ図(tensorboardのグラフ)

tensorflowで実装したのでtensorboardのグラフで表示しとくと

アーキテクチャ図としては原論文
f:id:tdualdir:20180505000102p:plain
を以下のアーキテクチャに変更じゃ
f:id:tdualdir:20180505000156p:plain

VocabularyProcessor

文字を数値化するのはtensorflow.contrib.learnのpreprocessing.VocabularyProcessorを使ったので日本語も問題なくできる。
注意点としてはこれは元々は単語の処理をする為のものなので最大長を4とかに設定すると

from tensorflow.contrib.learn import preprocessing
vocab_processor = preprocessing.VocabularyProcessor(4)
docs = ["a aa aaa aaaa", "aaa a"]
print(list(vocab_processor.fit_transform(docs)))

出力

[array([1, 2, 3, 4]), array([3, 1, 0, 0])]

なので単語の間にスペースを入れて文字を整数にマッピングするようにした。
gist.github.com
あとcontrib.learn.preprocessingは古いのでtf.dataを使えと言う警告が出るがtf.dataの使い方がわからない。
と言うかドキュメント読んでも同じことが出来るようには思えない・・・ うーむ・・・

方針

学習も上手くいってるのでこのアーキテクチャで色々実験する。


回線のスピードチェックアプリを入れて見た。

なんか回線が遅い気がしたのでせっかくなのでアプリを入れて確認して見た。

speedcheck

これ

Speedcheck Internet Speed Test

Speedcheck Internet Speed Test

  • Frederik Lipfert
  • ユーティリティ
  • 無料

チェックした上下の速度だけでなくSSIDや場所も履歴として残るので良い。
色んな場所のFree wifiの速度をチェックしたくなる。
結果をipadiphoneで同期できるらしいのでアカウントも作った。
ただ広告がウザすぎるので360円くらい払って広告出さないようにした。
また、ipadの方のアプリで支払ったのにiphoneの方でログインしたのにまだ広告出てるのはなんかちょっと微妙やな。
同じアカウントなら一つ買ったら別の端末でも広告出さないようにしてよ。iphoneの方は広告出したままにした。。。

結果

wifiで二種類繋げられるんだけど、チェックしたらなぜか知らないけど遅い方に接続してることが発覚した。
だから遅く感じたのか・・・
速い方に変えた。

速度

  • 遅い方

くだり 21.36Mbps
のぼり 5.63Mbps

  • 早い方

くだり 59.24Mbps
のぼり 4.69Mbps

どっちも普通に速いやんけ。ってかのぼりは同じあまり変わらないのね。



microbit

twitterで見かけたのでちょっと調べた。

http://microbit.org/ja/guide/
教育用のマイコンBBCが作っていてイギリスの小学生とかが使ってるらしい。
マイクロusbでパソコンに繋いでプログラミングできるみたいだ。pythonでもコーディング可。
ジャイロ、温度センサー、無線通信、bluetoothと機能は一通り揃ってるみたいだ。



2、3時間のお昼寝

例のごとくMONSTER ENERGYを昨日二本飲んだので夜は3時間くらいしか眠れなかったので2、3時間お昼寝した。
昼寝すると午後からの作業が捗るな。



ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。

3枚で3000円ちょっとだった。
なんてないTシャツなので写真は割愛



Trelloのipadアプリでチケットにチケットを添付できない。

Trelloのipadアプリでチケットにチケットを添付しようと思ったらなんか選択肢に出て来なかった。macアプリではできるのに・・・


今日の思い付き


ブログのネタとしてはいいかもしれないけどあまり実用的ではないかも・・・


pycon miniのスライド全然できてないじゃん・・・

やばい・・・

日記20180503

日記じゃ


今日はずっとcharacter level CNNの実装してた。

完全に論文通りなのになんか上手く学習されないのでどこかバグがあるんだろうか。
tensorboardでsparsityを確認したらいきなりほぼ1になっていたのでなんかおかしい・・・
f:id:tdualdir:20180504023309p:plain


久しぶりにAWSGPUインスタンスを起動した。

Char level CNNの学習を待って居られないので時間をお金で買うことにした。
だが、Amazon reviewのデータセットを送ったらすぐにディスクが一杯になった。
前にSSDの学習のための画像データセットを保存していて、それが圧迫してたので消した。



『前処理大全』の3-3を読んだ。

極値、代表値の算出の話。

平均値

「平均値」の他の代表値とは違う利点として計算計算コストが低いから良いって言うのは、言われてみそうだがあまり意識したことなかった。

SQLの関数

SQLのMEDIAN関数やPERCENTILE_CONT関数を使ったことないな・・・
まあ、SQLでそもそもデータ分析をしたことない。手元に持ってきてPythonでやってる。そこまで巨大なデータを扱わないからか?

python

agg関数はlambdaが使えるのか。
あとは、パーセンタイルの計算としてnumpy.percentileがある。
gist.github.com


バージョン1.15からnumpy.quantileも使える。(今は1.14)
percentileは引数が1~100の整数だが、quantileは0~1の少数で指定できるようだ。
numpy.quantile — NumPy v1.15.dev0 Manual



ChromeのdevToolを開くショートカット

macOSではcommand+option+I


歌詞取得スクリプト

「歌詞タイム」ってサイトで歌詞をちょっとコピーしようとしたら出来なかったので取得スクリプトを作った。
DevToolを開いても取得できたけど
タグなどが挟まっていたので「もうスクリプト作るか・・・」ってなった。
最初、HTML要素を見て歌詞が見当たらなかったので歌詞は別APIで取得してるのかと思ったけどただエンコードしてjavascriptで持ってるだけだった。
なのでHTMLをテキストで取得してデコードした後に正規表現で対象箇所を抽出するだけで歌詞を取得できた。(
HTTP HEADERなどを駆使してもっとマシな作りに出来ないか・・・)
なんかの法律に抵触すると面倒臭いのでスクリプトは公開しないようにします。



コンソールに求人を埋め込むAbemaTV

ワロタwwww

ちなみに要素はアイコンが。

日記20180502

まとめ

昨日眠れなかったので一日中頭があまり働かない感じだった。

昨日飲んだMONSTER ENERGYのせいだと思う。ああ言うのを飲むとよく眠れなくなる。(が集中力はやはり上がるのでつい飲んでしまう。)



Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。

まだ、
- 母集団分布の推定 = 分布の決定(正規分布や二項分布など) + パラメータの推定
- 標本の統計量=母集団分布のパラメータの推定値
みたいな統計学の基礎の話

「母数」は分布のパラメータのことでサンプルサイズじゃないってことを強調して書いてた。
個人的にはもう「母数」って言葉も使うのやめてパラメータで良いんじゃないかと思う。



『前処理大全』3章「集約」の3−1まで読んだ。

groupbyした後に
aggで集計処理をまとめてできる。
gist.github.com


"May the agg be with groupby(aggがgroupbyとともにあらんことを)"



はてなにJupyter notebookを貼る方法

gistにipynbファイルをD&Dで追加して、そのリンクを貼るだけだった。
気をつけるのはtextareaに入れるとちゃんと貼れないのでこの状態の時にDropする。
f:id:tdualdir:20180502172337p:plain


アイロン買った。

最近買ったシャツのシワが目立つので、人生初のアイロンを買った。
f:id:tdualdir:20180502232016j:plain
t-falの変な形のスチームアイロン。アイロン台を買いたくなかったのでハンガーとかに掛けたままシワが伸ばせるやつにした。
まだ使ってない。


畳み込み層の処理は相互相関と言う記事をポストした。

tdual.hatenablog.com
割と反響があったみたい。
Toeplitz matrixの解説やnp.correlationでcnnを実装する話もいつか書きたい。


RAKERUに行った

オムライス専門のチェーン店。初めて行った。吉祥寺のヨドバシカメラ横のガストの下。
オムライスだけでなくパンも美味かった。後、店内がカラフルで子供受けしそうな内装だった。



明日の予定

pycon miniのスライドをいい加減完成させたい。

深層学習の畳み込み層の処理は「畳み込み」じゃなかった件

畳み込み層の処理は厳密には畳み込みではなかったのか・・・

畳み込み層

畳み込み層の処理

畳み込み層ではインプットの画像データに対して重みを掛けてアウトプットします。この重みをカーネルと呼びます。
実際の計算は図1のようになっています。

f:id:tdualdir:20180501211957p:plain
図1. 畳み込み層の処理
インプットデータの一部にカーネルを適応してその適応された部分で行列の内積を取っています。式でかくと次のようになります。
アウトプットされた行列のi,j成分を O_{i,j},
インプットされた行列のi,j成分を I_{i,j},
カーネルのi,j成分を K_{i,j}とすると
 { \displaystyle O_{i,j}= \sum_m\sum_n I_{i+m, j+n}K_{m,n} \tag{1} }


数学で言うところの畳み込み

畳み込みの定義

2次元の畳み込みは次のように定義されています。
 { \displaystyle (f*g)(a,b)= \int\int g(a-x,b-y)f(x,y)dxdy \tag{2} }
離散値の場合は行列で表現できて
 { \displaystyle (f*g)_{i,j} = \sum_m\sum_n g_{i-m, j-n}f_{m,n} \tag{3} }
となります。

畳み込み層の処理と比較

(1)と(3)は非常に似てますが、(1)では {i+m, j+n}、(3)では {i-m, j-n}となっていて、添え字が違うことに気付きます。
実は(1)の処理は相互相関(cross-correlation)と呼ばれていて畳み込みとは別物です。

相互相関

相互相関と畳み込みの相違点

まずは相互相関と畳み込みの違いを見ます。
以後、簡単のために1次元実数値連続関数を扱います。
1次元実数値連続関数の畳み込み
 { \displaystyle (f*g)(a) = \int_{-\infty}^{\infty} g(a-x)f(x)dx \tag{4} }

1次元実数値連続関数の相互相関
 { \displaystyle (f \star g)(a) = \int_{-\infty}^{\infty} g(a+x)f(x)dx \tag{5} }
((5)の関数が実数値でない場合は f(x)の代わりに複素共役 f^{*}(x)を取る必要がある。)

交換律

畳み込みの重要な性質の一つとして交換律があります。
ここで x' = a-xとすると
\begin{align}
(f*g)(a) &= \int_{-\infty}^{\infty} g(a-x)f(x)dx\\
&= \int_{\infty}^{-\infty} g(x')f(a-x')d(a-x')\\
&= \int_{\infty}^{-\infty} g(x')f(a-x')d(-x')\\
&=\int_{-\infty}^{\infty} f(a-x')g(x')dx' = (g*f)(a)
\end{align}
つまり、
 f*g = g*f と言う交換律が成り立つことがわかります。

しかし、(5)の相互相関の形では交換律は満たしません。

フーリエ変換

畳み込みのフーリエ変換がそれぞれの関数のフーリエ変換の積になってるは有名な定理で、工学などでもよく応用されます。
\begin{align}
F[f*g] &= \int_{-\infty}^{\infty}\left(\int_{-\infty}^{\infty} g(a-x)f(x)dx\right)e^{-ika}da\\
&= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} g(a')f(x)e^{-ik(a'+x)}dxda'\\
&=\int_{-\infty}^{\infty}f(x)e^{-ikx}dx \int_{-\infty}^{\infty}f(a')e^{-ika'}da' \\
&= F[f] F[g]
\end{align}
式変形の二行目では a - x= a'とした。
これを相互相関でやると
\begin{align}
F[f\star g] &= \int_{-\infty}^{\infty}\left(\int_{-\infty}^{\infty} g(a+x)f(x)dx\right)e^{-ika}da\\
&= \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} g(a')f(x)e^{-ik(a'-x)}dxda'\\
&=\int_{-\infty}^{\infty}f(x)e^{+ikx}dx \int_{-\infty}^{\infty}f(a')e^{-ika'}da' \\
&= F^{*}[f] F[g]
\end{align}
ここでは a + x= a'とした。
フーリエ変換複素共役を取ったものとフーリエ変換に積になっています。(クロススペクトルと言う。)

非常に似た形をしてますが性質の相違点はいくつかあるようです。

相互相関の意味

相互相関の意味ですが、座標aでの二つの関数の類似度を表しています。似てるほど相互相関は大きくなります。
例えば、ノイズに混ざった二つの信号があった場合に相互相関を使ってそれが同じ信号かどうか判断できます。
(参考: https://qiita.com/inoory/items/3ea2d447f6f1e8c40ffa
また、相互相関の性質を利用してフィルターなのども出来ます。

import numpy as np
import matplotlib.pyplot as plt

sig = np.repeat([0., 1., 1., 0., 1., 0., 0., 1.], 128)
sig_noise = sig + np.random.randn(len(sig))
corr = np.correlate(sig_noise, np.ones(128), mode='same') / 128


clock = np.arange(64, len(sig), 128)
fig, (ax_orig, ax_noise, ax_corr) = plt.subplots(3, 1, sharex=True)

ax_orig.plot(sig)
ax_orig.plot(clock, sig[clock], 'ro')
ax_orig.set_title('Original signal')

ax_noise.plot(sig_noise)
ax_noise.set_title('Signal with noise')

ax_corr.plot(corr)
ax_corr.plot(clock, corr[clock], 'ro')
ax_corr.axhline(0.5, ls=':')
ax_corr.set_title('Cross-correlated with rectangular pulse')

ax_orig.margins(0, 0.1)
fig.tight_layout()
fig.show()

出力

f:id:tdualdir:20180502111957p:plain
図3.相互相関を使ったフィルター






畳み込み層に「畳み込み」を適応するとどうなるのか?

畳み込み層に「畳み込み」を適応するとどうなるのか?
結論から言うと何も問題ないです。ニューラルネットワークの層で相互相関と畳み込みの相違点は関係ありません。
ただカーネルの上下左右を反転して学習してるだけです。(このカーネルをフリップカーネルと言います。)
図2の様にインプットのラベルを−1から始めてカーネルを反転すると畳み込みの式と一致してることがわかると思います。

f:id:tdualdir:20180501235156p:plain
図2. 「畳み込み」を適応した畳み込み層の処理


 { \displaystyle O_{i,j} = (f*g)_{i,j} = \sum_m\sum_n I_{i-m, j-n}K_{m,n} \tag{6} }

終わりに

な ぜ Convolutional と 名 付 け た し。
まあ、ただの名前だし、数学の用語が誤用されることはよくあることなのであまり気にしても仕方ないね。

notebookはここに置いときますね。
github.com


ツイッターやっているのでフォローお願いします!
↓今すぐフォローすべきキラキラ アカウント

じゃあの。

参考文献