Pytorchニューラルネットワーク戦闘研究notes_17ディープ畳み込みニューラルネットワークの概要+プーリング操作+ディープ畳み込みニューラルネットワーク戦闘

1ディープ畳み込みニューラルネットワークの概要

1.1深い畳み込みニューラルネットワークモデルの構造図

1.1.1深い畳み込みニューラルネットワークの前方構造の分析

  • 入力層では、各ピクセルがフィーチャノードとしてネットワークに供給されます。
  • 畳み込み層:複数のフィルターで構成されます。
  • プーリングレイヤー:畳み込み結果の次元を減らし、畳み込み後に特徴マップで次元削減処理を実行して、より重要な特徴を取得します。グラフの元の特徴に基づいて、後続の操作の量が削減されます。
  • グローバル平均プーリングレイヤー:生成された特徴マップのグローバル平均を取得します。このレイヤーは、完全に接続されたネットワークに置き換えることができます。
  • 出力層:ネットワークはデータをいくつかのカテゴリに分割する必要があります。この層にはいくつかの出力ノードがあり、各出力ノードはそのタイプの現在のサンプルに属する確率を表します。

1.2畳み込みニューラルネットワークのバックプロパゲーションのステップ

(1)エラーを前のレイヤーに渡します。畳み込み演算の逆微分を実行する場合、生成された特徴マップを1回パディングしてから、転置された畳み込みカーネルを使用して畳み込み演算を実行し、の間違った美しさを取得します。入力端、およびエラーの逆伝達が実現されます。
(2)完全に接続されたネットワークでの逆微分と同じ、現在のエラーに対応する学習パラメータ式に従って更新する必要のある差分値を計算します。チェーンルールは、エラーを見つけて最小化するために引き続き使用されます。 。の水平度、次に学習率を使用して、更新された差を計算します。

2プーリング操作

2.1プーリング操作の概要

2.1.1プーリング操作の役割

次元削減の主な目的は、元の特徴を維持しながら配列のサイズを最小化することです。

2.1.2プーリングと畳み込みの比較

プーリング:フィルターのサイズのみを考慮し、主にフィルターマッピング領域のピクセルの平均値または最大値を取得します。

畳み込み:対応する位置のピクセルの積。

2.2プーリング操作の分類

2.2.1平​​均プーリング

画像のフィルターサイズに対応する領域で、そのすべてのピクセルの平均値が取得されます。これは、背景情報に対してより敏感です。

2.2.2最大プーリング

画像のフィルターサイズに対応する領域は、そのすべてのピクセルで最大値を取ります。これは、テクスチャの特徴により敏感です。

2.2プーリング機能インターフェース

2.2.1平​​均プーリング関数
nn.AvgPool2d-2次元平均プーリング操作icon-default.png?t = M276https://blog.csdn.net/qq_50001789/article/details/120537858

torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)
  • kernel_size:プーリングカーネルのサイズ
  • stride:ウィンドウの移動ストライド。デフォルトはkernel_sizeと同じサイズです。
  • パディング:両側のパディング幅のサイズがゼロ
  • ceil_mode:Trueに設定すると、出力形状の計算プロセスで切り上げ操作が使用されます。それ以外の場合は、切り下げ操作が使用されます。
  • count_include_pad:boolean、Trueの場合、ゼロパディングは平均プーリング計算に含まれます。それ以外の場合、ゼロパディングは含まれません。
  • divisor_override:指定されている場合、除数はdivisor_overrideに置き換えられます。つまり、この変数が指定されていない場合、平均プーリングの計算プロセスは実際にはプーリングカーネルで行われ、要素が追加され、プーリングカーネルのサイズで除算されます。つまり、divisor_overrideはデフォルトでプーリングカーネルの高さ×になります。 wide;この変数が指定されている場合、プーリングプロセスは、プールされたカーネル内の要素の合計であり、divisor_overrideで除算されます。

2.2.2最大プーリング機能

class torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
  • kernel_size(intまたはtuple)–最大プーリングのウィンドウサイズ
  • stride(intまたはtuple、オプション)–最大プーリングのためのウィンドウ移動のストライド。デフォルト値はkernel_sizeです
  • padding(intまたはtuple、オプション)-入力の各エッジに0を追加するレイヤーの数
  • 拡張(intまたはタプル、オプション)–ウィンドウ内の要素のストライドを制御するパラメーター
  • return_indices-Trueに等しい場合、出力最大値のインデックスを返します。これは、アップサンプリング操作に役立ちます。
  • ceil_mode-Trueに等しい場合、出力信号サイズを計算するときに、デフォルトの切り捨て操作の代わりに切り上げを使用します
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
  • kernel_size(intまたはtuple)–最大プーリングのウィンドウサイズ
  • stride(intまたはtuple、オプション)–最大プーリングのためのウィンドウ移動のストライド。デフォルト値はkernel_sizeです
  • padding(intまたはtuple、オプション)-入力の各エッジに0を追加するレイヤーの数
  • 拡張(intまたはタプル、オプション)–ウィンドウ内の要素のストライドを制御するパラメーター
  • return_indices-Trueに等しい場合、出力最大値のインデックスを返します。これは、アップサンプリング操作に役立ちます。
  • ceil_mode-Trueに等しい場合、出力信号サイズを計算するときに、デフォルトの切り捨て操作の代わりに切り上げを使用します

2.3プーリング機能の実際の戦闘

2.3.1入力変数の定義---pool2d.py(パート1)

import torch

### 1.1 定义输入变量
img = torch.tensor([
    [[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],
    [[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]]
]).reshape([1,2,4,4]) # 定义张量,模拟输入图像
print(img) # 输出结果
print(img[0][0]) # 输出第1通道的内容

#出力:
#tensor([[0、0、0、0]、
#[ 1、1、1、1]、#[
2、2、2、2]、
#[3、3、3、3]] )
print(img [0] [1])#チャネル2のコンテンツを出力します
#出力:
#tensor([[4、4、4、4]、
#[5、5、5、5]、
#[6、 6、6、6]、
#[7、7、7、7]])

2.3.2プーリング操作とコンピューティングの定義---pool2d.py(パート2)

### 定义池化操作
pooling = torch.nn.functional.max_pool2d(img,kernel_size=2)
print("pooling :",pooling) # 输出最大池化结果(池化区域为2,步长为2),

pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不补0
print("pooling1 :",pooling1) #  不补0,输出最大池化结果(池化区域为2X2,步长为1),生成3X3的矩阵

pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先执行补0,再进行池化
print("pooling2 :",pooling2) # 先执行补0,输出平均池化结果(池化区域为4X4,步长为1),生成3X3的矩阵

# 全局池化操作,使用一个与原来输入相同尺寸的池化区域来进行池化操作,一般在最后一层用于图像表达
pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4)
print("pooling3 :",pooling3) # 输出平均池化结果(池化区域为4,步长为4)

# 对于输入的张量计算两次均值,可得平均池化结果
m1 = img.mean(3)
print("第1次均值结果",m1)
print("第2次均值结果",m1.mean(2))
### 对于输入数据进行两次平均值操作时,可以看到在输入数据进行两次平均值计算的结果与pooling3的数值是一直的,即为等价

プーリング:テンソル([[[[1.、1。]、
          [3.、3。]]、

         [[5.、5。]、
          [7.、7。]]]])
pooling1:tensor([[[[1.、1.、1。]、
          [2.、2.、2。]、
          [ 3.、3.、3。]]、

         [[5.、5.、5。]、
          [6.、6.、6。]、
          [7.、7.、7。]]]])
pooling2:tensor([[[[0.0000、0.0000、0.0000 、
          0.0000、0.0000]、
          [0.2500、0.5000、0.5000、0.5000、0.2500 ]、[0.7500、1.5000、1.5000、1.5000、0.7500]、[1.2500、2.5000、2.5000、2.5000、1.2500
          ]、
          [0.7500、1.5000、1.5000、1.5000 、0.7500]]、

         [[
          1.0000、2.0000、2.0000 ]、
          [2.2500、4.5000]、[2.7500、5.5000]、[2.7500、5.7500
          ]、[3.2500、6.5000、6.5000、6.5000、3.2500]、
          [1.7500、3.5000、3.5000、3.5000、1.7500] ]]])
pooling3:tensor([[[[1.5000]]、[[5.5000]]]])
1番目の平均結果テンソル([[[0.、1.、2.、3。]、
         [4.、5 。、6.、7。]]])
2番目の平均結果テンソル([[1.5000、5.5000]])

2.3.3コードの概要---pool2d.py

import torch

### 1.1 定义输入变量
img = torch.tensor([
    [[0.0,0.0,0.0,0.0],[1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0],[3.0,3.0,3.0,3.0]],
    [[4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0],[6.0,6.0,6.0,6.0],[7.0,7.0,7.0,7.0]]
]).reshape([1,2,4,4]) # 定义张量,模拟输入图像
print(img) # 输出结果
print(img[0][0]) # 输出第1通道的内容
# 输出:
# tensor([[0, 0, 0, 0],
#         [1, 1, 1, 1],
#         [2, 2, 2, 2],
#         [3, 3, 3, 3]])
print(img[0][1]) # 输出第2通道的内容
# 输出:
# tensor([[4, 4, 4, 4],
#         [5, 5, 5, 5],
#         [6, 6, 6, 6],
#         [7, 7, 7, 7]])

### 定义池化操作
pooling = torch.nn.functional.max_pool2d(img,kernel_size=2)
print("pooling :",pooling) # 输出最大池化结果(池化区域为2,步长为2),

pooling1 = torch.nn.functional.max_pool2d(img,kernel_size=2,stride=1) # 不补0
print("pooling1 :",pooling1) #  不补0,输出最大池化结果(池化区域为2X2,步长为1),生成3X3的矩阵

pooling2 = torch.nn.functional.avg_pool2d(img,kernel_size=2,stride=1,padding=1)# 先执行补0,再进行池化
print("pooling2 :",pooling2) # 先执行补0,输出平均池化结果(池化区域为4X4,步长为1),生成3X3的矩阵

# 全局池化操作,使用一个与原来输入相同尺寸的池化区域来进行池化操作,一般在最后一层用于图像表达
pooling3 = torch.nn.functional.avg_pool2d(img,kernel_size=4)
print("pooling3 :",pooling3) # 输出平均池化结果(池化区域为4,步长为4)

# 对于输入的张量计算两次均值,可得平均池化结果
m1 = img.mean(3)
print("第1次均值结果",m1)
print("第2次均值结果",m1.mean(2))
### 对于输入数据进行两次平均值操作时,可以看到在输入数据进行两次平均值计算的结果与pooling3的数值是一直的,即为等价

動作中の3つの深い畳み込みニューラルネットワーク

おすすめ

転載: blog.csdn.net/qq_39237205/article/details/123446172