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次元平均プーリング操作https://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的数值是一直的,即为等价