padding和卷積的區別_TensorFlow筆記1——20.CNN卷積神經網絡padding兩種模式SAME和VALID...

第1種解說:(核心最后一張圖,兩種填充方式輸出的形狀尺寸計算公式)

在用tensorflow寫CNN的時候,調用卷積核api的時候,會有填padding方式的參數,找到源碼中的函數定義如下(max pooling也是一樣):

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

源碼中對于padding參數的說明如下:

padding: A string from: "SAME", "VALID". The type of padding algorithm to use.

說了padding可以用“SAME”和“VALID”兩種方式,但是對于這兩種方式具體是什么并沒有多加說明。 這里用Stack Overflow中的一份代碼來簡單說明一下,代碼如下:

x = tf.constant([[1., 2., 3.],[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')print(valid_pad.get_shape())
print(same_pad.get_shape())
# 最后輸出的結果為:
(1, 1, 1, 1) 
(1, 1, 2, 1)

可以看出“SAME”的填充方式是比“VALID”的填充方式多了一列。 讓我們來看看變量x是一個2x3的矩陣,max pooling窗口為2x2,兩個維度的strides=2。 第一次由于窗口可以覆蓋(橙色區域做max pool操作),沒什么問題,如下:

149af4b7ff7e6cd14ce1ae6cfff48a9e.png

接下來就是“SAME”和“VALID”的區別所在,由于步長為2,當向右滑動兩步之后“VALID”發現余下的窗口不到2x2所以就把第三列直接去了,而“SAME”并不會把多出的一列丟棄,但是只有一列了不夠2x2怎么辦?填充!

2c425d3b660785dfb1de0d5e9dc813d7.png

如上圖所示,“SAME”會增加第四列以保證可以達到2x2,但為了不影響原來的圖像像素信息,一般以0來填充。(這里使用表格的形式展示,markdown不太好控制格式,明白意思就行),這就不難理解不同的padding方式輸出的形狀會有所不同了。

在CNN用在文本中時,一般卷積層設置卷積核的大小為n×k,其中k為輸入向量的維度(即[n,k,input_channel_num,output_channel_num]),這時候我們就需要選擇“VALID”填充方式,這時候窗口僅僅是沿著一個維度掃描而不是兩個維度。可以理解為統計語言模型當中的N-gram。

我們設計網絡結構時需要設置輸入輸出的shape,源碼nn_ops.py中的convolution函數和pool函數給出的計算公式如下:

If padding == "SAME":output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])If padding == "VALID":output_spatial_shape[i] =ceil((input_spatial_shape[i] -(spatial_filter_shape[i]-1) * dilation_rate[i])/ strides[i]).

dilation_rate為一個可選的參數,默認為1,這里我們可以先不管它。 整理一下,對于“VALID”,輸出的形狀計算如下:

e55375d35b236b2f200820b21ca09e87.png

參考<https://cloud.tencent.com/developer/article/1012365>

第2種解說:利用tf.nn.conv2d示例來理解 strides, padding效果

這里先再簡單重復一下tf.nn.conv2d使用,其基本參數的使用規范同樣也適用于其他CNN語句

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
  • input : 輸入的要做卷積的圖片,要求為一個張量,shape為 [ batch, in_height, in_weight, in_channel ],其中batch為圖片的數量,in_height 為圖片高度,in_weight 為圖片寬度,in_channel 為圖片的通道數,灰度圖該值為1,彩色圖為3。(也可以用其它值,但是具體含義不是很理解)
  • filter: 卷積核,要求也是一個張量,shape為 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 為卷積核高度,filter_weight 為卷積核寬度,in_channel 是圖像通道數 ,和 input 的 in_channel 要保持一致,out_channel 是卷積核數量。
  • strides: 卷積時在圖像每一維的步長,這是一個一維的向量,[ 1, strides, strides, 1],第一位和最后一位固定必須是1
  • padding: string類型,值為“SAME” 和 “VALID”,表示的是卷積的形式,是否考慮邊界。"SAME"是考慮邊界,不足的時候用0去填充周圍,"VALID"則不考慮
  • use_cudnn_on_gpu: bool類型,是否使用cudnn加速,默認為true
import tensorflow as tf
# case 1
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 1*1 大小,數量是1
# 步長是[1,1,1,1]最后得到一個 3*3 的feature map
# 1張圖最后輸出就是一個 shape為[1,3,3,1] 的張量
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([1,1,5,1]))
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')# case 2
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 2*2 大小,數量是1
# 步長是[1,1,1,1]最后得到一個 3*3 的feature map
# 1張圖最后輸出就是一個 shape為[1,3,3,1] 的張量 
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([2,2,5,1]))
op2 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')# case 3  
# 輸入是1張 3*3 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最后得到一個 1*1 的feature map (不考慮邊界)
# 1張圖最后輸出就是一個 shape為[1,1,1,1] 的張量
input = tf.Variable(tf.random_normal([1,3,3,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op3 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') # case 4
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最后得到一個 3*3 的feature map (不考慮邊界)
# 1張圖最后輸出就是一個 shape為[1,3,3,1] 的張量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op4 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID')  # case 5  
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是1
# 步長是[1,1,1,1]最后得到一個 5*5 的feature map (考慮邊界)
# 1張圖最后輸出就是一個 shape為[1,5,5,1] 的張量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op5 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')  # case 6 
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,1,1,1]最后得到一個 5*5 的feature map (考慮邊界)
# 1張圖最后輸出就是一個 shape為[1,5,5,7] 的張量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op6 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')  # case 7  
# 輸入是1張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,2,2,1]最后得到7個 3*3 的feature map (考慮邊界)
# 1張圖最后輸出就是一個 shape為[1,3,3,7] 的張量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op7 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME')  # case 8  
# 輸入是10 張 5*5 大小的圖片,圖像通道數是5,卷積核是 3*3 大小,數量是7
# 步長是[1,2,2,1]最后每張圖得到7個 3*3 的feature map (考慮邊界)
# 10張圖最后輸出就是一個 shape為[10,3,3,7] 的張量
input = tf.Variable(tf.random_normal([10,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op8 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME')  init = tf.initialize_all_variables() 
with tf.Session() as sess:sess.run(init)print('*' * 20 + ' op1 ' + '*' * 20)print(sess.run(op1))print('*' * 20 + ' op2 ' + '*' * 20)print(sess.run(op2))print('*' * 20 + ' op3 ' + '*' * 20)print(sess.run(op3))print('*' * 20 + ' op4 ' + '*' * 20)print(sess.run(op4))print('*' * 20 + ' op5 ' + '*' * 20)print(sess.run(op5))print('*' * 20 + ' op6 ' + '*' * 20)print(sess.run(op6))print('*' * 20 + ' op7 ' + '*' * 20)print(sess.run(op7))print('*' * 20 + ' op8 ' + '*' * 20)print(sess.run(op8))

# 運行結果

運行結果這里就省略了,太長了,所以不寫這里了。復制語句到Jupyter中運行一下就懂了

參考<理解tf.nn.conv2d方法>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MORMOT數據庫連接池

MORMOT數據庫連接池 MORMOT封裝了一堆的PROPS控件&#xff0c;用于連接各種數據庫。 MORMOT的封裝是武裝到了牙齒的&#xff0c;這堆PROPS控件居然數據庫連接池也封裝好了。這就為我們省了不少事&#xff0c;筆者非常喜歡&#xff01; 下面拿TOleDBMSSQLConnectionProperties控…

循環神經網絡變形之 (Long Short Term Memory,LSTM)

1、長短期記憶網絡LSTM簡介 在RNN 計算中&#xff0c;講到對于傳統RNN水平方向進行長時刻序列依賴時可能會出現梯度消失或者梯度爆炸的問題。LSTM 特別適合解決這種需要長時間依賴的問題。 LSTM&#xff08;Long Short Term Memory&#xff0c;長短期記憶網絡&#xff09;是R…

Windows 系統下使用 MinGW + MSYS + GCC 編譯 FFMPEG

一定要按照順序操作&#xff0c;否則你很可能持續遇到很多奇怪的問題&#xff08;ffmpeg對編譯系統版本要求比較高&#xff09;。 1. www.mingw.org: 下載并安裝 MinGW 5.1.4 (http://jaist.dl.sourceforge.net/sourceforge/mingw/MinGW-5.1.4.exe)&#xff0c;安裝時選中 g, m…

eclipse怎樣改編碼格式_Eclipse中各種編碼格式及設置

操作系統&#xff1a;Windows 10(家庭中文版)Eclipse版本&#xff1a;Version: Oxygen.1a Release (4.7.1a)剛看到一篇文章&#xff0c;里面介紹說Ascii、Unicode是編碼&#xff0c;而GBK、UTD-8等是編碼格式。Java中的編碼問題(by 迷失之路)&#xff1a;https://www.cnblogs.c…

UE4 ShooterGame Demo的開火的代碼

之前一直沒搞懂按下鼠標左鍵開火之后&#xff0c;代碼的邏輯是怎么走的&#xff0c;今天看懂了之前沒看懂的部分&#xff0c;進了一步 ShooterCharacter.cpp void AShooterCharacter::OnStartFire() {AShooterPlayerController* MyPC Cast<AShooterPlayerController>(Co…

kafka 異常:return ‘<SimpleProducer batch=%s>‘ % self.async ^ SyntaxError: invalid syntax

Python3.X 執行Python編寫的生產者和消費者報錯&#xff0c;報錯信息如下&#xff1a; Traceback (most recent call last): File "mykit_kafka_producer.py", line 9, in <module> from kafka import KafkaProducer File "/usr/local/lib/python3.7/sit…

python 分布式計算框架_漫談分布式計算框架

如果問 mapreduce 和 spark 什么關系&#xff0c;或者說有什么共同屬性&#xff0c;你可能會回答他們都是大數據處理引擎。如果問 spark 與 tensorflow 呢&#xff0c;就可能有點迷糊&#xff0c;這倆關注的領域不太一樣啊。但是再問 spark 與 MPI 呢&#xff1f;這個就更遠了。…

Codeforces 899D Shovel Sale

題目大意 給定正整數 $n$&#xff08;$2\le n\le 10^9$&#xff09;。 考慮無序整數對 $(x, y)$&#xff08;$1\le x,y\le n, x\ne y$&#xff09;。 求滿足 「$xy$ 結尾連續的 9 最多」的數對 $(x,y)$ 的個數。 例子&#xff1a; $n50$&#xff0c;$(49,50)$ 是一個滿足條件的…

Windows系統使用minGW+msys 編譯ffmpeg 0.5的全過程詳述

一.環境配置 1.下載并安裝 MinGW-5.1.4.exe (http://jaist.dl.sourceforge.net/sourcef … -5.1.4.exe)&#xff0c;安裝時選中 g, mingw make。建議安裝到c:/mingw. 2.下載并安裝 MSYS-1.0.11-rc-1.exe (http://jaist.dl.sourceforge.net/sourcef … 1-rc-1.exe)&#xff0c;安…

Liunx安裝gogs,mysql,jdk,tomcat等常用軟件

Liunx CentOS系統采用yum安裝Mysql 一.安裝mysql客戶端 yum -y install mysql 二.安裝mysql服務器端 [注意:由于CentOS7下的不自帶mysql-server,所以得先安裝資源包,步驟: 1.wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm (采用wget獲取必須有wge…

stm32單片機端口映射_STM32單片機的重映射與地址映射的使用方法及步驟

重映射STM32中對于一些端口的外設已經被其他引腳所使用&#xff0c;這是就需要用端口重映射來解決了&#xff0c;很方便。以USART1為例重映射的步驟為&#xff1a;打開重映射時鐘和USART重映射后的I/O口引腳時鐘&#xff0c;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_A…

python 第三方模塊 yaml - 處理 YAML (專門用來寫配置文件的語言)

markdown 的配置使用 Yaml —— Yet Another Markup Language &#xff1a;另一種標記語言。 簡介 YAML 是專門用來寫配置文件的語言&#xff0c;非常簡潔和強大&#xff0c;遠比 JSON 格式方便。 YAML在python語言中有PyYAML安裝包。 YAML 語言&#xff08;發音 /?jm?l/ &…

程序員 賺錢

業余編程賺錢 程序員的好方法 現在的人生活水平高了&#xff0c;開銷也大了&#xff0c;同時對于一些技術性人員來說有很多種&#xff0c;有些程序員自己開公司&#xff0c;開發自己的產品&#xff0c;年賺百萬&#xff0c;有些程序員還在給別人打工&#xff0c;每天累死累活的…

java合并單元格的快捷鍵_java poi合并單元格問題

使用poi導出的execl合并單元格&#xff0c;會出現下圖問題整個單元格看似合并了&#xff0c;但是文字沒有垂直居中&#xff0c;而且execl中所有的合并都會在第三行開始出現灰色分層樣式合并單元格偽代碼String upCompareField ""; //上一行的對比值for(int i 0; i …

webpack自動化構建腳本指令npm run dev/build

指令 為不同環境配置可執行指令&#xff0c;我們使用npm scripts方式&#xff0c;在package.json文件中配置執行指令&#xff1a; {"scripts": {"start": "cross-env NODE_ENVdev webpack-dev-server","build": "cross-env NODE_…

前端之 form 詳解

認識表單 在一個頁面上可以有多個form表單&#xff0c;但是向web服務器提交表單的時候&#xff0c;一次只可以提交一個表單。要聲明一個表單&#xff0c;只需要使用 form 標記來標明表單的開始和結束&#xff0c;若需要向服務器提交數據&#xff0c;則在form標簽中需要設置act…

代碼 優化 指南 實踐

C代碼優化方案 華中科技大學計算機學院 姓名&#xff1a; 王全明 QQ&#xff1a; 375288012 Email&#xff1a; quanming1119163.com 目錄 目錄 C代碼優化方案 1、選擇合適的算法和數據結構 2、使用盡量小的數據類型 3、減少運算的強度 &#xff08;1&…

.12-淺析webpack源碼之NodeWatchFileSystem模塊總覽

剩下一個watch模塊&#xff0c;這個模塊比較深&#xff0c;先大概過一下整體涉及內容再分部講解。 流程圖如下&#xff1a; NodeWatchFileSystem const Watchpack require("watchpack");class NodeWatchFileSystem {constructor(inputFileSystem) {this.inputFileSy…

Python 第三方模塊之 beautifulsoup(bs4)- 解析 HTML

簡單來說&#xff0c;Beautiful Soup是python的一個庫&#xff0c;最主要的功能是從網頁抓取數據。官方解釋如下&#xff1a;官網文檔 Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。 它是一個工具箱&#xff0c;通過解析文檔為用戶提供…

modal vue 關閉_Vue彈出框的優雅實踐

引言頁面引用彈出框組件是經常碰見的需求,如果強行將彈出框組件放入到頁面中,雖然功能上奏效但沒有實現組件與頁面間的解耦,非常不利于后期的維護和功能的擴展.下面舉個例子來說明一下這種做法的弊端.click"openModal()">點擊 :is_open"is_open" close…