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

CS231n: Convolutional Neural Networks for Visual Recognition

23karino2:2017/05/16(火) 08:36:51
続き。

https://imgur.com/hPiKvyU.jpg

24karino2:2017/05/16(火) 09:05:53
dhiddenも。

https://imgur.com/tvIekuK.jpg

25karino2:2017/05/16(火) 09:09:01
これ、転置になったりするの、本当は行列演算でそのまま出せそうだよなぁ。

実務的には次元解析で良いって言ってたので、慣れてきたらそういうもんだ、で良いと思うが。

26karino2:2017/05/17(水) 16:26:17
transfer learningまで一通りレクチャーノート読み終わり。
凄い勉強になった。
CNNやDNNを触る気なら必見。

27karino2:2017/05/17(水) 20:19:28
さて、CNNのassignmentを見てみるか、と見てみたが、これって提供されているイメージじゃないと実行出来ないのかしら?
.envフォルダが無いっぽいが。assignment1の奴でactivateして試してみるか。
GPUインスタンスは必要になったら作る気でいるが、Question 5以外は要らないって言ってるからなぁ。

少し試してみてはまりそうなら、普通のインスタンスをイメージからもう一つ作ってしまおう。

28karino2:2017/05/19(金) 17:47:34
ではFullyConnectedから。
これもnumpyで自分で実装するのか。なかなか男らしいな。

bのbackwardでちょっと苦戦する。
bは足すだけだから、bの微分は当然1だよな。
でもdoutの次元とbの次元が違う。それはブロードキャストするからだ。
その時、bの値としては何が正しいのだろう?

Backpropagation, Intuitionsを見直すとsumを取るとしれっと書いてあるし、答えもそれで良さそうだが。
それぞれの経路でbをちょっと動かすとb1, b2, b3の三つの影響があるとして、全体に与える影響は?と言えばその合計か。
ちょっと納得した。

29karino2:2017/05/19(金) 19:36:24
svm_lossの模範解答のnumpy力が高すぎて凄い。
こんな風に書けるようにならんとなぁ。

30karino2:2017/05/19(金) 20:28:58
softmaxを実装してない気がするんだが、自分で実装しなきゃダメなのか?
softmax_lossがあるからほとんど同じ実装なのだが。

31karino2:2017/05/19(金) 20:41:19
あー、スコアってsoftmax取る前の値か。なるほど、softmax_lossだけでいいのね。

32karino2:2017/05/19(金) 21:42:08
solverの手前まで終わったので今日はここまで。

33karino2:2017/05/20(土) 11:17:21
accuracy 50%を一応達成。結構ぎりぎりだが。
2層ではこんなもんか。

34karino2:2017/05/20(土) 12:16:26
5レイヤーでオーバーフィットが全然しない。
なんかバグってるんじゃないか?という事を疑うレベル。

35karino2:2017/05/20(土) 12:23:28
ようやくオーバーフィットした。無茶苦茶ファインチューンやな(^^;

36karino2:2017/05/20(土) 14:14:20
なんかadamのnext_wのerrorが大きいなぁ。
next_w error: 0.00152184517579

まぁそのあとのグラフは正しそうなのでいいか。

37karino2:2017/05/20(土) 14:16:33
FullyuConnectedで最強のモデルを作ろう、の所まで来た。
ただ解説にはbatch normalizationとdropoutやってからの方がいいぜ、と書いてあるので、先にこちらに進む。

38karino2:2017/05/20(土) 15:03:59
バッチノーマライゼーションのbackpropは計算グラフ書いて自分で出せ、とかおっしゃる。

あんま自信無いが、これでいいのかな?

https://imgur.com/skrl7kz.jpg

39karino2:2017/05/20(土) 16:04:14
元論文を読むとdxは三つの項の和になっているなぁ。

40karino2:2017/05/20(土) 16:08:09
あー、そうか。これ、muとsiguma2もxから求めてるからか。
なるほど。
でもそれじゃあテストの時はどうするんだ?バッチサイズが無限大と考えてゼロにするのかな?

41karino2:2017/05/20(土) 16:43:41
https://imgur.com/t4Jamg2.jpg

これはさすがに面倒すぎじゃないか。

42karino2:2017/05/20(土) 17:03:24
ルートが深層学習の教科書ではイプシロンを含んでないが、元論文では含んでいる。
これで結果が異なるっぽい。

そして同じ事をやっている解説を見つけた。
https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html

やっぱりこんなになるよねぇ。

43karino2:2017/05/20(土) 17:37:39
教科書のミスを直して再計算。
論文と一致。

https://imgur.com/73YDppa.jpg

44karino2:2017/05/20(土) 19:21:09
やっと一致した〜〜!
計算ミスを潰すのに2時間くらいかかった…
凄い課題だなぁ。

45karino2:2017/05/20(土) 21:01:28
batch normalizationをfully connected netにつなげて実行してみた。
うぉー、すげー!結果が凄い変わるね。
ただvalidationロスはそうでも無いか。
つまりトレーニングセットに対して正しい評価関数は出来ている訳だな。

46karino2:2017/05/20(土) 22:00:16
dropoutの実装終わり。
確かにoverfitしてないようには見えるが、validationのスコアがあんまり変わらないような。
これはどうなのかなぁ。

47karino2:2017/05/21(日) 10:11:10
CNNの実装を開始。conv_backwardを実装しようと講義資料を見たら、導出は簡単、と書いてあるだけ(^^;
仕方ない。自分で導出するか。

48karino2:2017/05/21(日) 10:29:40
dwは自身の対象とするピクセルの和、だよな。
dbはいつも1か。
dxはどうなるんだろう?

49karino2:2017/05/21(日) 13:00:01
doutを反映してなかった。
でもこういうトラブルを追う過程で端から端まで検討しなおすのは良い勉強になるね。
で、max poolまでforwardとbackward終わり。

50karino2:2017/05/21(日) 13:33:11
cnn.pyのコメントに
input_dim: Tuple (C, H, W)

とか書いてあるのだが、C, W, Hのまちがいじゃなかろうか。
サンプルが全部WとHが同じ値なのでどっちか分からん…

51karino2:2017/05/21(日) 14:29:42
なるほど、CHWを潰して戻せば良いのね。

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(省略可)

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

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

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

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