【chainer】F.padとF.pad_sequenceの使い方

chainerでpaddingするときの方法、備忘録。

パディングするベクトルを用意。

>>> from chainer import functions as F
>>> import numpy as np
>>> a = np.array([[1,2,3]], 'f')
>>> b = np.array([[1,2,3,4]], 'f')
>>> a
array([[ 1.,  2.,  3.]], dtype=float32)
>>> b
array([[ 1.,  2.,  3.,  4.]], dtype=float32)
F.pad

使い方は分かるけど使い道がよくわからない。
画像系とかだと多用するのかな?

'''
F.pad(
    パディングしたいベクトル,
    パディングサイズ,
    ’constant’, 
    constant_values=パディングに使う数字
)
'''
>>> F.pad(a,5,'constant').data
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> F.pad(a,5,'constant',constant_values=-1).data
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.,  1.,  2.,  3., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]], dtype=float32)
F.pad_sequence

僕がよく使ってよく忘れるのはF.pad_sequenceのほう。

'''
F.pad_sequence(
    パディングしたいベクトルのリスト,
    パディングサイズ,
    パディングに使う数字
)
'''
>>> F.pad_sequence(a,5).data
array([[ 1.,  2.,  3.,  0.,  0.]], dtype=float32)
>>> F.pad_sequence(b,5).data
array([[ 1.,  2.,  3.,  4.,  0.]], dtype=float32)

a,bをまとめてパディングしたかったら、次元を一つ落としたリストを食わせる。

>>> F.pad_sequence([a[0],b[0]],5).data
array([[ 1.,  2.,  3.,  0.,  0.],
       [ 1.,  2.,  3.,  4.,  0.]], dtype=float32)
>>> F.pad_sequence([a[0],b[0]],5, -1).data
array([[ 1.,  2.,  3., -1., -1.],
       [ 1.,  2.,  3.,  4., -1.]], dtype=float32)

pythonで重複の無いリスト

例えばテキストデータを舐めて単語の種類数を求めたいときとか、重複の無いリストが必要になる。
今まで、何も考えずに以下のように書いてた。

良くない例

>>> a = [1,2,2,1,3,4,1,2,3]
>>> b = []
>>> for c in a: # aの中身をcで回す
...   if c not in b: # cがbに入ってなければ追加
...     b.append(c)
...
>>> b # 重複の無いリスト
[1, 2, 3, 4]

setを使う

ぶっちゃけsetを使った方がコードが短かくて済む。そして速い。
ただし、リストと違って順序は保存されないので注意。

>>> a # aの中身を確認
[1, 2, 2, 1, 3, 4, 1, 2, 3]
>>> b = set(a)
>>> b # 上と同じ
{1, 2, 3, 4}

しかし、この書き方をするなら一度aにすべての要素を突っ込まないと行けない。
最初にあげた単語を舐める例だと、テキストデータに出現しうるすべての単語を、一度aに突っ込まないといけない。
メモリ的にしんどい時は以下のように書くのが良い。
遅くなるけどリストに比べたらまだ速い。

>>> a
[1, 2, 2, 1, 3, 4, 1, 2, 3]
>>> b = set() # 空のsetを用意
>>> for c in a:
...   b.add(c) # 重複しないように追加してくれる
...
>>> b
{1, 2, 3, 4}

速度比較

比較用コード

>>> # listで回す
>>> def testList(arr):
...   st = time.time()
...   neoarr = []
...   for a in arr:
...     if a not in neoarr:
...       neoarr.append(a)
...   print(time.time()-st)
...   return neoarr
...
>>> # listのset
>>> def testSet1(arr):
...   st = time.time()
...   neoarr = set(arr)
...   print(time.time()-st)
...   return neoarr
...
>>> # listを回してsetにadd
>>> def testSet2(arr):
...   st = time.time()
...   neoarr = set()
...   for a in arr:
...     neoarr.add(a)
...   print(time.time()-st)
...   return neoarr

0から9までの整数をランダムに100万生成して、重複の無いリストを求める。

# listで回す
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.14845705032348633
[3, 5, 8, 1, 4, 6, 9, 7, 0, 2]
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.13007402420043945
[8, 1, 3, 0, 4, 5, 9, 2, 6, 7]
>>> testList([random.randint(0,9) for _ in range(1000000)])
0.1324453353881836
[0, 4, 5, 9, 7, 3, 6, 2, 8, 1]

# listのset
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015883684158325195
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015897035598754883
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet1([random.randint(0,9) for _ in range(1000000)])
0.015883684158325195
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

# listを回してsetにadd
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09662246704101562
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09584259986877441
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> testSet2([random.randint(0,9) for _ in range(1000000)])
0.09663128852844238
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

ただ要素の種類を取り出したいだけならset使おう。

2018/01/08-01/14

今週は寒かった。
研究室も徐々に人が戻ってきて、通常運転になってきた。
といっても、やっぱり寒いからみんな外に出たくないみたいで、秋ごろに比べるとかなり人数が少ない気がする。
僕も僕で部屋にこもりがちで、気分転換したいときに作業環境替えるために研究室に行く、という感じ。

知り合いが友人同士集まって24時間でゲーム作るぜ!みたいなのやってて、その配信を見ながらエネルギーを分けてもらってた。

僕も三年前くらいまでは一日一曲作るぜ!!みたいなのやる元気があったんだけど、勉強が楽しくなってからはどんどんそういうのに充てるエネルギーがなくなっていってる。
なので、配信を見てとても元気をもらえたし、たまには僕もクリエイティブなことやろって気持ちになった。


イオンのカットキャベツが美味しくなかった。
多分不作とかのあおりを受けてるんだと思う。なんか、紙みたいな食感で微妙。
ふわふわの千切りキャベツが食べたい。


研究用プログラムの高速化とか、アルゴリズムの見直しとか、確率計算ガチガチにやるとか、わりと工学の人っぽいことをやっていた。
前にも書いたけど、さすがに今更文系出身なんで、みたいな言い訳できないので頑張るしかない。
ただ、高速化がうまくいかないとか、なんか精度が微妙とか、辛い要素もたくさんある。

今まではとりあえず勉強だってことで、思いついたものを色々プログラムに落とし込んできてたんだけど、そろそろそれじゃダメなんだなって気づいてきた。
やってから考えるじゃなくて、しっかり最後までモデルを練って考えつくしたうえで書き始めないと効率が悪い。
今年はしっかり段取り考えながら研究を進めていけるようになりたい。

進学した時に、せめてこの学会には論文を出したいなあと思ってた学会に出せなかった。
思うようにならないよなあ、ってつらい気持ちになる年始。
これも、ちゃんといつまでに着地させるって考えながらやらなかったのが悪い。学んだ。

勉強回りで自分のよわっちさに心が参ってたけど、来週は切り替えて頭動かしていこう。
進学先を決めないといけないんだけど、別の大学に入ると入学金が新たに発生するのがネックだなあ、と悩んでいる。
一応今の研究室に残ることも出来るんだけど、来年以降新入生が途絶えるので、代謝の悪いグループにはいたくない。

来週中にいくつか相談のメールを出さないとなあ。
(進学先考えるのも、とても胃が痛い)


水曜日くらいから12時に寝て8時にアラームが鳴って8時半に起きる生活を始めた。
まだちょっとリズムが出来上がってないけど、12時ごろにはちゃんと眠くなってるのでいい習慣だと思う。続けていこう。

午後にちゃんと頭を動かせるように朝ごはんを食べるようにしてみた。
夜にご飯を多めに炊いておいて、朝にお茶漬け食べてる。
日常的に朝ごはんを食べるの、多分中学3年生以来なので慣れるのに時間がかかりそう。
高校時代に朝ごはん食べてたか覚えてないんだけど、学部時代は絶対に食べてないので、少なくとも五年ぶりくらい。
昼食は午後に眠くならないように少なめにしてる。
せめて生活リズムくらいは健康的なものでありたいよね。


研究ではpythonを書いてるんだけど、setが優秀すぎてちょっと感動した。
もはやjavaを書けない体になってる。
でも、やっぱり動的計画法とかでpythonの遅さがにじみ出ているので、juliaに乗り換えるのもありだなあというお気持ち。


おうちカフェを順調に楽しんでいる。
ちゃんと一年間続けられたら記事にしようと思う。
記事にしようといいつつ、記事にできてないことが多い。

2018/01/01-01/07

新年あけましてこんにちは。
今年も週間記録を付けていきましょう。

例年通り年末は福島にある父の実家へ行ってた。
福島めっちゃ寒くて辛かった。家も古いので、しんしんと冷えるってこういうことなんだなって感じ。
おいしい刺身が食べれたのでありがたかった。

移動中、昨年中に投稿するとか言って結局いまだにしてないbot作る記事を書いてた。
ある程度書けたので適当に投稿して、あとからちょこちょこ直していくスタイルでもいいと思う。


年末年始の暇つぶしで買ったルービックキューブ、全面の揃え方を覚えてしまったので面白味がなくなってきた。
手遊びとしては優秀なので、壊れるまではカチカチ遊んでてもいいかなという感じ。


実家で録画されてたNHKのAIの特番を見た。
チョムスキー先生が出ててすごく意外だった。

「蜂の行動データを集めて、動きを予測するのは科学じゃない」
っていうコメントをしていて、この人の科学感はやっぱり好きだなと思った。
僕の学部時代の先生もチョムスキアンなので、同じようなことを言っていたし、それに感化されてこの道に進んだので身の引き締まる思いがした。

でも、改めて工学の分野に身を置いてみると、こういう意見と対立する人たちも多いんだろうなと感じる。
いろんな意見が渦巻いている中で、自分の意思を貫くのも大切だよなと再認識する。

チョムスキー先生の意見にだって、そのすべてに同意しているわけじゃないし、自分は自分で一人のサイエンティストになれればいいんだと思う。
未来を考える一年にしたい。


3日に奈良に戻ってきた。
奈良は奈良でまた違った寒さがある。部屋にいてエアコン着けてても足元が冷えて辛い。
朝はなんかびみょーーーに粉雪が舞っててつらい。

新年の自炊一発目は鍋をすると心に決めていたので、牡蠣鍋とアンコウ鍋を作った。
めっちゃおいしかった。
鍋すると次の日のお昼に雑炊ができるので、週末にやるのがいいかもしれない。

寒さなのか魚のせいなのか分からないけど、木曜からの3日間くらいめちゃくちゃ胃が痛かった。
ストレスかもしれないけどね。あんなに胃がきりきりしたのは初めてなのでびっくりした。
それとは別におなかが冷えて痛いので腹巻を買ってきた。とても快適。


年末に受けたTOEICの結果が返ってきてた。
初めてリスニングを本気で対策して挑んだら、リスニングの点数だけで100点くらい上がってて笑った。
いままでどんだけ適当に受けてたんだよってかんじ。
新年早々語学へのモチベーションが上がったので、引き続き平日は中国語と英語の勉強を夜にしようとおもう。
中国語は春に中検があるらしいので、それを目指してもいいと思う。


イオンへの買い出しルートに飽きたので、ちょっとだけ遠回りな道を選んでみた。
行き詰ってるときとかは、ちょっと長めに風に当たるのがいいかもしれない。


指導してくれてる先生とミーティングした。
知識差を埋めるのにエネルギーを使ってしまって、こちらから何も提案できないのが悔しいなと思った。
大体次の日くらいになって、ああ、こういう提案をすればよかったなあって思いつく。
まだまだ修行が足りない。


ポプテピピックを見た。
めっちゃ笑った。好き。


1週間が重かったけど、なんとか年始スタートできた。
頑張っていきましょう。

2018年頑張ること

去年も書いたし、一年で頑張ることを宣言します。

まず昨年の目標と達成を振り返ります。

2017年頑張ろうとしてたこと

1. いろいろなことをブログに書く(たいへんよくできました)

週間記録をつけるようにした。大変よくできました。
頭の整理がつくのでオススメです、週間記録。

2. 論文読む(がんばりました)

これは院生になったので当たり前のように読むようになりました。
ただ、レビューをブログに書くっていうのは達成できなかった。
研究ノートのちょこっとまとめて終わりってことが多い。別にブログに書く必要もないかなとも思ってる。

3. 規則正しい生活(がんばりましょう)

2時就寝10時起床の8時間睡眠です。
睡眠時間は確保できているけど、もう少し早めに寝るようにしたかった。
午前中にエンジンがかからないのは雑魚だってわかったので2018は頑張る。

4. 運動したい(よくできました)

ほぼ毎週、研究室の人たちと野球ができた。これは非常にいい習慣だった。
2018もやるかわからないけど、やらないとしてもこれに変わるランニングとかはやりたい。

2018年に頑張ること

研究を頑張るのは大前提なので入れない。

1. つもり貯金をする(お部屋カフェ)

カフェとか、無駄にお金を使うことが多い2017だったので、お部屋カフェを推進して行きたい。
お部屋で音楽かけて、コーヒーとか甘いもの入れて、100円貯金するってのをしてみたい。

2. 家計簿をつける

一人暮らしして、奨学金とバイト代で生きてるんだけど、出費を気にしなさすぎた。
今年は一週間のルーチンとして家計簿をエクセルとかでつけていきたい。
さすがに出どころ行きどころ不明のお金が多すぎる。大人なので自分を律していきたい。

3. 規則正しい生活

2017、後半はほとんど鬱っぽくなってたのでできてなかった。
やっぱり朝起きて夜寝る生活を心がける。
ゲームをすることで精神衛生が保たれているんだけど、これを夜にやるのがよくない。
18時とかには研究を切り上げて、そこから3時間くらい堂々とゲームして0時には寝るようにしたい。

研究は1日9時間まで。って感じで、燃え尽きないように体力管理もしないといけないと感じた。
これについては修士を卒業したタイミングでまとめようと思う。

4. 運動を続ける

野球は最高だった。肩こりもほとんどなかったし。
引き続き野球、あるいは別のスポーツを週に一回は行うようにする。
座りっぱなしなのでよくないし、筋肉は脳みそに良いので筋トレしよう。

2017/12/25-12/31

ちょうど31日が日曜日なので、気持ち的に投稿を遅刻できない。

東京メトロでやってる「地下謎への招待2017」ってやつをやってみた。
メトロ各線の駅をうろうろして謎解きしていくんだけど、予想以上に難しいし楽しかった。
ネットに転がってる情報だと、だいたい6時間くらいで終わるらしいんだけど、ふつーーーーに9時間かかった。

新宿スタートで、謎解きして次の駅に行って、また謎解きして、の繰り返し。
クリスマスなのにカップルがたくさんいて、みんな物好きだなあって感じ。
何人でやっても楽しいと思うのでぜひみんなやってほしい。一人だとちょっと心がつらいかも。


中学からの友人二人とお酒飲んだ。
大学の友達は研究者仲間で、高校の友達はゲームとかサブカルを共有してて、中学の友達はネタの宝庫って感じ。
昔からネタに事欠かない連中で、めちゃくちゃ楽しかった。


この曲がすごい2017を書いた。
今年は研究室でラジオを聞いていて、いろいろな曲を知ることができたと思う。
来年はアウトプットもそこそこやって行きたい。


きららファンタジアに飽きた。
やっぱりソシャゲ向いてないなと思った。
戦闘シーンでプレイ時間をカサ増しされてる気分になるのでよくない。
戦闘早送りじゃなくて戦闘スキップさせてほしい。

大掃除の一環で実家の風呂洗いを手伝ってた。
自分が家を出てからどんどん実家が汚くなってて、家に住んでる人が自分で掃除してくれって感じした。

今週はイベントごとが多くて作業進捗がダメダメすぎる。
おなかいたくなってくる。

現実逃避に余念がなく、最近はルービックキューブをかちかち回して遊んでる。
君も六面そろえられる!みたいなサイト見ながら動かし方覚えてる。
自分の成長が目に見えるものはなんでも楽しい。

渋谷の青の洞窟っていうイルミネーションを見に行った。
びっくりするほど地味だけど、ものは言い様だなと思った。
手の込んだ手抜きってこういうことかってちょっと感じた。

祖母が住む福島に年末年始必ず行ってる。
今年は祖父の葬式で福島に来ていたので、一ヶ月ぶり二回目の福島。
めちゃくちゃ寒い。
特にやることもないので、ぼーっと記事を書くとかしてる。


今年一年、週間記録を続けられたのでえらい。よくできました。
頭が整理されるし、なんとなく自己顕示欲が満たされるので続けていく。

来年もルーチンを一つふやしてみようと思う。
とはいっても、毎週一つ技術記事書くとかはつらいのでやらない。
そろそろ貯金したいので、つもり貯金とか始める「つもり」。

私的2017年「この曲がすごい」

はいはい今年もやりますよー。
今年僕がいいと思った曲を20曲ほど紹介します。
ついでに、その曲のどこがいいのか!をガンガン書いていくよーー。

お断りとして、2017年にリリースされた曲に限りません。
今年、ぼくがいいと思った曲をご紹介していきます。
語彙が終わってるので好きとかしか言いません。


動画貼りまくりでちょっと重いかも。

続きを読む