深層学習とその他

機械学習したいマン

大学院について

アドベントカレンダー24日目です。

adventar.org

今日は少し毛色を変えて、本学の大学院について書いていきたいと思います。

大学院について

大学院入学までの流れ

内部進学であれば、推薦を出すだけでスッと終わります。支給されるタイプの奨学金が欲しい場合には書類が増えますが、それでもそこまで大変ではありません。4年の4,5月くらいまでに大学院に進学する意思を決めておけば大丈夫です。

大学院の講義

学部のときの講義に比べれば、座学だけではなく実際に手を動かす講義も多いのがいいところです。ソースコードをある程度書くような講義も多いのがいいところですね。悪い所としては、必要な単位数に対して全体の講義数はそこまで多くないので、ある程度は好きでもない講義を取る必要があるところです。大学院に進学してるくらいなのである程度専門に寄らせてほしい気持ちはありますね。

広義の意味で捉えるのであれば、人工知能に関する講義は多かったかもしれません。機械学習の授業、ニューラルネットワークの授業、統計などの授業、Rを用いた分析の授業などがあります。

大学院生の生活

これは完全に人によりけりです。ばりばり研究をしてるような人もいれば、開発をしてるような人もいるでしょうし、それ以外の活動に勤しんでいる人もいます。授業を大方取り終えてしまえば、4年生くらいの授業の少なさにはなるので、研究室に来る人も来ない人もいます。その関係か夜型の人が大半です。

大学院生の人数

うちの専攻はとても少なくて、同学年には30人くらいしかいません。同じ研究室に院生がいればラッキーくらいの感覚です。いない人はいい感じに後輩と仲良くするか、他の研究室の院生と仲良くしましょう。

大学院の卒業要件

学部のときと同じ部分として、一定単位数を取る必要があります。異なるところとしては、学会での発表が原則として必要になります。人気なのは情報処理学会ですね。

TAについて

SAは時給1000円ですが、TAは時給1600円、一コマ90分で3500円貰えます。実験は3コマあるので、1日実験のTAをすることで1万円がもらえることになります。

大学院進学の動機など

もともと大学院に行くことに決めていた、学部である程度就活がうまくいったので、院ならもっといいところにいけると思った、もっと研究がしたかったなど動機は様々です。大体どの人も直接聞けば教えてくれるので、大学院に興味がある人は聞いてみるといいと思います。

大学院に行くか迷っている人

内部進学であれば、5月くらいまでは何も考えずに就活をすることができるので、就活をしながら考えてみるといいと思います。企業で働いている人に相談してみたり、院生に相談してみるのもありだと思います。院には行きたいけど、お金がないから行かない、というのは少しもったいないのかもしれません。逆に、そこまで院に行きたくはないけどなんとなくでいくというのはそこそこ地獄かもしれません。

要注意事項

院に行くに従って、基本的に学部と同じ研究室に所属し続けることとなると思います。その際に、自分の卒業までその先生がいるのか、ちゃんと面倒を見てくれる人なのか、というのは重要な要素となると思います。院進学を考える4,5月くらいでは、まだ先生からきちんと指導をしてもらってないのでどんな人かはわからないと思います。3年生のうちから4年生や院生にどのような指導をしているか見ておけば参考になるかと思います。

まとめ

本学では進学は1割に満たない珍しい選択なので、家族や先輩、色んな人に相談した末に決めたほうがいいと思います。行くこと自体は全く悪いことではないですし、来てほしいですが、何らかの目的はあったほうがいいと思います。

よく使うコマンドについて

アドベントカレンダー23日目です。

adventar.org

今日はよく使うコマンドについて書いていきたいと思います。

よく使うコマンド

  • ls
    ディレクトリに何のファイルがあるか見れます。常に打ちます。

  • clear
    ターミナルのスクリーンを一度きれいにします。これも常に打ちます。

  • last
    ログイン履歴が見れます。使うサーバーに普段誰かログインしているのか確認するときなど。

  • who
    現在ログインしてる人を確認できます。作業前に大体使います。

  • nvidia-smi
    GPUの使用率などを確認できます。学習前や学習してる間に適宜確認します。

  • ps aux
    誰がどういうプロセスを動かしてるか確認できます。nvidia-smiで学習が回ってるのを確認したときに、誰が動かしてるか調べるのに使ったりします。

  • top
    CPU使用率やメモリ使用率を見れます。明らかに重いときに使います。

  • free -h
    メモリ使用率を比較的見やすい形で見れます。明らかにメモリを確保するプログラムを動かすときに使ってます。

  • dstat
    かっこいい形でCPU率などのデータが見れます。CPU使ってそうなときに使います。

  • du -m --max-depth=1
    容量確認ができます。モデルサイズが大きくて心配なときなど。

まとめ

サーバーの使用率を確認するようなコマンドばかりでしたね。ブラウザとかで統合して見れれば良さそうですが、サーバーには導入されてなくて使えないのが悲しいところです。

意識高い系お菓子作り

アドベントカレンダー22日目です。

adventar.org

今日はクリスマス会のためにザッハトルテを作ったのでその話を書いていきます。

作ろうと思ったきっかけ

クリスマス会の前日に後輩がケーキを持ってきてて、先輩もケーキ持ってくるから~という強めのフリを受けて、作らざるを得ない感じになってしまった。
そのケーキがガトーショコラとベイクドチーズケーキだったので、ある程度気合が入ったように見えるザッハトルテにしました。

ザッハトルテとは

チョコレート味のふんわりした生地を作り、その表面をグラサージュ(チョコレートでコーティング)したものです。よくあるものでは、2層みたいになっていたり、金粉が載っているものがイメージしやすいと思います。こんな感じのものです。 f:id:looseleaf0727:20171222233845j:plain

必要な材料

  • チョコレート 200g
  • ラニュー糖 70g
  • 粉砂糖 40g
  • 無塩バター 80g
  • 卵 4コ
  • 薄力粉 70g
  • ココアパウダー 10g
  • 生クリーム 100g

普段よりも材料が多めですね。チョコレート200gというのは、板チョコ4枚分に相当します。これがまあまあ値段かかるので、ダイソーのチョコを使うことで、チョコレートの費用を200円に抑えました。

無塩バターには、発酵バターを40g、ケーキ用マーガリンを40gの半々にしてみました。発酵バターは香りがいいけど若干高いバターです。

製作工程

まずは板チョコ100gを湯煎にかけます。この時期は寒いのでわりと時間のかかる工程になります。あと油断すると固まっていくので、常に湯煎してました。 f:id:looseleaf0727:20171222234343j:plain

別のボウルでバターを溶かしていきます。これも湯煎です。 f:id:looseleaf0727:20171222234346j:plain

溶けたら、卵黄を加えて混ぜます。4コです。 f:id:looseleaf0727:20171222234349j:plain

湯煎したチョコを加えて混ぜます。油断すると固まっていきます。 f:id:looseleaf0727:20171222234353j:plain

更に別のボウルで卵白4コを泡立てていきます。ハンドミキサーがないと死に至ります。泡の具合を見ながら、グラニュー糖を徐々に加えていきます。角がたったら終わりです。 f:id:looseleaf0727:20171222234351j:plain

うまくいくとこんな感じです。好みでメレンゲの固さも変えてもいいかも。 f:id:looseleaf0727:20171222234357j:plain

粉を振るいます。大変なので泡立て器で混ぜたままです。 f:id:looseleaf0727:20171222234403j:plain

メレンゲを加えます。これも徐々に、丁寧に混ぜていきます。メレンゲの泡を出来るだけ潰さないように心がけましたが、本来ならヘラで混ぜたほうが良いでしょう。 f:id:looseleaf0727:20171222234359j:plain

メレンゲを加え終えるとこんな感じです。前のボウルの画像と比べるとわかるかもしれませんが、だいぶ量が増えてます。 f:id:looseleaf0727:20171222234400j:plain

170度で予熱後、底が抜ける型にいれて焼きました。40分程度焼きます。 f:id:looseleaf0727:20171222234404j:plain

ここで一段落です。ただし、早めに型から抜かないとしぼんでしまうので、一度ケーキクーラーに出します。 f:id:looseleaf0727:20171222234406j:plain

クーラーがないので網に出しました。この時点でおいしそうですね。 f:id:looseleaf0727:20171222234407j:plain

二層構造にしたいので、半分に切りました。きれいに半分に切る方法なんかは、検索すると出てきます。 f:id:looseleaf0727:20171222234409j:plain

ガトーショコラと差別化するために、オレンジジャムを中間に塗りました。ぬった面同士を元通りくっつけます。少し汚く見えますが、くっつけたらいい感じになるはずです。 f:id:looseleaf0727:20171222234410j:plain

生クリームを沸騰させ、残りの100gの板チョコを入れて溶かします。これを上から勢いよく流しかけます。 f:id:looseleaf0727:20171222234415j:plain

こんな感じになります。ちょっと生クリームの温度をあげすぎたのか、表面が平らにならなかったのはややミスです。 f:id:looseleaf0727:20171222233845j:plain

モチベを高めるために、金粉をかけていきます。これがあるだけで見た目はだいぶそれぽくなります。 f:id:looseleaf0727:20171222234420j:plain

後は研究室に運びます。ダイソーで売ってたケーキ用の箱を使いましたが、中身が見えていい感じです。 f:id:looseleaf0727:20171222234423j:plain

他のケーキと3つ並べました。二層になっていてよかったです。 f:id:looseleaf0727:20171222234422j:plain

食べた感想

結構ボリュームがあるけれど、オレンジのおかげですこし爽やかでいい。
切ったときにも金粉があるとオシャレ度が高い。

まとめ

ザッハトルテ、まあまあめんどくさいけど見た目がきれいで味もおいしいのでみなさん挑戦してみてください。

kaggleの始め方

アドベントカレンダー21日目です。

adventar.org

今日はリクエストみたいなことされたので、kaggleの始め方について書きたいとおもいます。

kaggleとは

つい先日軽く触れたのでここを少し参照してください。

looseleaf0727.hatenablog.jp

コンペに参加

kaggleではいろんなコンペが開かれています。コンペの一覧はこちらから確認できます。 Competitions | Kaggle

練習用のものや、実際に賞金が出るもの、終わったコンペなどが見られます。 今回は入門用のTitanicに挑戦してみます。 https://www.kaggle.com/competitions f:id:looseleaf0727:20171222132549p:plain

コンペの概要

それぞれのコンペをクリックした先のページ、Overviewに書かれています。 どのような課題があるのか、どのようなデータが与えられるのか、何を予測してほしいのか、賞金についてなど色々ここに書かれています。

今回のTitanicの例では、有名なタイタニック号の沈没の話ですが、乗船していた客に生存者がいました。生存したか、チケットの等級、性別、年齢・・・など様々な情報が学習データとして与えられます。この学習データを元に、予測を行うモデルを作成します。最終的には、生存したかどうかが抜けている本番データを用いて、生存したかどうかを予測します。

与えられるデータの中身やその説明などはDataタブに書かれています。 OverviewのEvaluationには、提出するファイルのフォーマットが書かれています。このフォーマットに基づいたファイルを提出することで、精度などのスコアが計算され、自分の順位を確認できるようになります。

データのダウンロードと予測

今回コンペのデータとして、学習に使うtrain.csv,検証に使うtest.csv,あとgender_submission.csvの3つのファイルが与えられています。train.csvを使って、予測をしていきましょう。

環境はjupyter notebook、python3でいきます。 基本的にはpandasとかいうの使うと便利なのでそれでいきましょう。

csvを読み込んでpandasのDataFrameにしました。headを使うことで指定した分だけデータを見れます。表で見れるのがいいですね。

import pandas as pd
train = pd.read_csv("train.csv")

train.head(3)

f:id:looseleaf0727:20171222170008p:plain

dtypeを見ておきます。

train.dtypes

>>>
PassengerId      int64
Survived         int64
Pclass           int64
Name            object
Sex             object
Age            float64
SibSp            int64
Parch            int64
Ticket          object
Fare           float64
Cabin           object
Embarked        object
dtype: object

null値が入ってないか確認しましょう。

train.isnull().sum()

>>>
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

性別で生存率が違うのかなあって思ったので調べてみましょう。欠損もラッキーなことにありませんでした。まずは人数を調べます。

len(train[train.Sex == "male"])
>>> 577

len(train[train.Sex == "female"])
>>> 314

性別ごとの生存率を見てみましょう。1なら生存してます。

(train[train.Sex == "male"]["Survived"] == 1).mean()
>>> 0.18890814558058924

(train[train.Sex == "female"]["Survived"] == 1).mean()
>>> 0.7420382165605095

男性は19%しか生存してないけど、女性は74%も生存してますね。
何も考えずに、男性なら死亡、女性なら生存で予測するモデルということにしましょう。

本番データを読み込んで、欠損値の確認をします。

test = pd.read_csv("test.csv")
test.isnull().sum()

>>>
PassengerId      0
Pclass           0
Name             0
Sex              0
Age             86
SibSp            0
Parch            0
Ticket           0
Fare             1
Cabin          327
Embarked         0
dtype: int64

先程の条件で、性別のみで決定をしていきます。
あとは、提出するフォーマットに合わせるため、Idと予測でセットにします。
注意点としては、index=Falseにしておかないと提出したときにエラーを出します。

Survived = []

for i in test.Sex:
    if i == "male":
        Survived.append(0)
    else:
        Survived.append(1)

out = pd.DataFrame(test.PassengerId)
out["Survived"] = Survived
out.to_csv("submission1.csv", index=False)

あとは、出力されたcsvを提出します。
Submit Predictionから提出できます。 f:id:looseleaf0727:20171222171800p:plain

csvファイルをアップロードし、Optionalですが、Describeを記入してもいいです。 f:id:looseleaf0727:20171222171812p:plain

スコアはLeaderBoardから確認できます。自分のスコアや、正しく動作したかなどが表示されます。 f:id:looseleaf0727:20171222172058p:plain

コンペのトップページで再び戻ってみると、順位を確認できます。 f:id:looseleaf0727:20171222172238p:plain

機械学習を使う

機械学習を使う際にはscikit-learnを使うと非常に楽ができます。 * 学習データと検証データの分割 * F1値などの表示 * 学習と予測 * 最適なパラメータの探索 * 混合行列の作成

使うアルゴリズムの選定は、scikit-learnに選ぶときに参考になる画像があります。そちらを見て決めていきましょう。

今回は色々検証したりしたのですが、めちゃめちゃ書くと文量が多くなるので途中でやめておきます・・・。 ソースコードは貼り付けておくので見てみてください。

trainerのextensionsについて

アドベントカレンダー20日目です。

adventar.org

今日は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日目です。

adventar.org

今日は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日目です。

adventar.org

今日は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()

f:id:looseleaf0727:20171219000127p:plain