まんぼう日記

takataka's diary

Theano の conv2d で subsample を指定すると遅い件

シルバーウィーク以降ずっと忙しかったんが一区切りついて,ほっと一息のたかたかです.特に今週はへろへろでもう大変.昨夜なんか,授業終えて研究室に戻ったとたん椅子にへたりこんでしまい,体に力入らへんで1時間ほどぐったりしてました (x_x)

 

でも,早めに寝て普通に起きたら復活の兆しが見えた気がするようなしないような.というわけで,11km走って大学に来て研究室でだらだらしてます (^^; こういう時に家におると,復活しそこねてぐだぐだな一日を過ごすはめになるのですよ.悲しいけれど,休む能力の低い人間はこうやって生きてゆくしかないのですな.

 

とか言いながら,締切過ぎてる/迫ってる/片付けなかん仕事が見えへんフリしてちまちまこの記事書いてるわけですが (^^; 

 

さて,以前から何度か,Theano の max_pool_2d

downsample – Down-Sampling — Theano 0.7 documentation

で st を指定して overlap ありの pooling をやろうとすると,GPUの使用率が極端に下がって実行が非常に遅くなってしまう,という話をしてました.

そん時と同じ現象が,conv2d で subsample オプション

conv – Ops for convolutional neural nets — Theano 0.7 documentation

を指定した時にも起こるよ,って話です.

 

 

conv2d の subsample オプションのデフォルトは ( 1, 1 ) なので,カーネルを1画素ずつずらしながらフィルタリングすることになります.でも,入力画像が大きい時は,計算時間&出力サイズを小さくするために,適当に飛ばしてフィルタリングさせたくなることがあるわけでして.subsample オプションはその飛ばす大きさ(stirideとも呼ばれる)を指定するものです.

 

たかたかはこれまで subsample オプションはデフォルトのままでしか実験してこーへんかったから気づかへんかったんですが,

ImageNet Large Scale Visual Recognition Competition 2010 (ILSVRC2010)

のデータを使った実験をやろうとしてる学生さんが,上記の問題が発生することを教えてくれました.たかたかもやってみたらその通りになります.

 

解決策を探して調べてみたところ,すぐに見つかった情報はこれくらい.

いずれも2014年前半の情報です.今も状況が変わってないってことやとすると,2番目の記事に詳しく書かれてる(ちなみに,この記事を書いた方の言ってる Theano を使う理由ってのは,たかたかとまるっきり同じです)ように,conv2d の所だけ Pylearn2 ( Welcome — Pylearn2 dev documentation )から cuda-convnet を呼び出すことにする,ってのが一番の解決策のようです.

 

この記事には詳しい解説があるので,その通りやったらすぐできそう….しかも,overlap pooling についても書かれてて,同様にして解決できそう….う〜,プログラムを書いて実験したい.でもまだそれほどの余裕はないので,いずれまた.

 

ちなみに,苦肉の策として,subsample = ( 1, 1 ) で conv2d 呼んだ後,出力を

hoge[:, :, ::dx, ::dy]]

とやって, subsample = ( dx, dy ) した場合と同じ結果を得る,っちゅうこともできます.フィルタリングは1画素ずつ真面目にやることになるので,計算コスト的にはだめだめですが,それでも conv2d で subsample を指定した場合よりはずっと速いみたいです.