深層学習とその他

機械学習したいマン

意識低い系お菓子作り

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

今日は意識低めのお菓子作りについて書いていきたいと思います。

これを書こうと思った理由

お菓子作りは少しハードルが高く見えるせいで、お菓子作りするひとが少ないのかな?
そうだったら、意識低めのお菓子作りの記事を書くことでお菓子作りをする人が増えればなあということです。

今回作るもの

パウンドケーキを作ります。
意識を低くするため、ダイソーで売ってたパウンドケーキミックスを使います。
f:id:looseleaf0727:20171210184227j:plain

必要な材料

f:id:looseleaf0727:20171210184327j:plain
パウンドケーキミックスの袋いわく、必要材料は以下のものです。

  • パウンドケーキの型
  • この粉
  • 卵 一個
  • 無塩バター 60g

普通にイメージするのは金属の型ですが、高いうえに普通はそこまで使いません。100円ショップはお菓子を作る人には素晴らしい店なので、紙のパウンドケーキの型が売ってます。これを使いましょう。
f:id:looseleaf0727:20171210184255j:plain

無塩バターがあると風味がよくなりますが、まあまあの値段です。200gで400円とか。無塩のマーガリンを使うと、バターの風味自体はなくなりますが、半額くらいで買えます。適当な油とかを使うと風味はそこまでよくないですが、最初から液体だし安いので楽です。今回はオリーブ油を使います。

必要な道具

今回必要なのはこれくらいだと思います。

  • はかり
  • ボウル
  • ゴムベラ
  • 泡立て器

今回は、油の計量に使います。はかりは1gから計れるものがおすすめです。電子はかりがとても便利ですが、人によってはもっていないと思います。そういう場合には計量スプーンを代わりに使うことが出来ます。計量スプーンでの換算サイトがあるので、これを使いましょう。計量スプーンすらない場合には、100均で買いましょう。
www.benricho.org

ボウルは好みですが、金属で深いものが好きです。なんも考えずバター入れたりして、後から溶かしていれなくちゃいけないのに気づいたときに湯煎でなんとかできたりします。

ゴムベラは無いと死にます。100均で買いましょう。先端が取り外せないものがおすすめです。

泡立て器もないと死にます。100均で買いましょう。

材料と道具を並べるとこんな感じです。実家だと大抵ありそうですね。
f:id:looseleaf0727:20171210184403j:plain

製作工程

まず卵をほぐします。めんどいので泡立て器で。
f:id:looseleaf0727:20171210184349j:plain

次に、バターを入れます。高いので油にしました。
f:id:looseleaf0727:20171210184402j:plain

そしてダイソーで買ったパウンドケーキミックスを入れます。
f:id:looseleaf0727:20171210184412j:plain

まぜたらカスタードクリームみたいになりました。
f:id:looseleaf0727:20171210184445j:plain

型にバターを塗ります。高いので油です。スプーンで適当に塗ります。もし塗らないと焼いたときに張り付いたりします。
f:id:looseleaf0727:20171210184427j:plain

ゴムベラで入れます。こういうときに極めて便利。
f:id:looseleaf0727:20171210184503j:plain

なんか汚いですがこんなもんです。表面ならしてもいいですが、めんどいのでしません。
f:id:looseleaf0727:20171210184454j:plain

天板に乗せて焼きます。予熱は流石にしましょう。オーブンがないと戦えません。
f:id:looseleaf0727:20171210184453j:plain

できました。なんかしらないけど結構膨らみましたね。
f:id:looseleaf0727:20171210184504j:plain

紙の型を使う利点として、洗い物が減る、型からの取り外しが簡単、このまま包丁で切れるなどがあります。
f:id:looseleaf0727:20171210184513j:plain

食べてみての感想

少しオリーブ油の匂いがしますが、まあまあ美味しいです。マーガリンを使ったら間違いなく普通に美味しいですね。

まとめ

すごい適当でもお菓子は作れました。
今回安い油を使いましたが、こだわればカルピスバターだったり、発酵バターだったりすると思います。パソコンを組む時と同じで、ここにはお金かけたい、ここはある程度削りたいとかすると結構楽しいと思います。

chainerのto_cpuについて

アドベントカレンダー9日目です。
adventar.org
今日はchainerのmodel.to_cpuについて書いていきます。

to_cpuについて

chainerで学習する際には、ネットワークを定義した後、モデルをto_gpuすると思います。これによりGPUで処理をすることができるからです。対して、to_cpuはどのような場面で使うかというと、学習後のモデルを保存する際に使用したりします。

model.to_cpu()
chainer.serializers.save_npz("model.npz", model)


to_cpuのメリットは?

to_cpuを使うことによるメリットとして、cpuで処理をすることができることです。学習後のモデルを使って、webサービスか何かに使うときには、貧弱なサーバーではGPUを使えないことがあります。そういうときには、to_cpuしたモデルを使ってCPUのみで処理するのがいいかなと思います。

to_cpuの注意点

学習ループ中に、model.to_cpuしてそのままだとエラーを吐きます。そういうときの正しい対処法はわかりませんが、とりあえずto_gpuすることでエラーを吐かずに走り続けます。

まとめ

弱いパソコンで試すときや、予測だけするときにto_cpuを使うと便利かも知れません。

chainer以外でのcupyの使用について

アドベントカレンダー8日目です。
今日はcupyについて書いていきたいと思います。

速度比較

今回は、0~300000000までの配列を生成し、それをシグモイド関数に通します。その時の速度を以下の3つで比較します。

def sigmoid(x):
    temp = x.copy()
    for i,x in enumerate(x):
        temp[i] = 1/(1+math.exp(-x))
    return temp

start = time.time()
x = list(range(300000000))
sigmoid(x)
print(time.time()-start)
  • numpyのarangeとnp.exp
def numpy_sigmoid(x):
    return 1/(1+np.exp(-x))

start = time.time()
x = np.arange(300000000)
numpy_sigmoid(x)
print(time.time()-start)
  • cupyのarangeとcupy.exp
def cupy_sigmoid(x):
    return 1/(1+xp.exp(-x))

start = time.time()
x = xp.arange(300000000)
numpy_sigmoid(x)
print(time.time()-start)

実行結果

何秒かかったか以下に示します。

80.69074440002441

  • numpy

5.5577309131622314

  • cupy

0.0005419254302978516

numpyを使うことでかなり早くなってますね。
cupyは異次元です*2

まとめ

やはりGPUを使うと異常に早いですね。
chainer以外にもみなさんつかってみてください。

検証のソースコードは以下になります。

*1:sigmoidの返り値があまりきれいではない。リスト内包表記とかでもう少し早くなりそう

*2:ただしGPU Memoryを7709MB使用した

jupyter notebookのextensionのgist-itについて

アドベントカレンダー7日目の内容です。

今回は、jupyter notebookのextesionにあるgist-itについて書いていきます。

Jupyter notebook extensionsについて

jupyter notebookの拡張機能です。
ソースコードを畳めたり、autopepが使えたりします。
インストールはこちらから。
github.com

gist-it

あっという間にgistにソースコードを上げられます。
githubよりも気軽に、ブログにソースコードを埋め込むときにも使いやすいです。
前回の記事でのソースコード埋め込みにも使用しています。

jupyter notebookのextesionsで有効化すると、ここにボタンが出ます。
f:id:looseleaf0727:20171208004001p:plain

gistへの上げ方

さっきのボタンをクリックすると、こんな感じの画面が出ます。
f:id:looseleaf0727:20171208004238p:plain

よくわからなければ、何も入力せずに右下のGist itを押しましょう。
するとこんな緑の表示が出るので、リンクをクリックしましょう。
f:id:looseleaf0727:20171208004415p:plain

リンクに飛ぶとこんな感じで公開されています。
f:id:looseleaf0727:20171208004552p:plain

ブログへの貼り方

ブログに貼りたい際には、先程の画像の右上のEmbedのところをコピーしてブログにそのまま貼ります。
こんな感じに表示されます。

楽にコードを共有できて、jupyterを使っててブログを書くときには便利なのでおすすめです。

matplotlibで円グラフを描画する

アドベントカレンダー6日目です。
adventar.org

matplotlibで円グラフを描画する

pythonで円グラフを描画したくて、matplotlibを使いました。
その際にいろいろいじって試したりしたのでそれについて書きます。
ソースコードは以下にあります。


描画の準備

使うライブラリのimport

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter

データの準備

1000までの乱数を生成し、それを10倍し、int型に変換することで0~10の整数を1000個作成します。

ary = np.random.rand(1000)
ary *= 10
ary = ary.astype(int)

数値の出現回数を数え、それを出現回数順に並び替えます。

count = Counter(ary)
ranked_data = count.most_common()

ラベルとデータを切り分けます。

labels = [x[0] for x in ranked_data]
values = [x[1] for x in ranked_data]

ここまでがデータの準備でした。

使用した機能

  • plt.axis('equal')

図が楕円になるのを真円に直す

  • plt.figure(figsize=(5,5), dpi=100)

図のサイズを指定、dpiを変える

  • plt.title('pie')

図のタイトルを指定

  • plt.savefig("pie.png",bbox_inches='tight')

図の保存、きれいにできるようにする

  • plt.subplots_adjust(left=0, right=1.2)

凡例を作るためのスペース作成

  • plt.pie(values, startangle=90, counterclock=False, autopct='%.1f%%', pctdistance=1.15)

円グラフのスタート位置を指定、データを大きい順に、割合表示、割合の表示位置指定

まとめ

円グラフも描画するだけなら一瞬ですが、きれいに描画するのは色々大変です

gitlabのissue templatesについて

アドベントカレンダー五日目です。
adventar.org

今日はgitlabのissue templatesについて書いていきます。

issue templatesについて

issue templateがあると、templateを選択してissueを書くことが出来ます。
今回はBugというテンプレートを追加しました。
f:id:looseleaf0727:20171205235859p:plain

選択するとテンプレートがDescriptionに表示されます。
f:id:looseleaf0727:20171206000001p:plain

issue templatesの追加方法

まず、トップディレクトリに .gitlab/issue_templates を作成します。
f:id:looseleaf0727:20171206000116p:plain

あとは、テンプレートの名前を決めてmdファイルを作成し、
中身をマークダウンで記述、コミットするだけでそれ以降テンプレートが選択できるようになります。
f:id:looseleaf0727:20171206000347p:plain

まとめ

とても簡易にissueのテンプレートを作成できて、
issueが見やすくなるのでお薦めです。

scikit-learnのconfusion matrixとclassification reportについて

アドベントカレンダー四日目です。
昨日に引き続き、scikit-learnの話をしていきましょう。

confusion matrix

必要なライブラリのimport

前回同様numpyと、
訓練データとテストデータを分ける train_test_split、
学習に使うデータの load_digits、
SVM
新たにconfusion matrixとclassification reportを読み込みます。

import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.datasets import load_digits
from sklearn import svm
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report


データの取得と分割

同じ流れですが、学習に使うデータを読み込み、次にデータを分割します。
digits.dataでデータが、digits.targetでラベルがとれます。

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)


学習と評価

とりあえず学習します。

clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)

そして、未知データを分類します。

predict_label = clf.predict(X_test)


confusion matrixの表示

confusion matrixを表示します。
これを見ることで、正しいラベルにどれくらい分類されたかが確認できます。
こちらのサイトが参考になるので見てみてください。
混同行列(Confusion Matrix)

print(confusion_matrix(predict_label, y_test))

[[40  0  0  0  0  0  1  0  0  0]
 [ 0 39  0  0  0  0  0  0  2  0]
 [ 0  0 47  0  0  0  0  0  0  0]
 [ 0  0  0 45  0  0  0  0  0  0]
 [ 0  0  0  0 44  0  0  2  0  0]
 [ 0  0  0  1  0 42  0  0  0  0]
 [ 0  0  0  0  0  0 43  0  0  0]
 [ 0  0  0  0  0  0  0 42  0  0]
 [ 0  3  0  1  0  0  0  0 53  2]
 [ 0  0  0  1  0  1  0  1  1 39]]


classification report

今度はclassification reportをみてみましょう。
予測結果の評価に使います。
F値 - 機械学習の「朱鷺の杜Wiki」

print(classification_report(predict_label, y_test))

             precision    recall  f1-score   support

          0       1.00      0.98      0.99        41
          1       0.93      0.95      0.94        41
          2       1.00      1.00      1.00        47
          3       0.94      1.00      0.97        45
          4       1.00      0.96      0.98        46
          5       0.98      0.98      0.98        43
          6       0.98      1.00      0.99        43
          7       0.93      1.00      0.97        42
          8       0.95      0.90      0.92        59
          9       0.95      0.91      0.93        43

avg / total       0.96      0.96      0.96       450


まとめ

いい感じの関数がscikit-learnだと一瞬で使えてすごいですね。
今度はこれを図で描画したいですね。