Networksに挑戦する。今回の宿題ではCythonが使われている。PythonとCythonの速度比較が為されているが、相変わらずPythonの鈍足ぶりが際立っている。この次のTensorFlowを使用する宿題では、いよいよ待望のGPUが使われる。暑いと思ったら、観測史上1位の値を更新してやがった。熊谷が日本新記録の41.1度とかヤバ過ぎる。病身にはかなり堪える。Networks¶これまで扱ってきた多層全結合ネットワークを使って、別の最適化方法とネットワークアーキテクチャを検討する。全結合ネットワークは、それらが非常に計算効率性が高いので、実験には良い叩き台なのだが、実際面においては、全ての最新の成果は畳み込みネットワークを使用している。畳込みネットワークで使われているいくつかのレイヤータイプを実装する。その後、CIFAR-10データセットで畳み込みネットワークを訓練するのにこれらのレイヤーを使用する。畳み込みネットワークの核は畳込み演算だ。cs231n/layers.pyのconv_forward_naive関数内に畳み込み層用のフォワードパスを実装する。現段階で効率性についての心配は無用なので、ただ最も明確だと思うやり方でコードを書けばいい。下記のセルを実行することで実装をテストすることが可能だ。実装をチェックすることと畳込み層が実行できる演算タイプの深い理解を得ることの両方を目的とした面白い方法として、2つの画像を含む入力を用意し、一般的な画像処理演算(グレースケール変換とエッジ検出)を実行するフィルターを手作りする。畳み込みフォワードパスは、各入力画像にこの演算を適用する。次に、サニティーチェックとして、演算結果を視覚化する。pass¶cs231n/layers.pyのconv_backward_naive関数内に、畳み込み演算用のバックワードパスを実装する。ここでも、計算効率を危惧する必要はない。passをcheckするために下記を実行。forward¶cs231n/layers.pyのmax_pool_forward_naive関数にmax-pooling演算用フォワードパスを実装する。この場合も先と同様、計算効率は無視していい。終わったら、下記を実行して実装をチェックする。backward¶cs231n/layers.pyのmax_pool_backward_naive関数にmax-pooling演算用バックワードパスを実装する。計算効率は無視していい。passをcheckするために下記を実行。畳み込み/プーリング層を高速化するのは難しい。作業を楽にするために、cs231n/fast_layers.pyに畳み込み層とプーリング層用のフォワード/バックワードパス用の高速実装を用意してある。高速畳み込み実装は、Cython拡張に依存している。コンパイルするには、cs231nディレクトリで下記を実行する必要がある。–inplace畳み込み/プーリング層の高速版用APIは、上で実装したナイーブ版と全く同じだ。フォワードパスは、データ、重み、パラメーターを受け取って、出力とキャッシュオブジェクトを生成する。derivatives(上流微分)とキャッシュオブジェクトを受け取って、データと重みに対するグラディエントを生成する。高速プーリング用実装は、プーリング領域が非重複かつ入力をタイルするという条件においてのみ最適実行される。これらの条件が満たされない場合、高速プーリング実装は、速度面でナイーブ実装とそんなに大差はないだろう。下記を実行することで、これらの層のナイーブ版と高速版の速度比較が可能だ。前回、複数の演算を広く使用されているパターンに組み込む、サンドイッチ層というコンセプトを紹介した。cs231n/layer_utils.pyに、畳込みネットワーク用のいくつかの一般的なパターンを実装するサンドイッチ層が含まれている。現段階で必要な層は全て実装し終えたので、それらをシンプルな畳み込みネットワークに纏めることができる。cs231n/classifiers/cnn.pyにThreeLayerConvNetクラスを実装して、デバッグしやすいように下記のセルを実行する。新しいネットワークを構築した後で最初にやるべきことの一つが、損失をサニティーチェックすることだ。ソフトマックスを使う場合、任意の重み(と正則化無し)に対する損失がCクラスに関しては大体log(C)になることを予想する。正則化を加えると損失は上昇する。checkingを使ってバックワードパスが正確であることを確認する。数値勾配チェックを使用する際、少量の加工済みデータと各層には少数のニューロンを用いる。正確な実装は、それでも最大で1e-2の相対誤差を有する可能性がある。上手いトリックは、ほんの少量の訓練標本を使ってモデルを訓練することだ。小さなデータセットは過学習できるはずだし、それが、非常に高い訓練正確度と比較的低い検証正確度をもたらす結果となる。グラフ化が明らかな過学習を示してくれるはずだ。net¶3層畳込みネットを1エポック訓練することで、訓練セットで40%を越える正確度を得られるはず。下記を実行することで、訓練したネットワークの第一層畳み込みフィルターを視覚化できる。Normalization¶バッチ正規化が、多層全結合ネットワークを訓練するのには非常に使えるテクであることは既に見てきた。バッチ正規化は畳み込みネットワークにも使えるが、少し手を加える必要がある。