畳み込みニューラルネットワークの簡単な説明

畳み込みニューラルネットワークの簡単な説明

畳み込みニューラルネットワーク

ネットワーク構造図

図2 畳み込みニューラルネットワークの構造図

畳み込みニューラル ネットワークと完全接続ニューラル ネットワークの構造には大きな違いがあります。完全接続ネットワークでは、隣接する 2 つの層のノードがエッジで接続されますが、畳み込みニューラル ネットワークでは、隣接するノードの一部のみが接続されます。

画像処理における完全接続ニューラル ネットワークの最大の問題は、完全接続層にパラメータが多すぎることです。パラメータが多すぎると、簡単にオーバーフィッティングが発生し、計算速度が低下します。畳み込みニューラル ネットワークでは、パラメータの数を減らすことができます。

入力が 28*28*3 のサイズの画像で、最初の隠れ層に 500 個のノードがあると仮定すると、最初の層のパラメータは 28*28*3*500+500=1176000 パラメータになります。画像が大きくなると、パラメータの数も増えますが、これは最初の層のみです。

では、なぜ畳み込みニューラル ネットワークはパラメータを削減するという目標を達成できるのでしょうか?

畳み込みニューラル ネットワークの最も重要な部分は、畳み込み層、プーリング層、および完全接続層です。

畳み込み層

畳み込み層の各ノードの入力は、前の層のニューラル ネットワークのごく一部に過ぎず、通常は畳み込みカーネルによって実装されます。畳み込みカーネルはフィルターであり、スキャン ウィンドウとして考えることができます。各画像に取り付けられ、設定されたサイズとステップ サイズに従って画像をスキャンします。計算ルールは、取り付けられた画像のピクセル マトリックスに畳み込みカーネルの重みの対応する位置を乗算して合計し、スキャンするたびに出力を取得することです。畳み込み層によって行われる作業は、画像ピクセルの小さなブロックごとに特徴を抽象化するものとして理解できます。同じ画像を複数の異なる畳み込みカーネルで畳み込むことができます。畳み込みカーネルの数は、実際には畳み込み後の出力行列の深さです。畳み込みニューラル ネットワークのパラメーターの数は画像のサイズとは関係なく、フィルターのサイズと深度、および畳み込みカーネルの数 (出力行列の深度) のみに関係します。画像が依然として 28*28*3 であると仮定すると、畳み込みカーネルのサイズは 3*3*3 に設定され、出力行列の深さは 500 に設定され、パラメータの数は 3*3*3*500+500=14000 パラメータになります。完全接続層と比較すると、パラメータの数が大幅に削減されます。

図3: 畳み込み層の例

プーリング層

プーリング層は、高解像度の画像を低解像度の画像に変換するものと考えることができます。行列のサイズを効果的に縮小できるため、完全接続層のパラメータ数を削減でき、過剰適合を防ぎながら計算速度を上げることができます。プーリングにより、モデルを縮小し、速度を上げ、抽出された特徴の堅牢性を向上させることができます。

ステップ サイズが 2 の 2*2 フィルターを使用すると、プーリングは次のようになります。

図4 2×2フィルタプーリングの例

畳み込み層とプーリング層は自動特徴抽出と考えることができます。

上記の直感的な紹介を通じて、畳み込みニューラル ネットワークがパラメータを削減する目的を達成できる理由がわかりましたか?

完全に接続されたニューラル ネットワークと比較すると、畳み込みニューラル ネットワークの利点は、共有された重みとスパースな接続にあります。共有重みは、パラメータがフィルターにのみ関連していることを意味します。畳み込みニューラル ネットワークがパラメータを削減するもう 1 つの理由は、スパース接続です。出力ノードは、入力画像マトリックスの部分ピクセル マトリックス、つまり畳み込みカーネルによって折り畳まれるマトリックスの小さな部分に関連します。これがスパース接続の概念です。

畳み込みニューラル ネットワークは、重みの共有とスパース接続を通じてパラメータを削減します。これにより、過剰適合が防止されます。

トレーニングプロセス

畳み込みニューラル ネットワークのトレーニング プロセスは、おおまかに次の手順に分けられます。

ステップ1: 関連ライブラリをインポートし、パラメータをロードする

  1. インポート数学
  2. numpyをnpとしてインポートする
  3. テンソルフローをtfとしてインポートする
  4. matplotlib.pyplot をpltとしてインポートします。
  5. h5pyをインポートする
  6. tensorflow.python.frameworkからopsをインポートする
  7. tf_utilsからインポート *
  8. np.ランダムシード(1)
  9. X_train_orig、Y_train_orig、X_test_orig、Y_test_orig、クラス = load_dataset()
  10. インデックス=0
  11. plt.imshow(X_train_orig[インデックス])
  12. print( "y=" +str(np.squeeze(Y_train_orig[:, index ])))
  13. plt.show()

ステップ2: 正規化により勾配降下法の高速化が可能

  1. X_train=X_train_orig/255.0
  2. X_テスト=X_テスト_orig/255.0
  3. Y_train = convert_to_one_hot(Y_train_orig,6)
  4. Y_test=convert_to_one_hot(Y_test_orig,6)

ステップ3: パラメータと畳み込みニューラルネットワーク構造を定義する

  1. def create_placeholder(num_px,チャンネル,n_y):
  2. X = tf.placeholder(tf.float32, シェイプ = (なし、num_px、num_px、チャネル)、名前= 'X' )
  3. Y = tf.placeholder(tf.float32, 形状 = (なし、n_y),名前= 'Y' )
  4. X,Yを返す
  5. X,Y=プレースホルダーを作成(64,3,6)
  6. print( "X=" +str(X))
  7. print( "Y=" +str(Y))
  8.  
  9. 定義重み変数(形状):
  10. tf.Variable(tf.truncated_normal(shape,stddev=0.1))を返します
  11. 定義バイアス変数(形状):
  12. tf.Variable(tf.constant(0.1,shape=shape))を返します
  13. def conv2d(x,W):
  14. tf.nn.conv2d(x,W,strides=[1,1,1,1],padding= 'SAME' )を返します
  15. max_pool_2x2(x)を定義します。
  16. tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding= 'SAME' )を返します
  17.  
  18. definitialize_parameters():
  19. w_conv1 = 重み変数([5,5,3,32])
  20. b_conv1 = バイアス変数([32])
  21.      
  22. w_conv2 = 重み変数([5,5,32,64])
  23. b_conv2 = バイアス変数([64])
  24.      
  25. w_fc1=重み変数([16*16*64,512])
  26. b_fc1 = バイアス変数([512])
  27.      
  28. w_fc2 = 重み変数([512,6])
  29. b_fc2 = バイアス変数([6])
  30.      
  31. パラメータ={
  32. "w_conv1" :w_conv1,
  33. "b_conv1" :b_conv1,
  34. "w_conv2" :w_conv2,
  35. "b_conv2" :b_conv2,
  36. "w_fc1" :w_fc1,
  37. "b_fc1" :b_fc1,
  38. "w_fc2" :w_fc2,
  39. "b_fc2" :b_fc2
  40. }
  41. 戻りパラメータ

ステップ4: フォワード伝播プロセス

  1. def forward_propagation(X,パラメータ):
  2. w_conv1 = パラメータ[ "w_conv1" ]
  3. b_conv1 = パラメータ[ "b_conv1" ]
  4. h_conv1 = tf.nn.relu(conv2d(X,w_conv1)+b_conv1) です。
  5. h_pool1 = 最大プール2x2(h_conv1)
  6.      
  7. w_conv2 = パラメータ[ "w_conv2" ]
  8. b_conv2 = パラメータ[ "b_conv2" ]
  9. h_conv2 = tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)
  10. h_pool2 = max_pool_2x2(h_conv2) です
  11.      
  12. w_fc1 = パラメータ[ "w_fc1" ]
  13. b_fc1 = パラメータ[ "b_fc1" ]
  14. h_pool2_flat = tf.reshape(h_pool2、[-1, 16*16*64]) を返します。
  15. h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat、w_fc1) + b_fc1)
  16.      
  17. #keep_prob=tf.placeholder(tf.float32)
  18. #h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
  19.      
  20. w_fc2 = パラメータ[ "w_fc2" ]
  21. b_fc2 = パラメータ[ "b_fc2" ]
  22. y_conv=tf.matmul(h_fc1,w_fc2)+b_fc2
  23. y_convを返す

ステップ5: コスト関数

  1. def compute_cost(y_conv,Y):
  2.  
  3. コスト = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y_conv,labels=Y))
  4. 返品費用

ステップ6: 勾配降下法によるパラメータの更新

  1. def random_mini_batches1(X, Y, mini_batch_size = 64, seed = 0):
  2. m = X.shape[0] #トレーニング例
  3. ミニバッチ = []
  4. np.random.seed(シード)
  5. Y=YT #(1080,6)
  6. # ステップ 1: シャッフル (X, Y)
  7. 順列 = リスト(np.random.permutation(m))
  8. shuffled_X = X[順列,:,:,:]
  9. shuffled_Y = Y[順列,:].reshape((m,Y.shape[1]))
  10.  
  11. # ステップ 2: パーティション (shuffled_X、shuffled_Y)。末尾を除く 場合
  12. num_complete_minibatches = math.floor(m/mini_batch_size) #ミニバッチ パーティションサイズmini_batch_size
  13. k範囲(0, num_complete_minibatches)内である場合:
  14. mini_batch_X = shuffled_X[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:,:,:]
  15. mini_batch_Y = shuffled_Y[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:]
  16. ミニバッチ = (ミニバッチ_X、ミニバッチ_Y)
  17. mini_batches.append(ミニバッチ)
  18.      
  19. #終わりの扱い ケース(最後のミニバッチ < mini_batch_size)
  20. m % mini_batch_size != 0 の場合:
  21. mini_batch_X = shuffled_X[num_complete_minibatches * mini_batch_size : m,:,:,:]
  22. mini_batch_Y = shuffled_Y[num_complete_minibatches * mini_batch_size : m,:]
  23. ミニバッチ = (ミニバッチ_X、ミニバッチ_Y)
  24. mini_batches.append(ミニバッチ)
  25.      
  26. mini_batchesを返す

ステップ7: モデルをトレーニングする

  1. def model(X_train、Y_train、X_test、Y_test、learning_rate=0.001、num_epochs=20、minibatch_size=32、print_cost= True ):
  2. ops.reset_default_graph() #(1080, 64, 64, 3)
  3. tf.set_random_seed(1) #Y_train(6, 1080)
  4. シード=3
  5. (m,num_px1,num_px2,c)=X_train.shape
  6. n_y = Y_train.shape[0]
  7. コスト=[]
  8. X,Y=プレースホルダーを作成(64,3,6)
  9. パラメータ = initialize_parameters()
  10.      
  11. Z3=forward_propagation(X,パラメータ)
  12. コスト = compute_cost(Z3,Y)
  13. optm = tf.train.AdamOptimizer(学習率).最小化(コスト)
  14.      
  15. correct_prediction = tf.equal(tf.argmax(Z3,1), tf.argmax(Y,1)) #1 を忘れたので、損失はどんどん小さくなっていますが、精度は常に 0 です
  16. 精度 = tf.reduce_mean( tf.cast (correct_prediction, tf.float32))
  17. tf.Session()を sessとして使用:
  18. tf.global_variables_initializer().run()
  19. 範囲(num_epochs)内のエポックの場合:
  20. エポックコスト=0
  21. num_minibatches = int (m/ミニバッチサイズ)
  22. シード+=1
  23. #次の入力は (6, 1080) 形式が必要なので、転置が必要です
  24. ミニバッチ = random_mini_batches1(X_train、Y_train、ミニバッチサイズ、シード)
  25.              
  26. ミニバッチ内のミニバッチの場合:
  27. (ミニバッチ_X、ミニバッチ_Y)=ミニバッチ
  28. _、ミニバッチコスト=sess.run([optm、コスト]、フィードディクショナリ={X:ミニバッチ_X、Y:ミニバッチ_Y})
  29. エポックコスト + = ミニバッチコスト / ミニバッチ数
  30. if(print_cost == True  エポック% 2==0):
  31. #print( "エポック" , '%04d' % (エポック+1), "コスト={:.9f}" .format(epoch_cost))
  32. print( "エポック後のコスト %i:%f" % (epoch,epoch_cost))
  33. if(print_cost == True  エポック%1==0):
  34. コスト.append(epoch_cost)
  35.                  
  36. print( "列車の精度: " , acceleration.eval({X:X_train,Y:Y_train.T}))
  37. print( "テスト精度: " , acceleration.eval({X:X_test,Y:Y_test.T}))
  38. plt.plot(np.squeeze(コスト))
  39. plt.ylabel( 'コスト' )
  40. plt.xlabel( '反復回数(10回ごと)' )
  41. plt.title( "学習率=" +str(learning_rate))
  42. plt.show()
  43.          
  44. パラメータ = sess.run(パラメータ)
  45. 戻りパラメータ
  46. パラメータ = モデル(X_train、Y_train、X_test、Y_test)

<<:  顔認証の過去と現在の徹底分析

>>:  Madlib を使用して「機械学習」で KNN を学習する

ブログ    
ブログ    

推薦する

...

ニューラル放射線フィールドは「神経」を取り除き、3D効果の品質を低下させることなくトレーニング速度を100倍以上向上させます。

2020年、カリフォルニア大学バークレー校、Google、カリフォルニア大学サンディエゴ校の研究者...

人工知能:この冷たい水はちょうどいいタイミングで注がれます!

最近、AI(人工知能)同時通訳詐欺事件をめぐる議論がテクノロジーや翻訳界で話題となり、「AIは人間を...

Verdict、2020年第1四半期のTwitterにおけるIoTトレンドトップ5を発表

私たちは、企業や専門家が IoT についてどう考えているかを知りたいと思っていますが、一般の人々はど...

慎重なソート - よく使われる 10 のディープラーニング アルゴリズム

過去 10 年間で、機械学習への関心は爆発的に高まりました。機械学習は、コンピューター プログラム、...

時間はお金だというのは本当です!この日本人男性は9日間で5千円を費やして「タイムマシン」を作ったが、1分巻き戻すのにかかる費用はたった1円だ。

子どもたちが小学生の頃、時間を大切にすることを教えるために、大人たちは「時間はお金であり、お金で時間...

人工知能は第五の変革をもたらします。あなたはこのチャンスをつかむことができますか?

人工知能の急速な発展は、新しい小売業者に力を与え、小売業界の「人、商品、場所」の要素を効果的に再構築...

...

Google I/O 2018 に注目: AI に始まり、AI に終わる

北京時間9日午前1時(米国現地時間5月8日午前10時)、カリフォルニア州マウンテンビューで2018 ...

【WOT2018】蘇寧ドットコム高超:AI技術+短編動画を電子商取引プラットフォームに応用

[51CTO.comより引用] 2013年頃、携帯電話やパソコンに短編動画が大量に登場し、低コスト、...

米国政府が警告: ​​ChatGPT は重大なセキュリティリスクをもたらす

最近、米国連邦政府は、ユーザーはChatGPTのサイバーセキュリティリスク、特にフィッシングやマルウ...

...

スマートビルディングにおけるエッジAIの役割を解明

仕事や住居のための物理的な空間として機能することから、入居者に活気ある建築体験を提供することまで、近...

アリババ・ダモ・アカデミーは、電力網の負荷を正確に予測するための新しい時系列予測モデルを提案している。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...