したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

CS231n: Convolutional Neural Networks for Visual Recognition

52karino2:2017/05/21(日) 14:30:36
一貫してC, H, Wの順番だからこれであってるっぽいなぁ。
まぁいいや、どうせインプットのサイズはいつも正方形だから。

53karino2:2017/05/21(日) 15:09:48
spatial batch normalizationおしまい!
よし、これでcnn.pyも終わったぜぃ。

54karino2:2017/05/21(日) 19:47:55
GPUインスタンスを作ってTensorflowコードを実行してみた。
次は実際に自分でモデルを作る所。よしよし。盛り上がってきたぜ!

55karino2:2017/05/21(日) 19:53:56
自分の書いたコードを参考にしたいのと、最初の試行錯誤はGPUインスタンスじゃなくてもいいや、と思いCPUインスタンスの方に変更。

56karino2:2017/05/21(日) 20:04:51
少しTensorflowの勉強もしたいので、お隣のCS 20SIの方の最初の方の奴を軽くやる事にする。

http://jbbs.shitaraba.net/bbs/read.cgi/study/12706/1489317317/l50

57karino2:2017/05/21(日) 21:45:07
ひとしきりつついてだいたい分かったのでCNNの例を見直してみる。
strideが[1, 2, 2, 1]ってなんじゃ?とドキュメントを見ると、最初と最後の1はそれを入れとけ、という物らしい(なんじゃそりゃ)

https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

reshape([-1, 5408])の-1はバッチサイズになるのだろうな。(サイズのinferとしても使える、とある)

https://www.tensorflow.org/versions/r1.2/api_docs/python/tf/reshape

58karino2:2017/05/21(日) 21:53:53
onehot(y, 10)
はちょっとわかりにくいが、10がdepth、つまり結果の次元で、
0なら [1, 0, 0, 0, ..., 0]
が、
1なら[0, 1, 0, 0, ..., 0]
が、
という風なベクトルに変換されるという事っぽいな。

https://www.tensorflow.org/versions/master/api_docs/python/tf/one_hot

59karino2:2017/05/21(日) 21:57:32
reduce_meanはただmeanをとるだけっぽい。

これで一通り分かったかな。

60karino2:2017/05/22(月) 12:44:53
spatial_batch_normalizeはこちらを参考に考えている。

http://codegist.net/code/tensorflow-spatial-batch-normalization/

betaの次元は多次元でいいのかなぁ。inputをreshapeしなきゃダメか?

61karino2:2017/05/22(月) 12:57:53
gammaは各depthに対してスカラーでいいのかなぁ、とConvolutionalNetworks.ipynbを見直していると、こちらもそうなっている。
下の実装を見るとbatchnorm_forwardにはスカラーを渡していて、でもこいつはベクトルが来ると誤解している感じになっている(で、ブロードキャストされるのだろう)
batchnorm_backwardもブロードキャストされそうなので、これはこれでいいのか。

62karino2:2017/05/22(月) 13:28:26
おぉ、MaxPool2Dはkerasか!自分で書くのか!
仕方ない、書くか。

63karino2:2017/05/22(月) 13:30:41
max_pool2dがあったヽ(´ー`)ノ

64karino2:2017/05/22(月) 13:33:49
出来た〜
次はGPUインスタンスか。その前にファイルをサルベージするかなぁ。

65karino2:2017/05/22(月) 16:44:57
no gpu found、と言われたのでインストラクションに従いinstall_cuda.shを実行。

http://cs231n.github.io/gce-tutorial/

notebookを再起動したら無事認識。

66karino2:2017/05/22(月) 17:14:31
lossがnanと言われた。
cross_entropyを提供されてる2レイヤーの方の例に適用=>OK
RMSPropのoptmizerを提供されている2レイヤーの方に適用=>OK
batch normalizationをコメントアウトして試す=>OK

spatial batch normalizationか。

67karino2:2017/05/22(月) 17:31:48
sample_meanなどを返すべき所でmoving_mean返してた。
無事解決。

68karino2:2017/05/22(月) 18:12:15
running_meranなどの値が0だ。これはassignで更新しているつもりだが更新されてない。
なんかそんな事CS20SIの方で言ってたな。オペレーションが出来るだけで実行されないんだっけ。

さて、関数の中の方で値を更新したい時はどうすれば良いのだろうか?

69karino2:2017/05/22(月) 19:45:15
結論、session_runに渡した変数しか更新出来ない。
という事でrun_modelを書きなおす。

さらに
def update_running_mean():
op1 = running_mean.assign(momentum * running_mean + (1 - momentum) * sample_mean)
op2 = running_var.assign(momentum * running_var + (1 - momentum) * sample_var)
with tf.control_dependencies([op1, op2]):
return tf.identity(running_mean), tf.identity(running_var)

とかやる。こうしてassin_opをdependenciesにしたrunning_meanやrunning_varをrunに渡せばOK。
2時間くらいかかった…

でも無事全部動いたぜ!やった〜〜〜!

70karino2:2017/05/22(月) 19:48:16
この辺と

https://confluence.slac.stanford.edu/pages/viewpage.action?pageId=213897811

この辺が参考にはなった。

https://blog.metaflow.fr/tensorflow-mutating-variables-and-control-flow-2181dd238e62

71karino2:2017/05/22(月) 20:16:35
全部終わってみた感想。

まず全体的に、numpyでほぼスクラッチから実装するのに近い内容だった。
ただ面倒な所はいい感じに既にコードがあるので、自分でやれば全部作れるな、と思わせつつ面倒は無い、という絶妙なバランス。さすが。
実装内容は画像識別でCNNに、間のレイヤーはConvolution、MaxPool、ReLU、batch normalization、softmaxくらいで、dropoutもやる。
最先端一歩手前のスタンダードになっている手法は一通り網羅出来ているんじゃないか。

予備知識としては簡単な機械学習とPythonくらい、また偏微分のchain ruleはbackpropagationの為に必要。
特にchain ruleはバッチ正則化の所でかなりの量の計算を自分でやる事になり、この次元とかを確認するのに行列の挟むかなりややこしい計算をする事になるので、結構な計算力が要求される。
バッチ正則化は元論文も読む必要があって、かなりの力量を要求されるんじゃないか。

なお、バッチ正則化と最後のTensorflowのcomplex_modelを作る問題だけが極端に難易度が高く、自分でいろんな事を考えて書かないといけないが、この二つ以外の難易度は低い。
この二つの問題を捨てればコースの難易度は一気に下がる。

numpyでの書き方とかが手慣れていて、さすがに勉強になる。
ブロードキャスト使ってばこっと行列計算するのは良いね。RやOctaveにも遜色ない気がする。

最後にPyTorchかTensorflowの好きな方使ってモデルを作って同じ事やってみよう、というのがあるが、これは本当に最後のちょっとで、資料もほとんど付属していない。
コード片があるので、あとはTensorflowとかのドキュメント調べて自分で頑張って、という感じだった。
自分は前にCS 20SIのTensorFlow関連

http://jbbs.shitaraba.net/bbs/read.cgi/study/12706/1489317317/l50

を一通り読んでたけど、それでも大苦戦だった。
ただ、最後には全部出来たので、自分くらいの実力ならちょうど苦戦する、くらいの難易度とも言える。

72karino2:2017/05/22(月) 20:24:33
さて、コースについての印象。
今時ならバッチ正則化を自分で書く事も無いし、いちいちnumpyでスクラッチから実装するのとか、一部のマニアだけの趣味の世界だろ、と思ったが、そうでも無かった。
最後にTensorflowで標準的で結構複雑なCNNのモデルを作るのだが、当たり前の事だけど一発で動かない。
ドキュメントの出来も悪くて、結構中を理解してないとどう使ったらいいか分からないAPIも多い。

この時に、全部の実装を自分でnumpyで書いてあると、それを見ながらデバッグ出来て良い。
実際バッチ正則化の周辺は何度も自分のコードと見比べてデバッグしていった。

Tensorflowは、ブラックボックスとしてただ他で書いてあるのを適用すると、ちょっと動かなかった時にかなりお手上げな状況になってしまう気がする。
トレーニング周辺のコードがごついので、モデルの所をデバッグするのが相当難しい。
だから結局簡単なケースをnumpyで実装して比較するのは、当初思っていたほど無駄な作業でも無かった。
必須かどうかまでは分からないが、自分くらいのレベルのプログラマならやっておいた方が良さそう。
という事でとても勉強になった。

また、最初は少ないデータでオーバーフィットを試す、とか、選択肢がいっぱいあるなかで実務的にはこれ、みたいな現時点での結論を断言してくれる所とか、実際に作業する時にはとても参考になる事がたくさんあった。
コードの構成も手慣れているというか、なるほど、こうすればモデルの所とか簡単に差し替えられるように作れるのね、みたいな事はいろいろ参考になった。

全体としては、凄く難しいコースだったが、それだけの物はあった。
大分現代的なCNNを自分で自由に作れるようにはなる。

ちょっと難易度を落としたいならbatch normalization、spatial batch normalization、そしてTensorflowのcomplex_modelの所は飛ばして、ここだけ他の方法で学ぶと良いかもしれない(が他の方法は自分は知らない)


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板