trainerのextensionsについて
アドベントカレンダー20日目です。
今日はchainerのtrainer extensionsについて書いていきたいと思います。
Trainerについて
chainerのバージョン1.10.0でTrainerが実装されました。 従来は学習ループをがしがし記述していたのですが、Trainerはより抽象化されており、比較的簡単に学習の記述ができます。また、Trainer extesionsを使うことにより、様々な追加機能を使うことが出来ます。
Trainer Extensionsの一覧と公式の説明
簡易な説明はこちらで見ることが出来ます。
Trainer extensions — Chainer 3.2.0 documentation
chainer.training.extensions.dump_graph
Returns a trainer extension to dump a computational graph.chainer.training.extensions.Evaluator
Trainer extension to evaluate models on a validation set.chainer.training.extensions.ExponentialShift
Trainer extension to exponentially shift an optimizer attribute.chainer.training.extensions.LinearShift
Trainer extension to change an optimizer attribute linearly.chainer.training.extensions.LogReport
Trainer extension to output the accumulated results to a log file.chainer.training.extensions.observe_lr
Returns a trainer extension to record the learning rate.chainer.training.extensions.observe_value
Returns a trainer extension to continuously record a value.chainer.training.extensions.snapshot
Returns a trainer extension to take snapshots of the trainer.chainer.training.extensions.snapshot_object
Returns a trainer extension to take snapshots of a given object.chainer.training.extensions.ParameterStatistics
Trainer extension to report parameter statistics.chainer.training.extensions.PlotReport
Trainer extension to output plots.chainer.training.extensions.PrintReport
Trainer extension to print the accumulated results.chainer.training.extensions.ProgressBar
Trainer extension to print a progress bar and recent training status.
補足程度の説明
chainer.training.extensions.dump_graph
何も考えずに名前だけで推察すると、学習のグラフでも出してくれるのかな?って思いますが、実際はネットワークの計算グラフを出力します。長所なのか短所なのかdotで出力されるため、画像を確認するときは少し手間がかかります。chainer.training.extensions.Evaluator
テストデータを入力することでモデルの評価を行うことができます。ログをとるときにもこれを動かすとわかりやすいかもしれません。chainer.training.extensions.ExponentialShift
optimizerの数値を指数関数的に変化させていくことができる。これは結構便利そうに見えたので一度導入を試みたのですが、エラーを吐いてしまって以来使用していません。chainer.training.extensions.LinearShift
ExponentialShiftに対し、こちらはLinearにShiftします。使ったことがないのでわからないですが、ExponentialShiftとくらべてみたいところですね。chainer.training.extensions.LogReport
指定したタイミングごとに、ログをファイルに出力してくれます。これはかなり便利なので、Trainerを使うならほぼ間違いなく使うべきです。chainer.training.extensions.observe_lr
chainer.training.extensions.observe_value
この2つはいまいちよくわかりませんでした。使用例をみて今度考えてみましょう。chainer.training.extensions.snapshot
trainerのsnapshotsをとります。これも非常に便利なので使ったほうがいいです。これを使うと、学習の途中から再開することが可能となります。chainer.training.extensions.snapshot_object
先程のものに対し、こちらはmodelなどのObjectを保存するのに使えます。これもほぼ間違いなく使うべきです。chainer.training.extensions.ParameterStatistics
W/data/meanなどのパラメータ情報をレポートします。見た感じではいまいち便利なのかはわからなかった・・・。chainer.training.extensions.PlotReport
これはグラフを生成してくれます。logファイルを読んでグラフを生成するという作業が不要になるのかな?chainer.training.extensions.PrintReport
LogReportはログファイルを出力しますが、こちらはprintしてくれます。これも特に使わない理由はないと思います。chainer.training.extensions.ProgressBar
進捗状態のバーを出してくれます。ある程度精神衛生に優しいので、jupyterとかで学習してないときにはおすすめです。
まとめ
extensionsには色々便利な機能があるので、できるだけたくさん使ったほうが幸せになれるかもしれない。
kaggleでお勉強
アドベントカレンダー19日目です。
今日はkaggleについて少々、あとkaggleを使ったお勉強について書きたいと思います。
kaggleとは
データサイエンスで現実の問題を解決するようなコンペが行われてるサイトです。 Kaggle: Your Home for Data Science
企業が現実世界で起こっている問題に対し、コンペを開きます。参加者は企業が公開するデータを元に、その課題に取り組み、予測を行うモデルを作成します。最終的には、ランキングの上位者には賞金が支払われ、その代わりに、ソースコードを提示します。
また、コンペが行われてる以外にも、データセットが公開されていたりします。kaggleに登録しているユーザーは、新しいデータに触ることができます。対して、データを登録するユーザーの上位は、賞金を受け取ることができます。これはkaggleの非常にいい点であると思います。
後は、kaggleのKarnelでソースコードを動かすことが出来たり、議論をする場もあったりします。
kaggleの良いところ
データ分析に興味がある人だったとしても、現実世界の何かしらの問題をデータ分析で解決してみたい、と思ったときにはそれに応じたデータが必要となります。kaggleでは、この問題を解決してほしいということがあり、それに必要なデータも与えられています。現実世界での問題を自分で解くことができるのは一つの楽しみかなと思います。
kaggleでお勉強
データ分析を勉強していきたいと思ったときに、どうやって勉強したらいいのかわからないと思います。実際自分もわかっていません。CS231nを見て勉強したり、PRMLを読んだりいろんな勉強法はあるかと思いますが、kaggleでお勉強するのも一つの手だと思います。
kaggleで実際に手を動かしながら学んだり、上位者の手法や、Kernelを見ることで理解を深めることができます。実際にデータ分析を行ってる人のソースコードを読むことができるのは、非常にいいところだと思います。
後は、ただ単純にお勉強という感じではなく、コンペに参加し、ランキングを上げるというゲーム感覚で学んでいけるのも非常にいいかなと思います。
まとめ
kaggle面白いので周りにも利用者が増えて欲しい。
pythonのCounterについて
アドベントカレンダー18日目です。
今日はPythonのCounterについて書いていきます。
Counterとは?
与えられた要素について数を数えます。公式の例がわかりやすいです。
c = Counter() # a new, empty counter c = Counter('gallahad') # a new counter from an iterable c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping c = Counter(cats=4, dogs=8) # a new counter from keyword args
8.3. collections — コンテナデータ型 — Python 3.6.3 ドキュメント
Counterを使ってみる
使い方は簡単です。 collectionsからCounterをimportします。 後は、Counterに要素を投げることで、数え上げて辞書型で保存します。極めて簡単ですね。
from collections import Counter print(Counter("aiueooiusiuuu")) >>> Counter({'u': 5, 'i': 3, 'o': 2, 'e': 1, 's': 1, 'a': 1})
今回は、Counterに入力するデータとしてオバマさんの演説を持ってきました。なぜオバマさんの演説かというと、英語で形態素解析がいらなくて楽だからです。文章はここから持ってきました。 www.nikkei.com
前処理として、改行を消したり、「,」「.」を消したり、「-」を空白に置換し、大文字は全て小文字にしました。
Counterに入力し、試しに上位10件の単語を見てみましょう。
sentence = "" #オバマさんの演説 counter = Counter(sentence) count = counter.most_common() print(count[:10]) >>> [('the', 74), ('and', 57), ('to', 50), ('of', 47), ('that', 41), ('we', 33), ('a', 31), ('our', 22), ('is', 15), ('us', 14)]
上位10件で円グラフを書きました。ただしコレの%は全体から見た数値ではないので要注意です。
import matplotlib.pyplot as plt %matplotlib inline x = [x[1] for x in count][:10] label = [label[0] for label in count][:10] plt.figure(figsize=(5,5), dpi=100) plt.pie(x, labels=label, startangle=90, counterclock=False, autopct='%.1f%%', pctdistance=0.75) plt.axis('equal') plt.show()
imagenetとその使い方について
アドベントカレンダー17日目です。https://blog.hatena.ne.jp/looseleaf0727/looseleaf0727.hatenablog.jp/edit?entry=8599973812327479500
今日はimagenetの説明と、使い方について書いていきたいと思います。
imagenetについて
こちらのことです。 ImageNet
画像のデータベースで、分類などの学習に使うデータを集めたりすることが出来ます。具体的にどのような種類の画像があるかは、上のExploreから見ていくことが出来ます。
Exploreに飛んだ画面です。 様々なジャンルのツリーがあり、そこから更にサブツリーがあります。 一瞬誤解をしてしまいそうですが、カッコの中の数字はサブツリーの数であり、画像の数ではありません。 今回はbeachを見てみました。 たくさんの画像が出てきますが、重複に気をつける必要がありそうです。
上の検索窓でbreadについて検索してみました。 たくさんのbreadに関する内容が出てきています。 この中から、必要に応じて見ていくわけですね。
試しにItalian breadを開いてみました。画像の一覧が表示されました。Downloadsを押すことでダウンロードができます。
Download URLs of images in the synsetからは画像がダウンロードできます。 Download Bounding BoxesはYoloのような物体の位置を検出する際に使うデータだと思います。
画像のダウンロードの仕方
先程のDownload URLs of images in the synsetをクリックするとこのような画面になります。これは画像のURL一覧です。なので、ここから画像をダウンロードしてあげる必要があります。
先程のリンクをwgetしてリンク一覧を持ってきます。
wget http://image-net.org/api/text/imagenet.synset.geturls?wnid=n07687626
これでリンク集が手に入りました。あとはこのリンクから画像を拾うだけです。今回はpythonを使って拾いました。引数でリンクのファイルを渡すと拾ってきてくれます。保存ディレクトリは指定してないので、必要があれば修正してください。
import os import sys import codecs import urllib.request f = codecs.open(sys.argv[1], 'r', 'utf8', 'ignore') for line in f.readlines(): try: img = urllib.request.urlopen(line[0:-2]) localfile = open(os.path.basename(line[0:-2]), 'wb') localfile.write(img.read()) img.close() localfile.close() except Exception as e: print(e)
注意点
拾ってきた画像の中ではリンクが参照できず、エラーの画像などが入っている場合が多いです。ざっくりと確認して弾くのがいいと思います。
まとめ
imagenetを使ってみなさんも分類問題でもやってみましょう。
水平棒グラフの作成をした
アドベントカレンダー16日目です。
今日はmatplotlibで水平棒グラフを作成しました。
水平棒グラフとは
通常イメージする棒グラフは縦方向ですが、水平棒グラフは横に棒グラフが伸びていきます。こんな感じのが水平棒グラフです。
今回は、水平棒グラフをmatplotlibで作成したのでそれについて書いていきます。
水平棒グラフの作り方
plt.barh
を使うことで作成できます。ただし、plt.plot
とは少し値の指定が違うので気をつけてください。
いつも通り公式のドキュメントを見ましょう。 matplotlib.axes.Axes.barh — Matplotlib 2.1.1 documentation
必要となる値は、棒グラフの座標と高さです。 今回はサンプルのデータとして、適当にa-zの文字を1,000個選び、その個数を元に水平棒グラフを作成しました。 要素の種類の数だけ座標を作り、counterから個数とラベルをとりました。
import numpy as np from collections import Counter import matplotlib.pyplot as plt import string %matplotlib inline chars = string.ascii_uppercase char = [chars[x] for x in ary] counter = Counter(char) counter = counter.most_common() y = np.arange(len(counter)) width = [counter[x][1] for x in range(len(counter))] label = [counter[x][0] for x in range(len(counter))] plt.figure(figsize=(10,8),dpi=100) plt.barh(y, width, tick_label=label) plt.tick_params(labelsize = 15) plt.title("count") plt.xlabel("number") plt.grid() plt.show()
本当はメルカリのデータでやってたんですが、載せていいのかわからないのでダミーデータにしたらゴミっぽいグラフになりました。
今回のコード
参考
Pythonの大文字と数字によるランダムな文字列の生成 - string - random | CODE Q&A [日本語]
ubuntu14.04 + python3 でopencvをいれて動画をいじろうとしたら苦戦した話
アドベントカレンダー15日目です。
今日はopencvをインストールしようとして苦戦した話を書いていきます。
成功するまでにやったこと
pip install opencv-python
で普通にインストール- opencv-3.0.0 をビルド
- ffmpegを入れてもう一度ビルド
- Contribを入れてビルド
- Git checkoutでバージョン指定してビルド
conda install -c https://conda.anaconda.org/menpo opencv3
でインストールpip install opencv-contrib-python
でインストールconda install opencv
でインストール
最後の一つで成功しました。 ffmpegとかは多分必要な部分だと思います。
手こずった理由
今回は深層学習でのスタイル転移で、動画を入力して変換するという作業を行う過程でopencvを使います。opencv自体はpipですぐはいるのですが、なぜか動画が読み込めない・・・。読み込めているかどうかは以下のコードで確認しました。
import cv2 filename = "mp4_h264_aac.mp4" cap = cv2.VideoCapture(filename) print(cap.read())
うまくいっていない場合には以下のような出力です。
>>> (False, None)
うまくいっている際には数値が出力されるはずです。
成功したインストール方法
自分はpyenvでanaconda3-4.1.0を使用しています。なので、condaでインストールが可能となります。
github.com
こちらのREADME曰く、conda install opencv
でインストールできるとのことです。
インストールした後、先程のコードを実行し直してみます。
(True, array([[[ 93, 27, 1], [ 92, 26, 0], [ 91, 25, 0], ..., [112, 45, 0], [112, 45, 0], [112, 45, 0]],
Trueが返ってきていて、値も入っています。これで動画の処理ができます。
まとめ
ビルドをしなくて済む方法をまず探るべき。
意識中くらいのお菓子作り
アドベントカレンダー14日目です。
前回は意識低い系お菓子作りをしましたが、今回は意識中くらいはあるお菓子作りをしていきたいと思います。
今回作るもの
スノーボールクッキーを作ります。あの白くて丸いやつです。
作ろうと思った理由として、以前にたくさん買ったアーモンドプードルを消費したいというのと、少しクリスマスぽくていいかなと思ったからです。
今回のレシピはこちらです。
cookpad.com
必要な材料
- 薄力粉 100g
- アーモンドプードル(薄力粉で代用可) 40g
- 粉砂糖(上白糖で代用可)40g
- バター(サラダ油で代用可)70g
仕上げ用
- 粉砂糖 大さじ2〜4くらい
前回の材料から見て少し変わっているものは、アーモンドプードルと粉砂糖くらいですね。両方少量であれば100均で売っています。良い世の中ですね。ただし、粉砂糖は溶けるものと溶けないものを使ったほうがきれいかもしれません。アーモンドプードルを代用すると、香ばしさが落ちますが一応作れます。
製作工程
最初に、アーモンドプードルを少し煎りました。この工程は小麦粉で代替する際にはいらないと思います。
バターをクリーム状になるまで混ぜます。この時期は寒いせいでバターがまったく溶けないので、金属製のボウルであれば体温で徐々に溶かすか、湯煎をしていい感じにしましょう。レンジで少し温めてもいいと思います。
次に、粉類三種類を振るいます。振るわないとダマが出来たりして微妙な気がします。自分は粉ふるいを使いましたが、ザルでもいいという意見を頂いたのでそれでもいけると思います。
あとは袋に入れて混ぜるか、ボウルで混ぜてひとかたまりにします。ひとかたまりになったら、適当に小さめに分けながら手のひらで丸めていきます。
オーブンは170度に予熱し、クッキングシートを敷いた天板に並べます。
あとは15分から25分くらい焼きます。焼き具合を見ながら適度なところで止めてください。個人的には、焼き色が少しついて茶色になり始めたのが出たところで止めました。
焼けたものです。重みで少し潰れたのはミスですね。もう少し一個あたりを小さく作りましょう。
後は粉砂糖を適当につけました。頭が悪いので焼いた直後につけたら水分が残っているせいで溶けてきれいになりませんでした。その後、改めて泣かない粉糖(水で溶けにくい)をつけたらそれっぽくなりました。
食べてみての感想
香ばしくてさくさくなのがいいですね。結構ひょいひょい食べられるし、また作りたいかなと思いました。
食べてもらっての感想
- 無印のものより甘くなくておいしい
- 香ばしい
- 一口サイズだったらもっと嬉しかった
まとめ
粉ふるいめちゃ小さいの使ったせいで粉ふるいだけで一時間くらいかかりました。大きいものかザルでも使いましょう。
お菓子自体はクリスマスらしくて、材料はお手軽、味もおいしいのでかなりおすすめです。