機械学習とその他

機械学習したいマン

chainerで画像分類しようとして躓いた

TypeError: Argument 'a' has incorrect type (expected cupy.core.core.ndarray, got numpy.ndarray) 

というエラーがでて学習が出来なかった。

渡すのがcupyじゃなくてnumpyの配列になってる?って確認しても、ちゃんとcupyになっていてイマイチわからなかったが、解決したのでメモしておく。

1epochが終了するたびにモデルを保存するようにしていて、
以下のようにソースコードを書いていた。

model.to_cpu()
chainer.serializers.save_npz("model"+str(epoch+1), model)

しかし、これではmodelをcpu用に変換したままになっていたためエラーを吐いていたのだ。
model.to_cpu()を削除することでも解決できるが、とりあえず今回は以下のようにgpu用に変換することで解決した。

model.to_cpu()
chainer.serializers.save_npz("model"+str(epoch+1), model)
model.to_gpu()

作ったお菓子とその失敗

最近久しぶりにお菓子作りにはまっていてよく作るのだけど、適当な性格がお菓子にまで反映されていて辛い。ということで作ったお菓子の写真とその失敗点について述べて今後に活かそうと思う。

レアチーズケーキ

まあこの失敗はわかりやすいものでクッキーの底の生地が砕けているのである。理由として二点ほど挙げることができる。まず底が抜ける型を使わなかったということ。もう一つは底に敷いた時点で少し緩かったのだが、ケーキ生地を入れたら重みで固まると考えていたことがある。

f:id:looseleaf0727:20170625215657j:plain


フォッカチャ

これは生地の時点での写真となってしまうが気にしないで欲しい。じゃがいもを練り込むのだがそれが粗すぎて普通に見えてしまってること、生地を保存しすぎて水気が出てしまったことが問題となった。

f:id:looseleaf0727:20170625215653j:plain

 


チョコチーズケーキ

これは全体的にうまくいっているように見える。しかしレアチーズケーキと同様に底が抜ける型を使わなかったのできれいにくり抜くことができなかった。また、表面のチョコレートとクリームをある程度混ぜて置かなかったため、チョコレートが表面で固まってしまい、切るときに問題になってしまった。
f:id:looseleaf0727:20170625215655j:plain


 

焼きチョコ

これは失敗なのかどうか微妙なところなのだが、チョコの配分量を2gほど多くしたら少し甘すぎるという意見を頂いた。これは2g追加したチョコの影響によるものなのか、ビターチョコを使ったがそれがまだ甘すぎたのかはわからない。

f:id:looseleaf0727:20170625215651j:plain


スコーン

これは極めてかんたんなレシピであったため、特に大きな失敗はなかった。

f:id:looseleaf0727:20170625215649j:plain


トーショコラ

この失敗は小麦粉をふるいにかけなかったことで、少しダマができてしまったことである。しかし、最終的に完成物を食べたときにはあまりわからなかった。

f:id:looseleaf0727:20170625215647j:plain

 

まとめ

雑な性格によりまあいいやろって感じでやって失敗していることが多い。レシピに忠実においしいものを作っていきたい。

技術書典2に行ってきた

今日は雨の降る中、技術書典2に行ってきました。

 

techbookfest.org


 

技術書典2は、技術書オンリーイベントで、朝11時からアキバ・スクエアでの開催です。

事前情報として、10時から列形成を行う、前回行われた技術書典では入場が遅くなると技術書が売り切れてしまう、ということを聞いていたので10時にアキバ・スクエアに到着するようにしました。

情報通り、10時から列形成が行われ、最前列で待機しました。

開始までの1時間列で待ち、その間には1冊1000円で技術季報の販売と先着でトートバッグの配布が行われました。

 

11時過ぎに入場になりました。

様々なジャンルの技術書があり、レベルも本の密度もサークルによってまちまちでした。

今回購入した本は以下のものになります。

 

技術季報

f:id:looseleaf0727:20170409174810j:plain

 

SIG2D'16 二次元情報処理

techbookfest.org

 

f:id:looseleaf0727:20170409174815j:plain

論文のレジュメのような読み慣れた形式で、情報処理について書いてありました。

敵対的生成とかに興味があったので買いました。

 

L0

techbookfest.org

f:id:looseleaf0727:20170409174816j:plain

キャラの抜き出しや深層学習によるポケモンのタイプ分類に興味を惹かれて買いました。

 

TensorFlowはじめました Super Resolution - 超解像

techbookfest.org

f:id:looseleaf0727:20170409174818j:plain

TensorFlowによる超解像についてソースコードもついていたので。

処理を変えながらの推移を見れるのもよかったです。

 

BIG MOUTH DATA 2017 SPRING

techbookfest.org

f:id:looseleaf0727:20170409174812j:plain

機械学習について結構細かく書いてあります。

プロジェクトの始め方から分析まで書いてあってよかったです。

 

SIGNAL Machine Learning In Business

techbookfest.org

f:id:looseleaf0727:20170409174814j:plain

ほんとは冊子がよかったのですが、諸事情あったらしくPDF配布でした。

浅く広く書いてあり、今までディープラーニングを勉強したことがない人も読みやすいとおもいました。

 

入場から30分程度であらかた見終えることができ、

早く入場して、早く会場から出るのが一番かなと思いました。

列に並ぶのが遅かった人は雨の中外で並ばせられていたので。

 

もっとサークルや参加者が増えたら大変かもしれませんが、

もっと楽しいかなと思いました。

 

f:id:looseleaf0727:20170409174808j:plain

chainerのptbを使って集めたデータから文章生成2

前回はこちらから
looseleaf0727.hatenablog.jp

前回文章の生成まで一応至ったわけですが、
生成された文章は文法的にも微妙なものでした。
原因として学習不足、データの質の低さなどが考えられるのでいろいろ試してみました。


まずは学習不足が考えられたのでとりあえず学習を進めてはみましたが、
そこまでの変化は見られませんでした。
なので、データの質をあげることをメインに行いました。


学習データはあるユーザーのツイートにしたのですが、
プログラムの自動ツイートなどが含まれていたのでそれを削除しました。
また、URLなども正規表現で置換し、学習データから削除しました。
それに伴って、異常に文章が短い行などが出てしまったので、文字数が5文字以下の場合には学習データから削除しました。


次に形態素解析の質について考えてみました。
前回はmecabを使って形態素解析を行い、単語の分割をしました。
今回はYahoo形態素解析APIを用いて単語の分割を行ってみました。
developer.yahoo.co.jp


ファイルを開き、一行ずつAPIに投げていき、返ってきた結果を新しいファイルに保存しました。
これもpythonで行いました。
これで少し質のあがった学習データが出来上がったのでこれで学習を進めていきます。


seed値を指定することで同じワードでも違う文章を生成できることにようやく気付きました。
とりあえず学習途中での文章生成結果です。

python genetxt.py -m Model/model130000.model -v vocab.bin -s1 -p私
私は今度ご飯なのかな……カワイイけどさ、みんなゆらしてくるの 久しぶりに しまじろう


もうすこし学習を進めたときの文章生成結果です。

python genetxt.py -m Model/model1300000.model -v vocab.bin -s1 -p私
私はいつでもですもん!!! 先輩のアイコンめっちゃ見たくないからやめてくれ ルンパツパ


seed値も変えてみましょう。

python genetxt.py -m Model/model1300000.model -v vocab.bin -s523121331 -p私
私がそうになってきたのか………… こわーい´・ω・`


前回よりはちょっとまともになったようなそうでもないような・・・。
今後は単語とseed値を入力して試せるページを作ろうかなと考えてます。

あと前回定期的にモデルを保存するようにコードを変えましたが、
放置して学習させ続ける人はモデルがすごい勢いで生成されてしまうので気を付けましょう。
私はディスクの容量を食いつぶしてました。
保存するペースを遅くしたほうがいいかもしれません。

chainerのptbを使って集めたデータから文章生成

chainerのptbつかって文章生成を試したので次やるときに忘れないように手順をメモ。

今回は自分のあるフォロワーさんのような文章を生成しようとしました。
使ったchainerのサンプルはtrainingとかimportしないころの少し古いやつです。

前提条件としてchainerのインストールは終えてます。
chainer自体のインストールは超簡単です。
GPUを使うには設定が面倒なのでめんどかったらなくてもいいと思います。

今回はフォロワーさんっぽい文章ということで、twitterから学習データを集めました。
素人なのでコードの汚さとかは許して下さい。
tweepyを使ってツイート内容を取得し、テキストファイルに保存しました。

#!/usr/bin/python
#-*- coding: utf-8 -*-
import tweepy

#認証を行う
consumer_key = "hoge"
consumer_secret = "huga"
access_token = "foo"
access_secret = "bar"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

f = open("out.txt","w")

for p in tweepy.Cursor(api.user_timeline,id="取得する人のid").items(3200):
    f.write(p.text+"\n")

f.close()


これで一応ツイート内容がファイルに保存されました。
単語や品詞に区切る必要があるのでmecabを使います。
コマンドも参考にしたブログと同じです。

$ mecab out.txt -F "%m "|sed -e "s/EOS//g" > train.txt


一応文章が区切られているか確認します。
そして生成された文章を適当にptb.test.txtとptb.train.txtとptb.valid.txtに分割します。
trainを一番多くしてほかは1割ずつくらいに割り当てました。
chainerのexampleのptbフォルダに3つとも移します。


定期的にモデルを保存させるために少しtrain_ptb.pyを書き換えました。
これもブログを参考にしました。
152行目あたりの最後にモデルの保存部分を追加します。

if (i + 1) % 10000 == 0:
    now = time.time()
    throuput = 10000. / (now - cur_at)
    perp = math.exp(float(cur_log_perp) / 10000)
    print('iter {} training perplexity: {:.2f} ({:.2f} iters/sec)'.format(
        i + 1, perp, throuput))
    cur_at = now
    cur_log_perp.fill(0)
    serializers.save_npz('model%04d' % (i+1)+'.model', model)
    print('save model'))


最初はepoch数もデフォルトで学習させてみます。

$ python train_ptb.py -g 0 


そして学習が終了したら文章生成も試しましょう。
今回は文章の始まりを私にしてみます。

$ python genetxt.py  -m model10000.model -v vocab.bin -p 私
私 の フォロワー だ よ  それ は なく て 効果 ない の に 気づい た … … ちょ から

始まりを人にしてみます。

$ python genetxt.py -m model10000.model -v vocab.bin  -p 人
人 を たべる し 買っ て 好き に どう 10 の わかん て ない の か し … … ボーダー を


いまいちよくわからん文章になってますね。
原因として考えられるのは、

  • 学習データが悪い
  • ループが足りない

URLとか人の名前とか削除したほうがいいのかもしれない。
今回の出力は一番最初のモデルでやってるのでそれの影響も大きそう。


というわけでepochを増やしてみて、次に学習データも少し変えてみたいと思います。

参考にしたブログ
http://www.kabipan.com/computer/twitter/
Chainerのptbサンプルを解説しつつ、自分の文章を深層学習させて、僕の文章っぽい文を自動生成させてみる - shi3zの長文日記

深層学習 勉強会5章~7章

今日は深層学習の勉強会をしました。

 

5章後半と7章前半だったかな?

CNNの勾配計算の話が一つ、あとはRNNの話でした。

 

CNNは前回の続きだったのでほぼ数式的な話でした。

CNNは畳み込みニューラルネットワーク (Convolutional Neural Networks)のことで、

画像系の深層学習でよく使うやつですね。

RNNは再帰ニューラルネットワーク(Recurrent Neural Network)のことで、

言語系とか、時系列関係あるときに使うやつですかね。

 

imagenetとか画像なんかは時系列的なことは関係ないと思うんですが、

音声だとか言語とかで、

次に繋がるであろう言葉を推測するときには一つ前のデータが関係するわけです。

今回スライドで出た例なんかは「ガルパンは」いいぞという内容でしたが、

ガルパン は」と来ると次の単語のいいぞが推測出来るわけです。

こういう時系列に意味を持つ場合にRNNを使うみたいです。

一般的なニューラルネット再帰型を見比べるとわかりやすそうですね。

 

順伝播計算はもちろん前の内容に影響を受けます。

逆伝播はなんだか相変わらずわかりにくいですね。

 

言語処理とかでLSTM使う場合が多いですが、

そういう人はRNNのお勉強がいるんですかね。

 

お勉強会のスライドは公開していいのかわかりませんが、

slideshareにめちゃわかりやすいスライドがあるので見ましょう。