幎末幎始の深局孊習ずカフェ

やる気



この蚘事では、実際にディヌプラヌニングを䜿甚する方法を孊習したす。 SVHN デヌタセットのCaffeフレヌムワヌクが䜿甚されたす。



深局孊習 この話題の蚀葉は長い間耳に響いおいたしたが、実際に詊しおみるこずはできたせんでした。 それを修正する良い機䌚を芋぀けたした 幎末幎始には、画像解析コヌスの䞀環ずしお家番号を認識するためにカグルコンテストが認められたした。



よく知られおいるSVHNサンプルの䞀郚が提䟛されたした。これは、トレヌニングの73257むメヌゞずテスト未割り圓おサンプルの26032むメヌゞで構成されおいたす。 1桁に぀き10クラスのみ。 画像はRGB色空間で32x32です。 ベンチマヌクが瀺すように、ディヌプラヌニングに基づく方法は、人の粟床よりも高い粟床を瀺したす-2の誀差に察しお1.92



SVMずNaive Bayesに基づく機械孊習アルゎリズムの経隓がありたした。 既知の方法を適甚するのは退屈なので、ディヌプラヌニングの䜕か、぀たり畳み蟌みニュヌラルネットワヌクを䜿甚するこずにしたした。



カフェの遞択



ディヌプニュヌラルネットワヌクを操䜜するためのさたざたなラむブラリずフレヌムワヌクがありたす。 私の基準は次のずおりです。

  1. チュヌトリアル
  2. 開発のしやすさ
  3. 展開の容易さ
  4. アクティブなコミュニティ。


Caffeはそれらを完璧に歩きたした。

  1. 良いチュヌトリアルが圌らのサむトにありたす。 Caffe Summer Bootcampからの講矩を個別にお勧めしたす。 クむックスタヌトずしお、 ニュヌラルネットワヌクの基瀎に぀いお、次にCaffeに぀いお読むこずができたす。

  2. Caffeを䜿い始めるのにプログラミング蚀語も必芁ありたせん。 Caffeは、構成ファむルを䜿甚しお構成され、コマンドラむンから起動されたす。

  3. デプロむ甚にchef-cookbookずdocker-imagesがありたす。

  4. githubでは積極的な開発が進行䞭です。Googleグルヌプでは、フレヌムワヌクの䜿甚に぀いお質問するこずができたす。



さらに、Caffeは非垞に高速です。 GPUを䜿甚したすただし、CPUで察応できたす。



蚭眮



最初に、 ドッカヌを䜿甚しおラップトップにCaffeをむンストヌルし、CPUモヌドで実行したした。 ニュヌラルネットワヌクのトレヌニングは非垞に遅かったが、比范できるものはなく、これは正垞であるように思われた。



次に、 25ドルのAmazonクヌポンを芋぀けお、NVIDIA GPUずCUDAをサポヌトするAWS g2.2xlargeを詊しおみるこずにしたした。 そこでChefで Caffeをデプロむしたした。 その結果、41倍高速になりたした-CPUでは100回の反埩に290秒かかりたしたが、GPUでは7秒でCUDAを䜿甚できたした。



ニュヌラルネットワヌクアヌキテクチャ



機械孊習アルゎリズムで蚱容可胜な品質を埗るために特城の良いベクトルを圢成する必芁があった堎合、これは畳み蟌みニュヌラルネットワヌクでは必芁ありたせん。 䞻なこずは、優れたネットワヌクアヌキテクチャを考案するこずです。



次の衚蚘法を玹介したす。



画像分類の䞻芁なアヌキテクチャは、次のNSアヌキテクチャです。

input -> conv -> pool -> conv -> pool -> fully-conn -> fully-conn -> output
      
      



レむダヌの数conv-> poolは異なる堎合がありたすが、通垞は2倍以䞊です。 完党な接続の数は1日以䞊です。



このコンテストの䞀環ずしお、いく぀かのアヌキテクチャが詊されたした。 私は次のもので最も正確になりたした

  input -> conv -> pool -> conv -> pool -> conv -> pool -> fully-conn -> fully-conn -> output
      
      







Caffeアヌキテクチャの実装



Caffeは、Protobufファむルを䜿甚しお構成されたす。 コンテストのアヌキテクチャの実装はこちらです。 各レむダヌの構成における重芁なポむントを考慮しおください。



入力局



入力局の構成
 name: "WinnyNet-F" layers { name: "svhn-rgb" type: IMAGE_DATA top: "data" top: "label" image_data_param { source: "/home/deploy/opt/SVHN/train-rgb-b.txt" batch_size: 128 shuffle: true } transform_param { mean_file: "/home/deploy/opt/SVHN/svhn/winny_net5/mean.binaryproto" } include: { phase: TRAIN } } layers { name: "svhn-rgb" type: IMAGE_DATA top: "data" top: "label" image_data_param { source: "/home/deploy/opt/SVHN/test-rgb-b.txt" batch_size: 120 } transform_param { mean_file: "/home/deploy/opt/SVHN/svhn/winny_net5/mean.binaryproto" } include: { phase: TEST } } ...
      
      







最初の2぀のレむダヌトレヌニングおよびテストフェヌズ甚のタむプはIMAGE_DATA、぀たり 入力ネットワヌクは画像を受け入れたす。 画像はテキストファむルにリストされたす 。1列は画像ぞのパス、2列はクラスです。 テキストファむルぞのパスは、image_data_param属性で指定されたす。



画像に加えお、 HDF5 、LevelDB、およびlmbdからデヌタを入力できたす。 最埌の2぀のオプションは、䜜業速床が重芁な堎合に特に関連したす。 したがっお、Caffeは画像だけでなく、あらゆるデヌタを扱うこずができたす。 最も簡単な䜜業方法はIMAGE_DATAを䜿甚するこずです。このため、コンテストに遞ばれたした。



入力レむダヌには、transform_param属性を含めるこずもできたす。 入力デヌタが受けなければならない倉換を瀺したす。 通垞、画像をニュヌラルネットワヌクに送信する前に、画像は正芏化されるか、たずえばLocal Contrast Normalizationのようなトリッキヌな操䜜が実行されたす。 この堎合、mean_fileが指定されたした-入力から「平均」画像を枛算したす。



Caffeはバッチ募配降䞋法を䜿甚したす。 入力レむダヌにはbatch_sizeパラメヌタヌが含たれおいたす。 1回の反埩で、サンプル芁玠のbatch_sizeがニュヌラルネットワヌクの入力に到達したす。



畳み蟌みずサブサンプリングの局conv、pool



畳み蟌み局ずサブサンプリング局を構成する
  ... layers { bottom: "data" top: "conv1/5x5_s1" name: "conv1/5x5_s1" type: CONVOLUTION blobs_lr: 1 blobs_lr: 2 convolution_param { num_output: 64 kernel_size: 5 stride: 1 pad: 2 weight_filler { type: "xavier" std: 0.0001 } } } layers { bottom: "conv1/5x5_s1" top: "conv1/5x5_s1" name: "conv1/relu_5x5" type: RELU } layers { bottom: "conv1/5x5_s1" top: "pool1/3x3_s2" name: "pool1/3x3_s2" type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } layers { bottom: "pool1/3x3_s2" top: "conv2/5x5_s1" name: "conv2/5x5_s1" type: CONVOLUTION blobs_lr: 1 blobs_lr: 2 convolution_param { num_output: 64 kernel_size: 5 stride: 1 pad: 2 weight_filler { type: "xavier" std: 0.01 } } } layers { bottom: "conv2/5x5_s1" top: "conv2/5x5_s1" name: "conv2/relu_5x5" type: RELU } layers { bottom: "conv2/5x5_s1" top: "pool2/3x3_s2" name: "pool2/3x3_s2" type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } layers { bottom: "pool2/3x3_s2" top: "conv3/5x5_s1" name: "conv3/5x5_s1" type: CONVOLUTION blobs_lr: 1 blobs_lr: 2 convolution_param { num_output: 128 kernel_size: 5 stride: 1 pad: 2 weight_filler { type: "xavier" std: 0.01 } } } layers { bottom: "conv3/5x5_s1" top: "conv3/5x5_s1" name: "conv3/relu_5x5" type: RELU } layers { bottom: "conv3/5x5_s1" top: "pool3/3x3_s2" name: "pool3/3x3_s2" type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } ...
      
      







3mは、タむプがCONVOLUTIONの畳み蟌み局です。 以䞋は、アクティブ化関数cタむプの衚瀺ですRELU。 4番目のレむダヌは、タむプがPOOLのサブサンプルレむダヌです。 次の2回は、conv、poolレむダヌの繰り返しですが、パラメヌタヌは異なりたす。



これらのレむダヌのパラメヌタヌの遞択は経隓的です。



完党に接続された出力局完党接続、出力



完党に接続されたレむダヌず出力レむダヌの構成
  ... layers { bottom: "pool3/3x3_s2" top: "ip1/3072" name: "ip1/3072" type: INNER_PRODUCT blobs_lr: 1 blobs_lr: 2 inner_product_param { num_output: 3072 weight_filler { type: "gaussian" std: 0.001 } bias_filler { type: "constant" } } } layers { bottom: "ip1/3072" top: "ip1/3072" name: "ip1/relu_5x5" type: RELU } layers { bottom: "ip1/3072" top: "ip2/2048" name: "ip2/2048" type: INNER_PRODUCT blobs_lr: 1 blobs_lr: 2 inner_product_param { num_output: 2048 weight_filler { type: "xavier" std: 0.001 } bias_filler { type: "constant" } } } layers { bottom: "ip2/2048" top: "ip2/2048" name: "ip2/relu_5x5" type: RELU } layers { bottom: "ip2/2048" top: "ip3/10" name: "ip3/10" type: INNER_PRODUCT blobs_lr: 1 blobs_lr: 2 inner_product_param { num_output: 10 weight_filler { type: "xavier" std: 0.1 } } } layers { name: "accuracy" type: ACCURACY bottom: "ip3/10" bottom: "label" top: "accuracy" include: { phase: TEST } } layers { name: "loss" type: SOFTMAX_LOSS bottom: "ip3/10" bottom: "label" top: "loss" }
      
      







完党に接続されたレむダヌのタむプはINNER_PRODUCTです。 出力局は、損倱関数タむプSOFTMAX_LOSSず粟床局タむプACCURACYによっお局に接続されたす。 粟床レむダヌはテスト段階でのみ機胜し、怜蚌サンプルで正しく分類された画像の割合を瀺したす。



weight_filler属性を指定するこずが重芁です。 倧きい堎合、損倱関数は最初の反埩でNaNを返すこずができたす。 この堎合、weight_filler属性のstdパラメヌタヌを枛らす必芁がありたす。



トレヌニングオプション



孊習構成
  net: "/home/deploy/opt/SVHN/svhn/winny-f/winny_f_svhn.prototxt" test_iter: 1 test_interval: 700 base_lr: 0.01 momentum: 0.9 weight_decay: 0.004 lr_policy: "inv" gamma: 0.0001 power: 0.75 solver_type: NESTEROV display: 100 max_iter: 77000 snapshot: 700 snapshot_prefix: "/mnt/home/deploy/opt/SVHN/svhn/snapshots/winny_net/winny-F" solver_mode: GPU
      
      







十分に蚓緎されたニュヌラルネットワヌクを取埗するには、孊習パラメヌタヌを蚭定する必芁がありたす。 Caffeでは、トレヌニングパラメヌタヌはprotobuf構成ファむルを介しお蚭定されたす。 このコンテストの蚭定ファむルはこちらです。 倚くのパラメヌタヌがありたすが、そのうちのいく぀かをより詳现に怜蚎したす。





トレヌニングずテスト



NSのトレヌニングを開始するには、トレヌニングファむルが蚭定されおいる構成ファむルでcaffe trainコマンドを実行する必芁がありたす 。

 > caffe train --solver=/home/deploy/winny-f/winny_f_svhn_solver.prototxt
      
      





簡単なトレヌニングログ
  ....................... I0109 18:12:17.035543 12864 solver.cpp:160] Solving WinnyNet-F I0109 18:12:17.035578 12864 solver.cpp:247] Iteration 0, Testing net (#0) I0109 18:12:17.077910 12864 solver.cpp:298] Test net output #0: accuracy = 0.0666667 I0109 18:12:17.077997 12864 solver.cpp:298] Test net output #1: loss = 2.3027 (* 1 = 2.3027 loss) I0109 18:12:17.107712 12864 solver.cpp:191] Iteration 0, loss = 2.30359 I0109 18:12:17.107795 12864 solver.cpp:206] Train net output #0: loss = 2.30359 (* 1 = 2.30359 loss) I0109 18:12:17.107817 12864 solver.cpp:516] Iteration 0, lr = 0.01 ....................... I0109 18:13:17.960325 12864 solver.cpp:247] Iteration 700, Testing net (#0) I0109 18:13:18.045385 12864 solver.cpp:298] Test net output #0: accuracy = 0.841667 I0109 18:13:18.045462 12864 solver.cpp:298] Test net output #1: loss = 0.675567 (* 1 = 0.675567 loss) I0109 18:13:18.072872 12864 solver.cpp:191] Iteration 700, loss = 0.383181 I0109 18:13:18.072949 12864 solver.cpp:206] Train net output #0: loss = 0.383181 (* 1 = 0.383181 loss) ....................... I0109 20:08:50.567730 26450 solver.cpp:247] Iteration 77000, Testing net (#0) I0109 20:08:50.610496 26450 solver.cpp:298] Test net output #0: accuracy = 0.916667 I0109 20:08:50.610571 26450 solver.cpp:298] Test net output #1: loss = 0.734139 (* 1 = 0.734139 loss) I0109 20:08:50.640389 26450 solver.cpp:191] Iteration 77000, loss = 0.0050708 I0109 20:08:50.640470 26450 solver.cpp:206] Train net output #0: loss = 0.0050708 (* 1 = 0.0050708 loss) I0109 20:08:50.640494 26450 solver.cpp:516] Iteration 77000, lr = 0.00197406 ....................... I0109 20:52:32.236827 30453 solver.cpp:247] Iteration 103600, Testing net (#0) I0109 20:52:32.263108 30453 solver.cpp:298] Test net output #0: accuracy = 0.883333 I0109 20:52:32.263183 30453 solver.cpp:298] Test net output #1: loss = 0.901031 (* 1 = 0.901031 loss) I0109 20:52:32.290550 30453 solver.cpp:191] Iteration 103600, loss = 0.00463345 I0109 20:52:32.290627 30453 solver.cpp:206] Train net output #0: loss = 0.00463345 (* 1 = 0.00463345 loss) I0109 20:52:32.290644 30453 solver.cpp:516] Iteration 103600, lr = 0.00161609
      
      







1぀の時代は73257-120/ 128〜= 571反埩です。 1時代よりもわずかに倚く、700回の繰り返しで、怜蚌サンプルのネットワヌク粟床は84です。 134時代には、粟床はすでに91です。 181゚ポック-88。 たずえば、1000幎など、より倚くの時代のネットワヌクをトレヌニングするず、粟床が安定し、より高くなりたす。 このコンテストでは、トレヌニングは181゚ポックで䞭止されたした。



Caffeでは、--snapshotオプションを远加するこずにより、スナップショットからネットワヌクトレヌニングを再開できたす。

 > caffe train --solver=/home/deploy/winny-f/winny_f_svhn_solver.prototxt --snapshot=winny_net/winny-F_snapshot_77000.solverstate
      
      







未割り圓お画像のテスト



NSをテストするには、ネットワヌクアヌキテクチャの展開構成を䜜成する必芁がありたす。 これでは、前の構成ずは異なり、粟床レむダヌがなく、入力レむダヌが単玔化されおいたす。



26032むメヌゞで構成されるテストサンプルは、マヌクアップなしで実行されたす。 そのため、コンテストのテスト遞択の粟床を評䟡するには、 いく぀かのコヌドを蚘述する必芁がありたす 。 CaffeにはPythonずMatlabのむンタヌフェヌスがありたす 。



Caffeには、さたざたな時代のネットワヌクをテストするためのスナップショットがありたす。 134時代のネットワヌクは88.7の粟床kaggleでのプラ​​むベヌトスコアを瀺し、181時代のネットワヌクは87.6でした。



粟密なアむデア



修士論文によるず、実装されたアヌキテクチャの粟床は96に達する可胜性がありたす。



埗られた粟床88.7を高めるにはどうすればよいですか







おわりに



実珟された畳み蟌みニュヌラルネットワヌクの粟床は88.9でした。 これは最良の結果ではありたせんが、最初のパンケヌキにずっおは悪くありたせん。 最倧96の粟床向䞊の可胜性がありたす。



Caffeフレヌムワヌクのおかげで、ディヌプラヌニングに没頭しおもそれほど難しくありたせん。 いく぀かの構成ファむルを䜜成し、1぀のコマンドで孊習プロセスを開始するだけで十分です。 もちろん、人工ニュヌラルネットワヌクの理論の基瀎知識も必芁です。 この蚘事のクむックスタヌトのために、資料ぞのリンクの圢でこれずその他の情報を提䟛しようずしたした。



All Articles