日記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-UpsをTwitterに変えた。
Power-Upsは無料プランなら一つのボードに一つ設定できる。
今までは、Githubにしてたのですが、どうも使わないのでTwitterが埋め込めるPower-Upsにした。
データドリブンなカナブン
衝動的に作ってしまった・・・ pic.twitter.com/aQv0RWeSa9
— tdual@情報幾何 (@tdualdir) 2018年5月7日
日記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分程度歩いたら見えてきた。
小さな丘を登りながらネモフィラを楽しむ形になってた。
ネモフィラで丘が青くなっているのは神秘的やな。
丘の頂上からは海が見えた。空も雲一つなくて見渡す限り青色で綺麗だった(写真はない。)
ネモフィラを見た後は厚切りポテトチップスを屋台で買って座って食べて、帰った。
帰りは特急に乗らなかったが、勝田から日暮里まで2時間以上かかった。眠かった。
久しぶりに歩いたので疲れたが、まあ、ゴールデンウィークっぽいことをしたのでよかった。ネモフィラも綺麗だったし。
今、wikiで調べたけどネモフィラって英語では"baby blue eyes"ともいうのか。なるほど。
character level cnnで文書の最大長を変えて実験
文書の最大長が長すぎると埋め込む前の次元が大きくなってしまって処理に時間がかかるので1000文字で切ってた。
もちろん1000文字以上の文書だと途中で切られているがそれでも十分に極性を表現できていると考える。(原論文でも1014とかで切ってた。)
ただ、実験として最大長を2000文字に変えてみた。
まだ途中だけど情報が多い分やはり収束は速い。
青い方が2000文字
赤い方が1000文字
Instant Hotspotを知らないうちに使ってた
私のiPadはwifiしか使えないので外で使う時は毎回iPhoneのテザリングで通信してたんだけどあることに気付いた。
iPhoneのインターネット共有をoffにしていてもiPadからwifiを見つけて接続できる・・・
なぜなんだって思って調べたらiOS8から使える「Instant Hotspot」っていう機能だった。
両端末でアップルアカウントにログインしていて、Bluetoothがonになっていれば、wifiで繋ごうとした時に自動でインターネット共有をonにしてくれる。
最近、iPadを再び使い出したので当たり前だと思って享受してたけど、よく考えたらめっちゃ便利な機能やな。
日記20180504
日記じゃ
- Character level CNNでアーキテクチャを変える
- 回線のスピードチェックアプリを入れて見た。
- microbit
- 2、3時間のお昼寝
- ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。
- Trelloのipadアプリでチケットにチケットを添付できない。
- 今日の思い付き
- pycon miniのスライド全然できてないじゃん・・・
Character level CNNでアーキテクチャを変える
原論文([1509.01626] Character-level Convolutional Networks for Text Classification)のアーキテクチャではどうも上手く学習できないのでアーキテクチャを全然違うものに変えた。
低次元空間に埋め込みした後に複数のカーネルサイズを通して、最後に結合して特徴を出力するやつ。
参考
[1702.08568] eXpose: A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys
[1408.5882v2] Convolutional Neural Networks for Sentence Classification
character-level CNNでクリスマスを生き抜く - Qiita
CNNを利用したセンチメント分析 - にほんごのれんしゅう
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
これ
チェックした上下の速度だけでなくSSIDや場所も履歴として残るので良い。
色んな場所のFree wifiの速度をチェックしたくなる。
結果をipadやiphoneで同期できるらしいのでアカウントも作った。
ただ広告がウザすぎるので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シャツなので写真は割愛
今日の思い付き
あ、プラグラミング言語の特定とかなら出来そうか。
— tdual@情報幾何 (@tdualdir) 2018年5月4日
ブログのネタとしてはいいかもしれないけどあまり実用的ではないかも・・・
pycon miniのスライド全然できてないじゃん・・・
やばい・・・
日記20180503
日記じゃ
- 今日はずっとcharacter level CNNの実装してた。
- 久しぶりにAWSのGPUインスタンスを起動した。
- 『前処理大全』の3-3を読んだ。
- ChromeのdevToolを開くショートカット
- 歌詞取得スクリプト
- コンソールに求人を埋め込むAbemaTV
今日はずっとcharacter level CNNの実装してた。
完全に論文通りなのになんか上手く学習されないのでどこかバグがあるんだろうか。
tensorboardでsparsityを確認したらいきなりほぼ1になっていたのでなんかおかしい・・・
久しぶりにAWSのGPUインスタンスを起動した。
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
歌詞取得スクリプト
「歌詞タイム」ってサイトで歌詞をちょっとコピーしようとしたら出来なかったので取得スクリプトを作った。
DevToolを開いても取得できたけど
タグなどが挟まっていたので「もうスクリプト作るか・・・」ってなった。
最初、HTML要素を見て歌詞が見当たらなかったので歌詞は別APIで取得してるのかと思ったけどただエンコードしてjavascriptで持ってるだけだった。
なのでHTMLをテキストで取得してデコードした後に正規表現で対象箇所を抽出するだけで歌詞を取得できた。(
HTTP HEADERなどを駆使してもっとマシな作りに出来ないか・・・)
なんかの法律に抵触すると面倒臭いのでスクリプトは公開しないようにします。
コンソールに求人を埋め込むAbemaTV
AbemaTVのページでコンソールを開くと求人が出てくるの、割と面白くないですか? pic.twitter.com/BjLqlUnILm
— keymoon (@kymn_) 2018年5月3日
ワロタwwww
ちなみに要素はアイコンが。
要素はもっとワロタ pic.twitter.com/JcvNIH9OPJ
— tdual@情報幾何 (@tdualdir) 2018年5月3日
日記20180502
まとめ
- 昨日眠れなかったので一日中頭があまり働かない感じだった。
- 『Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。
- 『前処理大全』3章「集約」の3−1まで読んだ。
- はてなにJupyter notebookを貼る方法
- アイロン買った。
- 畳み込み層の処理は相互相関と言う記事をポストした。
- RAKERUに行った
- 明日の予定
昨日眠れなかったので一日中頭があまり働かない感じだった。
昨日飲んだ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する。
アイロン買った。
最近買ったシャツのシワが目立つので、人生初のアイロンを買った。
t-falの変な形のスチームアイロン。アイロン台を買いたくなかったのでハンガーとかに掛けたままシワが伸ばせるやつにした。
まだ使ってない。
畳み込み層の処理は相互相関と言う記事をポストした。
tdual.hatenablog.com
割と反響があったみたい。
Toeplitz matrixの解説やnp.correlationでcnnを実装する話もいつか書きたい。
RAKERUに行った
オムライス専門のチェーン店。初めて行った。吉祥寺のヨドバシカメラ横のガストの下。
オムライスだけでなくパンも美味かった。後、店内がカラフルで子供受けしそうな内装だった。
明日の予定
pycon miniのスライドをいい加減完成させたい。
深層学習の畳み込み層の処理は「畳み込み」じゃなかった件
畳み込み層の処理は厳密には畳み込みではなかったのか・・・
畳み込み層
数学で言うところの畳み込み
畳み込みの定義
2次元の畳み込みは次のように定義されています。
離散値の場合は行列で表現できて
となります。
畳み込み層の処理と比較
(1)と(3)は非常に似てますが、(1)では、(3)ではとなっていて、添え字が違うことに気付きます。
実は(1)の処理は相互相関(cross-correlation)と呼ばれていて畳み込みとは別物です。
相互相関
相互相関と畳み込みの相違点
まずは相互相関と畳み込みの違いを見ます。
以後、簡単のために1次元実数値連続関数を扱います。
1次元実数値連続関数の畳み込み
1次元実数値連続関数の相互相関
((5)の関数が実数値でない場合はの代わりに複素共役を取る必要がある。)
交換律
畳み込みの重要な性質の一つとして交換律があります。
ここでとすると
\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}
つまり、
と言う交換律が成り立つことがわかります。
しかし、(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}
式変形の二行目ではとした。
これを相互相関でやると
\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での二つの関数の類似度を表しています。似てるほど相互相関は大きくなります。
例えば、ノイズに混ざった二つの信号があった場合に相互相関を使ってそれが同じ信号かどうか判断できます。
(参考: 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()
出力
畳み込み層に「畳み込み」を適応するとどうなるのか?
畳み込み層に「畳み込み」を適応するとどうなるのか?
結論から言うと何も問題ないです。ニューラルネットワークの層で相互相関と畳み込みの相違点は関係ありません。
ただカーネルの上下左右を反転して学習してるだけです。(このカーネルをフリップカーネルと言います。)
図2の様にインプットのラベルを−1から始めてカーネルを反転すると畳み込みの式と一致してることがわかると思います。
終わりに
な ぜ Convolutional と 名 付 け た し。
まあ、ただの名前だし、数学の用語が誤用されることはよくあることなのであまり気にしても仕方ないね。
notebookはここに置いときますね。
github.com
ツイッターやっているのでフォローお願いします!
↓今すぐフォローすべきキラキラ アカウント
じゃあの。