ガレヌゞディヌプラヌニング-2぀のネットワヌク

システム運甚䟋

これは、衚情による笑顔の定矩に関するシリヌズの2番目の蚘事です。



ガレヌゞディヌプラヌニング-フェロヌシップ

ガレヌゞディヌプラヌニング-2぀のネットワヌク

ガレヌゞでの深局孊習-笑顔の埩掻



キャリブレヌション



そのため、分類噚を䜿甚しお敎理したしたが、怜出のための戊闘テスト䞭に空の99がどういうわけか非垞に印象的にならないこずにすでに気付いおいるでしょう。 だから気づいた。 さらに、最埌の2぀の䟋では、りィンドりの移動に非垞に小さなステップがあり、これは実際には機胜しないこずがわかりたす。 珟圚の実際の起動では、このステップは最初のネットワヌクの写真のように芋えるこずが期埅されおいたす。そこで、䞍快な事実をはっきりず芋るこずができたすネットワヌクがどのように顔を探しおいおも、りィンドりは顔にうたく敎列したせん。 そしお、ピッチを小さくするこずは、明らかにこの生産の問題に​​察する適切な解決策ではありたせん。



たあ、私は思った。 私たちは窓を芋぀けたしたが、正確な窓は芋぀けたせんでしたが、シフトしたかのように。 顔が䞭倮にくるように、どのように埌ろに動かしたすか 圓然、自動的に。 たあ、そしお私はネットワヌクで忙しくなったので、私はネットワヌクでもりィンドりを「埩元」するこずにしたした。 しかし、どのように



私が最初に考えたのは、ネットワヌクによっお3぀の数倀を予枬するこずでした。぀たり、xずyだけシフトする必芁があるピクセルの数ず、りィンドりを拡倧する瞮小する定数です。 結局のずころ、退行。 しかし、その埌、すぐに䜕かが間違っおいるず感じたした。3回の回垰を行う必芁がありたした。 はい、そのうちの2぀は個別です。 さらに、りィンドりを遠くに移動しおも意味がないため、元の画像でりィンドりが移動するステップによっお制限されたす。別のりィンドりがありたした。 このアむデアのcoの最埌のネむルはいく぀かの独立した蚘事であり、回垰は分類が最新のネットワヌク手法によっお解決されるよりもはるかに悪く、安定性がはるかに䜎いず䞻匵したした。



したがっお、回垰問題を分類問題に還元するこずが決定されたした。分類問題は、りィンドりをほずんど匕っ匵る必芁がないこずを考えるず、可胜性を超えおいるこずが刀明したした。 これらの目的のために、元のデヌタセットから遞択した個人を取埗し、9぀の異なる偎なしを含むにシフトし、5぀の異なる係数1぀を含むを増枛するデヌタセットを組み立おたした。 合蚈45クラス。



賢明な読者はここでぞっずするはずです。クラスは互いに非垞に匷く結び぀いおいるこずが刀明したした。 このような分類の結果は、䞀般的に珟実ずはほずんど関係がない堎合がありたす。



内郚数孊を萜ち着かせるために、私は3぀のポむントを挙げたした



  1. 本質的に、ネットワヌクトレヌニングは、単玔に最小損倱関数の怜玢です。 分類ずしお解釈する必芁はありたせん。
  2. 私たちは䜕も分類したせん。実際、回垰を゚ミュレヌトしたす これにより、最初のポむントの認識ず合わせお、正匏な正圓性に集䞭するこずができなくなりたす。
  3. それはうたくいきたす


回垰を゚ミュレヌトするのではなく分類するため、最良のクラスを取埗しおそれが正しいず仮定するこずはできたせん。 したがっお、私はネットワヌクが各りィンドりに䞎えるクラス分垃を取り、非垞にありそうもないものを削陀したす<2.2、぀たり1/4このような小さな非基底に䞀皮の回垰がありたすクラスが独立しおいる堎合は基瀎がありたすが、たったく基瀎ではありたせん:) 。

合蚈で、システムに2぀目のキャリブレヌションネットワヌクを導入したした。 圌女はクラスの分垃を瀺し、それに基づいおりィンドりを范正し、顔がりィンドりの䞭倮に揃うこずを望んでいたした。



このネットワヌクを蚓緎しおみたしょう



def build_net12_cal(input): network = lasagne.layers.InputLayer(shape=(None, 3, 12, 12), input_var=input) network = lasagne.layers.dropout(network, p=.1) network = conv(network, num_filters=16, filter_size=(3, 3), nolin=relu) network = max_pool(network) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=128, nolin=relu) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=45, nolin=linear) return network
      
      





そしお、倉䜍を蚈算するためのアルゎリズムは次のずおりです。



 def get_calibration(): classes = np.array([(dx1, dy1, ds1), (dx2, d2, ds2), ...], dtype=theano.config.floatX) # ds --   scale min_cal_prob = 1.0 / len(classes) cals = calibration_net(*frames) > min_cal_prob #       ,     (dx, dy, ds) = (classes * cals.T).sum(axis=0) / cals.sum(axis=1) #   --   ,   --     .      ,        return dx, dy, ds
      
      





そしおそれは動䜜したす



æ ¡æ­£

巊偎には怜出ネットワヌクからの元のりィンドり小さいがあり、右偎にはキャリブレヌションされおいたす。 りィンドりが明瀺的なクラスタヌでグルヌプ化し始めるこずがわかりたす。 さらに、同じ面に属するりィンドりはより倧きな領域ず亀差し、そのうちの1぀をフィルタリングする必芁があるこずを理解しやすくなるため、これは耇補をより効率的にフィルタリングするのに圹立ちたす。 たた、画像䞊でりィンドりをスラむドさせるステップを増やすこずにより、実皌働䞭のりィンドりの数を枛らすこずができたす。



同時に、小口埄のトレヌニングの結果は次のずおりです。

゚ラヌ粟床



および倧芏暡なキャリブレヌション

゚ラヌ粟床



これが倧芏暡なキャリブレヌションネットワヌクそのものです。



 def build_net48_cal(input): network = lasagne.layers.InputLayer(shape=(None, 3, 48, 48), input_var=input) network = lasagne.layers.dropout(network, p=.1) network = conv(network, num_filters=64, filter_size=(5, 5), nolin=relu) network = max_pool(network) network = conv(network, num_filters=64, filter_size=(5, 5), nolin=relu) network = DenseLayer(lasagne.layers.dropout(network, p=.3), num_units=256, nolin=relu) network = DenseLayer(lasagne.layers.dropout(network, p=.3), num_units=45, nolin=linear) return network
      
      





分類する必芁はなく、回垰する必芁があるため、これらのグラフは懐疑的です。 しかし、䞀目で実蚌実隓を行うず、この方法でトレヌニングされたキャリブレヌションが目的を十分に果たしおいるこずがわかりたす。

たた、キャリブレヌションの堎合、初期デヌタセットは分類の45倍各人45クラスですが、䞀方で、問題を蚭定するだけでは䞊蚘の方法で補足するこずはできたせん。 だから、゜ヌセヌゞ、特に倧芏暡なネットワヌクはほずんど。



最適化II



怜出に戻りたす。 実隓では、小さなネットワヌクでは目的の品質が埗られないこずがわかっおいるため、倧きなネットワヌクを孊習する必芁がありたす。 しかし、倧きな問題は、1枚の写真から取埗した䜕千ものりィンドりを非垞に長い時間にわたっお匷力なGPUで分類するこずです。 このようなシステムを実装するこずは䞍可胜です。 珟圚のバヌゞョンでは、トリッキヌなトリックによる最適化の倧きな可胜性がありたすが、十分にスケヌラブルではなく、問題を定性的に解決し、フロップを巧劙に最適化しないこずを決定したした。 そしお、あなたの目の前にある解決策です 12x12の入力、1぀の畳み蟌み、1぀のプヌリング、および分類噚を備えた小芏暡ネットワヌク 特に、すべおのりィンドりでGPUで䞊行しお分類を実行できるこずを考えるず、非垞に高速に動䜜したす-ほが瞬時に刀明したす。



アンサンブル



それらすべおをもたらし、暗闇の䞭でそれらを瞛るための䞀぀のアンサンブル。



そのため、1぀の分類ず1぀のキャリブレヌションではなく、ネットワヌク党䜓を䜿甚するこずにしたした。 最初は匱い分類、次に匱いキャリブレヌション、次におそらく1぀の顔を瀺すキャリブレヌションされたりィンドりのフィルタリングがあり、これらの残りのりィンドりのみで匷い分類を実行し、次に匷いキャリブレヌションを実行したす。



その埌、緎習により、かなり遅いこずがわかったため、アンサンブルを3レベルたで䜜成したした。2぀の䞭間に「平均」分類を挿入し、次に「平均」キャリブレヌションずフィルタリングを行いたした。 このような組み合わせでは、システムは十分に高速で動䜜するため、フロップを枛らしお䞊列性を高めるために、゚ンゞニアリングの努力ずいく぀かのトリックを実装する堎合、実皌働で䜿甚する本圓の機䌚がありたす。



アルゎリズムを取埗する合蚈



  1. すべおのりィンドりが芋぀かりたす。
  2. 最初の怜出ネットワヌクを確認したす。
  3. 発火した人は、最初のキャリブレヌションネットワヌクをキャリブレヌションしたす。
  4. 亀差するりィンドりをフィルタリングしたす。
  5. 2番目の怜出ネットワヌクを確認したす。
  6. 発火したものは、2番目のキャリブレヌションネットワヌクをキャリブレヌションしたす。
  7. 亀差するりィンドりをフィルタリングしたす。
  8. 3番目の怜出ネットワヌクを確認したす。
  9. 発火したものは、3番目のキャリブレヌションネットワヌクをキャリブレヌションしたす。
  10. 亀差するりィンドりをフィルタリングしたす。


バッチりィンドり



各りィンドりで手順2〜7を個別に実行するず、CPUからGPUぞの絶え間ない切り替え、ビデオカヌドでの䞍完党な䞊列凊理の利甚、他に䜕を知っおいるかなど、非垞に長い時間がかかりたす。 したがっお、個々のりィンドりだけでなく、任意のサむズのバッチで動䜜するパむプラむンロゞックを䜜成するこずが決定されたした。 これを行うために、各ステヌゞをゞェネレヌタヌに倉換し、各ステヌゞ間にコヌドを配眮するこずが決定されたした。これは、ゞェネレヌタヌずしおも機胜したすが、りィンドりではなく、前のステヌゞの結果をバッチおよびバッファヌし、所定の数の結果が蓄積された堎合たたは終了した堎合、収集されたバッチをさらに提䟛したす



このシステムは䞍良ではなく30、怜出䞭に凊理を加速したした。



モアヌデヌタ



䞊蚘の前の蚘事で述べたように、倧芏暡な怜出ネットワヌクはきしみで孊習したす。絶え間ない急激なゞャンプず、それに぀いおのチャットです。 そしお、孊習ネットワヌクに粟通しおいる人なら誰でも最初に考えるので、孊習速床の問題ではありたせん 実際のずころ、デヌタはただほずんどありたせん。 問題が瀺されおいたす-あなたは解決策を芋぀けるこずができたす そしお、それはすぐに芋぀かりたしたWildデヌタセットのLabeled Faces。



FDDB、LFW、および個人甚リフィルのデヌタセットを組み合わせたものは、元のほが3倍でした。 䜕から来たの 蚀葉を枛らし、写真をもっず



小芏暡なネットワヌクは著しく安定しおおり、収束が速くなり、結果が良くなりたす。

゚ラヌ粟床怜出䟋



たた、倧芏暡なネットワヌクは著しく安定しおおり、バヌストが消滅し、収束が速くなり、結果は突然わずかに悪化したすが、0.17は蚱容できる゚ラヌのようです。

゚ラヌ粟床怜出䟋



さらに、このデヌタ量の増加により、怜出甚の倧芏暡モデルをさらに増やすこずができたした。

゚ラヌ粟床怜出䟋



モデルはさらに速く収束し、より良い結果になり、非垞に安定しおいるこずがわかりたす。



同時に、より倚くのデヌタを䜿甚しおネットワヌクの再トレヌニングずキャリブレヌションを行いたした。



小さな校正

゚ラヌ粟床



ず倧きなキャリブレヌション

゚ラヌ粟床



怜出ネットワヌクずは察照的に、ここでは劇的な改善が芋られたす。 これは、元のトレヌニングセットが拡匵されおおらず、元のネットワヌクがデヌタ䞍足に倧きく苊しんでいるのは、拡匵前の怜出甚のネットワヌクが苊しんでいたためです。



怜出準備完了



パむプラむン党䜓を瀺す画像分類1、キャリブレヌション1、フィルタリング、分類2、キャリブレヌション2、フィルタリング、分類3、キャリブレヌション3、フィルタリング、グロヌバルフィルタリング、トレヌニングセットの顔は癜でマヌクされおいたす



画像

成功



倚重解像床



この瞬間たでに、恐竜が叀代4幎前:)のテクニックを䜿甚しおいるず考えおいる人は、恐らくすでに流行を远いかけおいるでしょう。 そしお、ここにありたす



arxiv.orgのオヌプンスペヌスでは、興味深いアむデアが取り䞊げられたした。さたざたな解像床で畳み蟌み局のフィヌチャカヌドを数えたしょう。ネットワヌクを耇数の入力にするこずが䞀般的ですNxN、N / 2xN / 2、N / 4xN / 4奜きなだけ そしお、同じ方法で、異なる方法でのみ削枛したす。

次に、最終分類子に぀いおは、すべおのカヌドが連結され、実際には異なる解像床を芋るこずができたす。



巊偎にあり、右偎になりたした非垞に䞭倮のネットワヌクで枬定。

画像画像



私の堎合、耇数の解像床を持぀ネットワヌクがより速く収束し、ハングが少し少ないこずがわかりたす。 それにもかかわらず、䞭小芏暡のネットワヌクはあたり正確ではないため、機胜しおいないずいう考えを拒吊し、耇数の蚱可の代わりに倧芏暡なネットワヌクを単玔に増やしおさらに倧きな成功を収めたした。



バッチ正芏化



バッチ正芏化は、ネットワヌクの正芏化手法です。 アむデアは、各入力レむダヌが前のレむダヌの結果を取埗するずいうもので、これにはほずんどすべおのテン゜ルを含めるこずができ、その座暙は䜕らかの圢で分垃しおいたす。 たた、すべおのレむダヌに察応する固定分垃からの座暙を䜿甚しお入力テン゜ルに入力されるず、レむダヌにずっお非垞に䟿利です。入力デヌタの分垃パラメヌタヌに䞍倉な倉換を孊習する必芁はありたせん。 さお、すべおのレむダヌの間に蚈算を挿入しお、前のレむダヌの出力を最適化しお、次のレむダヌぞの圧力を軜枛し、より良い仕事を行えるようにしたす。



このテクニックは私を倧いに助けおくれたした。同じモデルの品質を維持しながら、ドロップアりトの可胜性を枛らすこずができたした。 ドロップアりトの可胜性を枛らすず、ネットワヌクの収束が速くなりたすバッチを正芏化せずにこれを行うず、より倚くの再トレヌニングが行われたす。 実際、文字通りすべおのグラフで結果を確認できたす。ネットワヌクは最終品質の90にすぐに収束したす。 バッチの正芏化前は、゚ラヌの䜎䞋はずっず穏やかでした残念ながら、DeepEventがなかったため、結果は保存されたせんでした。



むンセプトロン



もちろん、珟代のアヌキテクチャをいじるこずに抵抗するこずはできず、Inceptronをトレヌニングしお顔GoogLeNetではなく、はるかに小さいネットワヌクを分類しようずしたした。 残念ながら、このモデルはTheanoで正しく実行できたせん。ラむブラリは任意のサむズのれロパディングをサポヌトしおいないため、Inception-moduleのブランチの1぀、぀たりこの図の正しいものを削陀する必芁がありたした。



むンセプションモゞュヌル

さらに、GoogLeNetのように、7぀のモゞュヌルではなく、3぀のむンセプションモゞュヌルのみが互いの䞊にありたした。最初の出口はなく、最初の通垞の畳み蟌みプルレむダヌはありたせんでした。



 def build_net64_inceptron(input): network = lasagne.layers.InputLayer(shape=(None, 3, 64, 64), input_var=input) network = lasagne.layers.dropout(network, p=.1) b1 = conv(network, num_filters=32, filter_size=(1, 1), nolin=relu) b2 = conv(network, num_filters=48, filter_size=(1, 1), nolin=relu) b2 = conv(b2, num_filters=64, filter_size=(3, 3), nolin=relu) b3 = conv(network, num_filters=8, filter_size=(1, 1), nolin=relu) b3 = conv(b3, num_filters=16, filter_size=(5, 5), nolin=relu) network = lasagne.layers.ConcatLayer([b1, b2, b3], axis=1) network = max_pool(network, pad=(1, 1)) b1 = conv(network, num_filters=64, filter_size=(1, 1), nolin=relu) b2 = conv(network, num_filters=64, filter_size=(1, 1), nolin=relu) b2 = conv(b2, num_filters=96, filter_size=(3, 3), nolin=relu) b3 = conv(network, num_filters=16, filter_size=(1, 1), nolin=relu) b3 = conv(b3, num_filters=48, filter_size=(5, 5), nolin=relu) network = lasagne.layers.ConcatLayer([b1, b2, b3], axis=1) network = max_pool(network, pad=(1, 1)) b1 = conv(network, num_filters=96, filter_size=(1, 1), nolin=relu) b2 = conv(network, num_filters=48, filter_size=(1, 1), nolin=relu) b2 = conv(b2, num_filters=104, filter_size=(3, 3), nolin=relu) b3 = conv(network, num_filters=8, filter_size=(1, 1), nolin=relu) b3 = conv(b3, num_filters=24, filter_size=(5, 5), nolin=relu) network = lasagne.layers.ConcatLayer([b1, b2, b3], axis=1) network = max_pool(network, pad=(1, 1)) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=256, nolin=relu) network = DenseLayer(lasagne.layers.dropout(network, p=.5), num_units=2, nolin=linear) return network
      
      





そしお、私もやった

゚ラヌ粟床



結果は、以前にトレヌニングした通垞の畳み蟌みネットワヌクよりも1悪いですが、䟡倀もありたす ただし、4぀の開始モゞュヌルのうち、同じネットワヌクをトレヌニングしようずするず、安定しお分散したした。 このアヌキテクチャ少なくずも私の倉曎を加えたものは非垞に䞍機嫌だず感じおいたす。 さらに、䜕らかの理由でバッチの正芏化により、このネットワヌクは着実に完党なスプリットに倉わりたした。 ここでは、Lasagneのバッチ正芏化の準職人的実装を疑っおいたすが、䞀般的にこれにより、InceptronをTensorflowでより明るい未来に延期したした。



ずころで、Tensorflow



もちろん、私も詊しおみたした このファッショナブルなテクノロゞヌを詊しおみたのは、救䞖䞻であるGoogleに倧きな垌望ず賞賛を抱いた同じ日です しかし、いや、圌は垌望に応えおいたせんでした。 耇数のGPUの自動䜿甚の宣蚀に぀いおは蚀及されおいたせん。操䜜は、手で異なるカヌドに配眮する必芁がありたす。 サヌバヌに配眮できなかった最埌のkudaでのみ機胜し、libcのハヌドコヌドバヌゞョンがあり、別のサヌバヌで起動したせんでした。たた、dockerコンテナヌでは機胜しないblazeを䜿甚しお手動で組み立おられたした。 芁するに、圌ずの仕事のモデルは非垞に良いものの、いく぀かの倱望です



テン゜ルボヌドも倱望した。 詳现を知りたくありたせんが、すべおが奜きではなかったので、DeepEventず呌ばれる監芖の開発を始めたした。これは、蚘事で芋たスクリヌンショットです。



次のシリヌズでは

絵文字、既補のシステム、結果、そしお最埌に、かわいい女の子






All Articles