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

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

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

ネットワーク構造図

図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 を学習する

ブログ    
ブログ    

推薦する

GPT のプログラミング バージョンは 30,000 スターに急上昇し、AutoGPT は危険にさらされています。

執筆者 | 王 瑞平AutoGPT に続いて、GPT ファミリーに新しいメンバーである GPT-En...

深層強化学習の謎を解く

【51CTO.com クイック翻訳】 深層強化学習は、人工知能の最も興味深い分野の 1 つです。ボー...

決定木のルネッサンス?ニューラルネットワークと組み合わせることで、ImageNetの分類精度が向上し、解釈が容易になります。

ケーキも食べて、ケーキも残したいです! BAIR は、正確性と解釈可能性のバランスをとったニューラル...

春節祭でロボットが書道を行う。書道家は職を失うことになるのか?

毎年、春節の祝祭舞台ではさまざまな「ブラックテクノロジー」が必ず使われています。2021年の丑年春節...

...

...

...

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

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

「顔スキャン」はもはやジョークではなく、マスクを着用していても機能します

[51CTO.comからのオリジナル記事] 近年、人工知能、ビッグデータ、クラウドコンピューティング...

10年後の市場規模は1.3兆ドル。「モデル電源時代」到来

半年以上にわたる大規模なモデル嵐の後、AIGC 市場には新たな変化が起こり始めました。クールな技術デ...

機械学習のための特徴選択の5つの方法!

使用される特徴の数が増えるにつれて、モデルのパフォーマンスが向上することが分かっています。ただし、ピ...

VB.NET コーディングアルゴリズム学習ノート

この記事では、VB.NET コーディング アルゴリズムを紹介します。おそらく、まだ多くの人が VB....

...

凌創志新は、AI商業化の閉ループを作成するための最初のデータアノテーションビジネスを立ち上げました

アジアのビッグデータおよび人工知能企業である凌創志信は、同社の伝統的なリテイン事業であるデータラベリ...

AI軍拡競争により、将来のAIハードウェアアーキテクチャの開発に3つの主要な方向性が生まれました。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...