ゆるぅくプログラミング
おつかれさまです。
アメリカの生活と仕事が忙しくなってしまい、ずいぶん沈黙していました。ディープラーニングなり、プログラミングの勉強は続けているものの、まとめて記事にする暇がなく、知識とかノウハウがぶん投げジャーマンDDT状態になってしまっていて、ちょっとよろしくないなぁと思っていたところです(4ヶ月ぐらい)。
以前のように体系的にまとめることはできないけども、短くても何かしら勉強したことを残しておきたいと思います。ディープラーニングに限らず、Pythonの書き方だったり、プログラミング全体のことだったり。書き方忘れてすぐググるちっさいネタとかが多くなりそう。
Tensorflowについて
※途中まで書いたけど続きを書く余裕がなくなった(でもせっかく書いたので公開)
フトシ
【Python】Excelを操作
Pythonで処理した結果をExcelで出力したい、ってシチュエーション、あるよねっ!…あるよねっ!そんなときはopenpyxlというライブラリを使うとできます。
まずはライブラリをインポート
import openpyxl
編集するには、まずワークブックを準備します。(名前は何でも良いのです、今回はwbってした)これがExcelファイルそのもの、みたいな感じ。
wb = openpyxl.Workbook()
次に編集するシートを設定します。
sheet_america = wb.active
sheet_america.title = 'america'
「ワークブックのアクティブなやつ!をシートに設定するぞ」って感じ、名前は何でも良いのです。(sheet_americaに意味はない)あとシートのタイトル「america」も設定しています。
更に内容を書き込むセルを設定します。
sheet_america.cell(column=1, row=1, value='test')
これで1行1列のセルにtestって文字が入力されます。Excelでいう「A1」ですね、Excelでのセルの数え方は「1」スタートなので注意。
新しいシートを作成したいときは、
sheet_futoshi = wb.create_sheet('futoshi')
これでOK、futoshiって名前のシートが作成されて、このシートがアクティブになります。そのままセル編集へGO。
最後にこのワークブックを保存します。
save_dir = 'hoge/hoge/hage' wb.save(save_dir + '/test.xlsx')
【Python】プログラムを途中で止める
コードを書いていて、うまく動くか確認しているとき、「ここまでのコードがちゃんと書けてるかを確認したい!ここから先は動かなくていい!全部走らせると時間がかかるの!」というときに使っています。
sysというライブラリをインポート
import sys
止めたいところで下記のコードを挿入
sys.exit()
カンタン:)
動作確認が終わってから消すのを忘れてて、よく「なんで途中でとまるのぉおおおお!!!(憤死」ってなります。
フトシ
Tensorflow:線形回帰
おつかれさまです。
Tensorflowを使い始めたので、これまで書いてきたディープラーニングのプログラムを書き直してみたいと思います。今回は線形回帰のこの問題をトライ。照らし合わせながら新しいコードを確認してもらえると幸い!
shachicode.hatenablog.com
CONTENTS
データセット
Tensorflow関係なく、データセットは相変わらず自作します。値も以前と同じで「y=2*x+5」に沿う直線を形成します。
import numpy as np import matplotlib matplotlib.use('tkagg') from matplotlib import pyplot as plt num_of_sam = 30 x = np.random.uniform(0, 4, num_of_sam) t = 2*x+5 noise = np.random.normal(0, 0.5, num_of_sam) t = 2*x+5+noise
matplotlibのimport記述がなんか変ですね。Anacondaでtensorflowをインストールした際にopenCVという画像関連のライブラリもインストールしてしまったんですが、こいつがどうもmatplotlibとケンカしているみたいで、今までのimport文だとエラーが出てしまいます。そこで上記のような呪文を唱え、エラーを回避しています。tensorflowの本筋ではないのでふーんぐらいで流してもらえればと思います。ではさっとプロットしてみます。
plt.figure() plt.plot(x,t) plt.show()
計算グラフの作成
さて、ここからTensorflowを使い始めます、まずはインポート。
import tensorflow as tf
Tensorflowはあらかじめ処理を記述し、セッションと呼ばれる範囲の中で実際に演算が行われる、ようです。まだ使い始めたばっかりなんで詳しいところは分かりません。このあらかじめ記述される処理が「計算グラフ」と呼ばれるそうです。計算グラフはちゃんとした定義と書き方(表現の仕方)があるんですが、そこまで突っ込んで考えていると長くなるので、「処理を記述するところ」ぐらいの認識でとどめておきます。
まずは必要な変数を設定していきます。
Tensorflowでは外から代入する変数(今回はxとtが対応)を使うためにはplaceholderという変数を用います。そのまま使えないのがややこしいところです。
holder_x = tf.placeholder(tf.float32) holder_t = tf.placeholder(tf.float32)
holder_x にx、holder_tにtが代入されます。この時点でこれらのplaceholderはまだ空の箱の状態で、セッション内で具体的に変数が代入されます。「tf.float32」は少数が入りまっせ、ということです。
次に、処理の中で自発的に設定される変数(ここではwとbが対応)にはVariableを用います。
w = tf.Variable(tf.random_normal([1],mean=0.0, stddev=1.0)) b = tf.Variable(tf.random_normal([1],mean=0.0, stddev=1.0))
random_normalを使って初期値はランダム(mean=0.0, stddev=1.0)に設定します。今回、変数は行列にする必要はないので[1]です。ちなみに、この変数は逆伝搬で更新の対象になります。
これで変数の設定が完了です。次に純伝搬の処理を記述します。
y = holder_x * w + b
この線形回帰なので活性化関数は不要です。すでに初期変数の設定は完了しているので、ここはそのまま変数の演算で記述できます。
次に損失関数の設定です。回帰問題は損失関数に二乗和誤差を使ってましたね、懐かしい。
この式をTensorflowで書いてみます。
loss = tf.reduce_sum(tf.square(y - holder_t))
reduce_sumはシグマ、tf.squareは2乗を記述しています。
逆伝搬計算
Tensorflowの逆伝搬はヤバい、何がヤバいってなにも考えなくていい、言い過ぎた、ほとんど考えなくていい。とりあえずコードを書いてみます。
optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)
学習を実行するには逆伝搬するための「微分式」と「更新手法」が必要でした。更新手法はもとのプログラムと同じ「勾配降下法」を用います。損失関数(今回はloss)が減少していくようにパラメータ(wとb)は更新されていきます。
この2行ではoptimizerでパラメータの更新手法(ここではGradientDescentOptimizer:勾配降下法で学習率0.001)を設定してあげて、損失関数(loss)を減少(minimize)させましょう、という記述です。
ハイおわり、
...おわり!??何なの微分しなくていいの??「w = w - u*dw」とかいらないの??
最初はかなり動揺しました、tensorflowはこれで全ての逆伝搬処理を実行してくれます。めっちゃ頑張って微分してたあの日々は何だったのか、というかこれだけの記述で自動で逆伝搬を実行してくれるTensorflow とはいったいどんな構造になっとんねん、Google天才やんけ、とにかく感動しました。
とりあえずこれで逆伝搬が完成です。
セッションの実行
実際にTensorflowの計算するためにはセッションを実行する必要があります。下記の1行でセッションの準備が整います。このwithの中で具体的にセッションを実行させます。
with tf.Session() as sess:
セッションの実行をsessという変数(のようなもの)で置き、各計算結果が欲しい場合「sess.run」としてその結果を得ます。
とりあえず進めていきましょう。まずはお約束ごとで、Variable変数(wとb)を使用する場合はその値を初期化する必要があります。
sess.run(tf.global_variables_initializer())
呪文みたいなもんです、パラメータは更新の対象なのでその辺の兼ね合いなんでしょうかね。
次はイテレーションを設定します、回数はとりあえず3000回とします。ここはforの繰り返し処理を用います。
for step in range(3000): sess.run(train, feed_dict={holder_x: x, holder_t: t})
学習が進められてパラメータが更新される部分は、上記の逆伝搬「train = optimizer.minimize(loss)」のところなので、この「train」をセッション内で回します。このタイミングで、空っぽだったplaceholderに変数(xとt)を辞書形式で代入します。
学習が終われば、更新完了後の変数を取り出します。
weight = sess.run(w) bias = sess.run(b)
この処理はセッション内で記述しなければ具体的な値として取り出せないので注意です。
これで学習を行うコードの記述が完了しました、こんな以前と比べてあっさりと終わってしまったのでホンマに大丈夫なんかと不安になります。
グラフ化
学習後のパラメータも取り出せたので、これをグラフにプロットしてみたいと思います。
x_ = [0, 4] plt.figure() plt.plot(x,t,'.') plt.plot(x,x*weight+bias) plt.show()
めんどくs...、スピード重視のためグラフの体裁は整えてません笑 アニメ化も特にしてません笑
とりあえずうまくいったっぽいかな、自作プログラムとの比較をしたいところですが、早く先に進みたい(CNNの時間が短縮できるか確認したい)ので、基礎問題の結果表示はこの辺りにしてどんどん次に進めていきたいと思います。
ちなみに、純伝搬のlossまでは以前作った自前の計算プログラムと比較しましたが、値はうまく一致しました。そりゃ同じ計算式使ってんだから当たり前なんだけど、あのTensorflowさんと同じ結果が得られたってのはちょっと感動です。
まとめ
今回はTensorflowを使った初めての試みとして、以前に作成した線形回帰のプログラムをTensorflowでトレースしてみました。深く突っ込んで調査できていませんが、大筋うまくいってそうです。本当にあの2行で逆伝搬が実行されたのはびっくりしました。
次回は非線形回帰問題にトライします。
Tensorflowはじめました
おつかれさまです。
ディープラーニングの勉強を始めて、フレームワークには頼らずnumpy全力少年でいろいろなパターンの問題にトライしてきましたが、CNNの画像認識でPCのスペックが足りずにとんでもなく時間がかかってしまうという問題にあたってしまいました。GPUを導入するとよさげな雰囲気はあるものの、ハードもソフトもまたゼロからのスタートになるので、つらい。
解決策になるかどうかは分かりませんが、ここでnumpy全力少年は卒業して、以前インストールしたディープラーニングのフレームワーク:Tensorflowを使ってみようかと思います。
shachicode.hatenablog.com
まだ全然詳しくありませんが、このフレームワークではテンソルという計算ユニットを用いてある程度並列で演算処理が進められる、とかなんとか。藁をもすがる今日この頃、ちょっとでも前に進められるならトライしてみようと思い立ちました。いずれはフレームワークを使おうと思っていたので、ここがそのタイミングなのかもしれません。
とりあえず今までトライした問題をTensorflowで書き直してみて、具体的な使い方など見ていこうと思います。
発展問題
- MNISTの手書き数字の識別(シンプルニューラルネット)
PyQで寄り道
おつかれさまです。
ちょっとディープラーニングのネタからは離れて、少しPythonについての体験記をまとめたいと思います。…すいません、GPUの次の手が思いつかず、とりあえず道草くってるような感じです。
Python歴
Pythonに関して、私は独学マンです。ただ、1年ほど前に趣味的な感じで、なんちゃらスクール的なものに半年ほど通い、そこでRubyを使った簡単なWebアプリを作れるぐらいのスキルは身につけました。なので、プログラミング自体にアレルギーとかあったわけではありません。その後、アメリカに移住することが決まったので、スクールにはサイナラしてこっちでPythonをはじめました。Rubyで慣れていたとは言え、ほぼ素人がPythonの環境構築で心が折れなかったのはデカイと思っています(笑)。
独学勢あるあるに、「自分の欲しい情報だけを勉強したせいで知識が変調気味」ってのは上位の方にランクインしていると思います。私にもそのあるあるはしっかり上位にランクインしています。ちなみに1位は「できるマンとの接し方が分からない」ですかね(白目
なので、この知識の偏りを平らにしたいな〜ってのはずっと考えていました。めっちゃ時間かけて書き上げた20行ぐらいの渾身のアルゴリズムが、Pythonのデフォ機能でそれ1行で書ける乙wwwなんてこともよくあったので、けっこうロスタイムが深刻でした。
ということで、ディープラーニングの進捗が煮詰まってしまったこのタイミングで、ちょっと基礎勉強してみようかと思い、PyQというクエスト型学習サービスにトライしてみました。(結局、長続きしなかったんですが…)
PyQとはどんなもんか
Pythonについていろいろ調べていると、ちょくちょくこのPyQという名前を見る機会があったので気にはなっていました。ざっくりまとめると、
という感じです。料金はスタンダードプランとやらで、1ヶ月あたりだいたい3000円です、上のプランだとだいたい8000円で個別に質問対応してくれるのだとか。私にはこれが高いのか安いのかよく分かりませんが、何ごともやってみないと分からんので、こんなもんハシタ金じゃあ!(もちろんスタンダード:3000円)と言ってイケイケドンドンで申し込みました。
PyQの感想
確かに、「ブラウザ上のみで学習でき、ややこしい環境構築が不要」ってのはその通りで、プランの決済が完了した瞬間からなんの準備もいらずにコードが書き始められました。これは本当に初心者の方にはすばらしく優しい仕様になっていると思います。初心者にとって環境構築がどれほど苦痛を伴う作業か…
逆に、個人的には既に自分のPCにPython環境がある手前、そんなに恩恵ないなぁ、と思ってしまったのも事実です。。あと、ブラウザのエディターは自分専用にカスタマイズされたものではないので、キーボードの手癖がついていると思った通りにインテンドとかされずに、逆にイラッとしてしまいます。
学習コンテンツ自体はよくできていると思います。カテゴリごとに例題がいくつかあって(同じコードだけど数字が違う、みたいな)、繰り返しトライすることで確実に身につくだろうし、体系的に知識が入ってきます。ほんで類題の数がめっちゃ多い。PyQを始めると、おすすめコースみたいなのがいくつか出てきます。もちろん私は「Python初心者コース」をチョイスしました。初心者コースなのでクエスト自体はそこそこ書けましたが、やっぱり2〜3割ぐらいは書けない、もしくはそんな書き方あったのか(驚愕)となり、知識変調が浮き彫りにされました。私の偏った知識がならされていくのが分かるので、よかったと思います。
PyQの苦手なところ
自分にとってはひたすら「写経」ってのがやっぱり飽きてきます。Pythonを始めたときは、割と強烈に「やりたいこと(ディープラーニング)」が具体的だったので、自分で情報を集めてきて構築して動かしてみる、という一連の流れにかなりエキサイトしていました。そのため、PyQのようにあらかじめ答え(書くべきコード)が決まっていると、レールの上を走るだけみたいで、どうしても窮屈に感じてしまいます。
そういう事もあって、やっぱ自分にはこのスタイルは向かないな、と判断し3週間で解約してしまいました、3週間坊主ってやつですね。ちなみに、次の決済までに残った日数分、日割りして料金が返金されました、これはすごいお客様親切。
まとめ
今回、PyQはあまり長続きしませんでしたが、これはレールを踏み外した私がなじめなかっただけで、Pythonの書き方をゼロから体系的にしっかり学びたいという人にとっては神のような存在です。これからPythonを学習したいという方には役に立つと思います。
「ほんで寄り道は分かったからお前次どうすんの?」ってところは今も考え中です。ディープラーニングにGPUを使うにはまずハードを調達しないといけない、GPUを使うための専用のコード(CUDA?)を覚えないといけない、というところまで分かりました。最悪、ハードはお金とAmazonを駆使すればなんとかなるかもしれませんが、知識の部分はけっこうハードルが高い…、そしてディープラーニングの内容からは少し離れるのでモチベーションも下がりそう…。
ってことで、ディープラーニングのアルゴリズムをイチから全部構築する、ってのはちょっと横に置いておいて、フレームワークを使ってみようかなと思っています。特に伝搬部分の計算がブラックボックス化してしまうかもしれませんが、学習を進めるために背は腹に変えられませぬ。今は私の貧相なコーディングが原因で計算時間がかかっている可能性もあるので、フレームワークを使うことで何処ぞのエラい人が作ったプログラムだとより最適化されてなんとかなる範囲に収まるのでは?と淡い期待を持っています。フレームワークを使いこなしてから、また内部のアルゴリズムに目を向けると今よりも速いスピードで理解できる部分が多いかもしれません。
とりあえず以前インストールしたTensorflowを使ってみようかなと思います。これも新しく学習する内容なので時間がかかるかもしれませんが、分かったところ繋ぎながらまた記事にしていきたいと思います。
フトシ
CNN:プログラムの評価&戦略練り直し
おつかれさまです。
前回までで作成したCNNのプログラムを実際に走らせてみます。
条件は「ミニバッチ数:100」、「学習率:0.01」、「イテレーション回数:3000」でとりあえずどんなもんか回してみます。すぐには終わりそうになかったのでとりあえず計算を走らせたまま寝ました。
翌朝、確認してみるとたしかに計算は終わっています。コチラ結果↓
おお、とりあえずうまくいってそうです。これはイテレーション回数がまだ足りてないパターンで、学習回数を稼げばもっと正解率は向上しそうです。
が、問題はその計算時間でした。
18282.343217134476
これは「秒」なので、60で割って「分」、もう60で割って「時間」、
…「5.08時間」!!マジか、ほぼ一晩やんけ。3000回でこれは時間がかかりすぎる。。。学習率を大きくすれば少ないイテレーション回数で正解率は上げられるかもしれませんが、なにせCNNは初めてなので「どの程度」なのかが検討も付きません。いくつがデータを取って、傾向を判断して、値を指定すべきです、
が、こんな時間かかってたらいくつもデータを取ってられねぇ!!
ちょっとこれはマジで困りました。この後、CNNの検討はプーリングと呼ばれる層を追加して、更にはチャンネル数も増やして、と計算地獄の所業が続きます。こんなもん耐えれるわけがねぇ。
これはニューラルネットのアルゴリズムを真面目に考える前に、GPUによる高速化を検討すべきかもしれません。少し戦略を練りたいと思います。(てかマジでGPUいるのか、、ここアメリカやぞ、でどうやって調達すればいいのか…Amazon??)
ん〜困ったorz