日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID...

發(fā)布時(shí)間:2023/12/20 卷积神经网络 95 豆豆
生活随笔 收集整理的這篇文章主要介紹了 padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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

源碼中對(duì)于padding參數(shù)的說(shuō)明如下:

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

說(shuō)了padding可以用“SAME”和“VALID”兩種方式,但是對(duì)于這兩種方式具體是什么并沒有多加說(shuō)明。 這里用Stack Overflow中的一份代碼來(lái)簡(jiǎn)單說(shuō)明一下,代碼如下:

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()) # 最后輸出的結(jié)果為: (1, 1, 1, 1) (1, 1, 2, 1)

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

接下來(lái)就是“SAME”和“VALID”的區(qū)別所在,由于步長(zhǎng)為2,當(dāng)向右滑動(dòng)兩步之后“VALID”發(fā)現(xiàn)余下的窗口不到2x2所以就把第三列直接去了,而“SAME”并不會(huì)把多出的一列丟棄,但是只有一列了不夠2x2怎么辦?填充!

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

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

我們?cè)O(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)時(shí)需要設(shè)置輸入輸出的shape,源碼nn_ops.py中的convolution函數(shù)和pool函數(shù)給出的計(jì)算公式如下:

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為一個(gè)可選的參數(shù),默認(rèn)為1,這里我們可以先不管它。 整理一下,對(duì)于“VALID”,輸出的形狀計(jì)算如下:

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

第2種解說(shuō):利用tf.nn.conv2d示例來(lái)理解 strides, padding效果

這里先再簡(jiǎn)單重復(fù)一下tf.nn.conv2d使用,其基本參數(shù)的使用規(guī)范同樣也適用于其他CNN語(yǔ)句

tf.nn.conv2d (input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
  • input : 輸入的要做卷積的圖片,要求為一個(gè)張量,shape為 [ batch, in_height, in_weight, in_channel ],其中batch為圖片的數(shù)量,in_height 為圖片高度,in_weight 為圖片寬度,in_channel 為圖片的通道數(shù),灰度圖該值為1,彩色圖為3。(也可以用其它值,但是具體含義不是很理解)
  • filter: 卷積核,要求也是一個(gè)張量,shape為 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 為卷積核高度,filter_weight 為卷積核寬度,in_channel 是圖像通道數(shù) ,和 input 的 in_channel 要保持一致,out_channel 是卷積核數(shù)量。
  • strides: 卷積時(shí)在圖像每一維的步長(zhǎng),這是一個(gè)一維的向量,[ 1, strides, strides, 1],第一位和最后一位固定必須是1
  • padding: string類型,值為“SAME” 和 “VALID”,表示的是卷積的形式,是否考慮邊界。"SAME"是考慮邊界,不足的時(shí)候用0去填充周圍,"VALID"則不考慮
  • use_cudnn_on_gpu: bool類型,是否使用cudnn加速,默認(rèn)為true
import tensorflow as tf # case 1 # 輸入是1張 3*3 大小的圖片,圖像通道數(shù)是5,卷積核是 1*1 大小,數(shù)量是1 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 3*3 的feature map # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 2*2 大小,數(shù)量是1 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 3*3 的feature map # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是1 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 1*1 的feature map (不考慮邊界) # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是1 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 3*3 的feature map (不考慮邊界) # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是1 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 5*5 的feature map (考慮邊界) # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是7 # 步長(zhǎng)是[1,1,1,1]最后得到一個(gè) 5*5 的feature map (考慮邊界) # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是7 # 步長(zhǎng)是[1,2,2,1]最后得到7個(gè) 3*3 的feature map (考慮邊界) # 1張圖最后輸出就是一個(gè) 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 大小的圖片,圖像通道數(shù)是5,卷積核是 3*3 大小,數(shù)量是7 # 步長(zhǎng)是[1,2,2,1]最后每張圖得到7個(gè) 3*3 的feature map (考慮邊界) # 10張圖最后輸出就是一個(gè) 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))

# 運(yùn)行結(jié)果

運(yùn)行結(jié)果這里就省略了,太長(zhǎng)了,所以不寫這里了。復(fù)制語(yǔ)句到Jupyter中運(yùn)行一下就懂了

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

總結(jié)

以上是生活随笔為你收集整理的padding和卷积的区别_TensorFlow笔记1——20.CNN卷积神经网络padding两种模式SAME和VALID...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 爱情岛论坛成人 | 蘑菇福利视频一区播放 | 久热精品视频在线观看 | 一区二区中文字幕在线观看 | 97超碰资源站 | 草草影院欧美 | 亚洲乱论| 色乱码一区二区三在线看 | 国产白丝精品91爽爽久久 | 日本精品视频 | 3344av| 久久草视频 | 91成人免费电影 | 高h校园不许穿内裤h调教 | 国产成人在线视频免费观看 | 精品久久国产视频 | 中文字幕在线字幕中文 | 久久精品操 | 国产在线www | 国产视频手机在线观看 | 免费人妻精品一区二区三区 | 久久99精品久久久久久国产越南 | 在线视频免费观看你懂的 | 亚洲一区二区三区四区电影 | 国产伦一区二区三区 | 校花被c到呻吟求饶 | 黄色成人小视频 | 免费无遮挡网站 | 在线观看香蕉视频 | 免费国产网站 | 婷婷激情综合 | 亚洲乱亚洲乱妇 | 午夜在线视频观看 | 日韩av无码一区二区三区 | 中国黄色片视频 | 9999免费视频| www日本www| 国产成人a∨ | 国产亚洲久一区二区 | 91av免费看| 天堂中文8 | 成人黄色视屏 | 国产亚洲高清视频 | 91免费观看网站 | 亚洲乱码一区二区三区在线观看 | 国产富婆一级全黄大片 | 在线看日韩 | 国产亚洲一区二区三区 | 欧美mv日韩mv国产网站app | 上原亚衣在线 | 亚洲自拍在线观看 | 你懂得在线 | xxxx黄色片| 丁香九月激情 | 欧美亚州国产 | 欧美91精品久久久久国产性生爱 | 国产成人99久久亚洲综合精品 | 在线看一区二区 | 午夜片在线观看 | 欧美精品一区二区三区四区五区 | 性色福利| 人善交videos欧美3d动漫 | 久久1234 | www.狠狠干| 欧美日韩中文国产一区发布 | 国产成人专区 | 国产在线观看一区 | 国产精品系列在线观看 | 久久性生活视频 | 亚洲av无码一区二区三区网址 | 极品粉嫩小仙女高潮喷水久久 | 国内精品偷拍视频 | 懂色av蜜臀av粉嫩av分 | 青娱乐最新官网 | 中国丰满熟妇xxxx性 | 欧美一区二区在线观看视频 | 无限国产资源 | 自拍天堂 | 97激情| 天天射天天干天天 | 国产黄色免费观看 | 亚洲黄色一区二区 | 舌奴调教日记 | 裸体美女免费视频网站 | 91视频国产免费 | 激情久久视频 | 男男h黄动漫啪啪无遮挡软件 | 温柔女教师在线观看 | 成人动态视频 | 夜夜看av | a国产免费 | 中国一级免费毛片 | 国产在线喷水 | 日韩首页 | 国产传媒av | 国产一区二区不卡视频 | 国产精品一区二区无码免费看片 | 不卡中文av | 亚洲蜜桃av |