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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tf.nn.conv2d() / tf.nn.depthwise_conv2d() 和 Batchsize效益

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tf.nn.conv2d() / tf.nn.depthwise_conv2d() 和 Batchsize效益 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 卷積函數(shù)tf.nn.conv2d()?

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NHWC',dilations=[1, 1, 1, 1], name=None)

對于給定的4-D張量輸入,利用給定的filter執(zhí)行2-D卷積運算。

  • input : [batch, in_height, in_width, in_channels]
  • filter : [filter_height, filter_width, in_channels, out_channels]
  • padding: "SAME" / "VALID"
  • data_format: Defaults to "NHWC".

算法執(zhí)行過程:
1.filter壓平成2D矩陣,[filter_height * filter_width * in_channels, output_channels]
2.input中提取圖像塊, [batch, out_height, out_width, filter_height * filter_width * in_channels]
3.對于每一個圖像塊,右乘濾波器矩陣和圖像塊向量。

實例:

? ??

左邊代表input:[BatchSize, H, W, in_Channels]=[24,255,255,3];

右側(cè)代表filter:Batch_size*[Filter_H, Filter_W, in_Channels, out_Channels]=[127,127,3,1];?

所以,程序循環(huán)24次,即可以完成對一個BatchSize=24的卷積/相關(guān)操作,輸出結(jié)果為:

這個過程是比較復雜的,Tensorflow中提供了更好的深度卷積deep_wise_conv2d()函數(shù)可以執(zhí)行類似的功能。

2.?深度卷積tf.nn.depthwise_conv2d()

深度卷積最早出現(xiàn)在Google的Xception系列的文章,具體的算法實現(xiàn)可以參考xf_mao博主的這邊文章:https://blog.csdn.net/mao_xiao_feng/article/details/78003476。這里我僅僅應(yīng)用該函數(shù)實現(xiàn)了BatchSize圖像的對應(yīng)(Channel-Wise)卷積工作。

tf.nn.depthwise_conv2d(input, filter, strides, padding, rate=None, name=None, data_format=None)

給定4D的輸入張量input=[batch, in_height, in_width, in_channels],濾波器filter=[filter_height,?filter_width, in_channels, channel_multiplier]。 該濾波器包括深度為1的in_channels個卷積濾波器。depthwise_conv2d()對每個輸入通道(從1到channel_multiplier通道)施加一個不同的filter。然后將輸出結(jié)果concatenate到一起。輸出的通道數(shù)=[in_channels * channel_multiplier]。

對照我們的任務(wù)。input:[BatchSize, H, W, in_Channels]=[24,255,255,3]; filter:Batch_size*[Filter_H, Filter_W, in_Channels, out_Channels] = [127,127,3,1]; 如果想實現(xiàn)對應(yīng)圖層采用對應(yīng)核圖像進行卷積[Channel-Wise],我們需要將input和filter的shape進行調(diào)整。具體為 input=[1, H, W,?BatchSize*in_Channels]; filter=[Filter_H, Filter_W, Batch_Size*in_Channels,1].

核心代碼:

Bz, Hz, Wz, Cz = z.shape Bx, Hx, Wx, Cx = x.shape; zf = tf.reshape(zf, (Hz, Wz, Bz*Cz, 1)) xf = tf.reshape(xf, (1, Hx, Wx, Bx*Cx)) print("zf= ", zf.get_shape().as_list(), " ", "xf=", xf.get_shape().as_list())res_ = tf.nn.depthwise_conv2d(xf, zf, strides=[1,1,1,1], padding='VALID') res_ = tf.concat(tf.split(res_, 24, axis=3), axis=0) res_ = tf.reduce_mean(res_, axis=3, keep_dims = False) print("the results of deep_wise_conv2d:", res_.get_shape().as_list())

輸出結(jié)果和循環(huán)tf.nn.conv2d()的結(jié)果一致。

3. 關(guān)于mini-batch的作用

3.1 為什么需要有 Batch_Size 這個參數(shù)??

  • 合理的范圍,越大的 batch size 使下降方向越準確,震蕩越小
  • batch size 過大,各batch梯度修正值可能消失,出現(xiàn)取得局部最優(yōu)的情況
  • bath size 過小,引入的隨機性更大,難以達到收斂,極少數(shù)情況下可能會效果變好

Batch的選擇決定了優(yōu)化函數(shù)梯度的下降方向。如果數(shù)據(jù)集比較小,完全可以采用全數(shù)據(jù)集 ( Full Batch Learning )的形式,這樣做至少有 2 個好處:

  • 由全數(shù)據(jù)集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向
  • 由于不同權(quán)重的梯度值差別巨大,因此選取一個全局的學習率很困難。Full Batch Learning 可以使用Rprop只基于梯度符號并且針對性單獨更新各權(quán)值。

對于類似于ImageNet等超大數(shù)據(jù)集,以上 2 個好處又變成了 2 個壞處:

  • 隨著數(shù)據(jù)集的海量增長和內(nèi)存限制,一次性載入所有的數(shù)據(jù)進來變得越來越不可行
  • 以 Rprop 方式迭代,由于各個 Batch 間的采樣差異,各次梯度修正值相互抵消,這才有了后來RMSProp的妥協(xié)

如果每次只訓練一個樣本,即 Batch_Size = 1。這就是在線學習(Online Learning)。線性神經(jīng)元在均方誤差代價函數(shù)的錯誤面是一個拋物面,橫截面是橢圓。對于多層神經(jīng)元、非線性網(wǎng)絡(luò),在局部依然近似是拋物面。使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。如上圖所示。

3.2 Mini-Batch 可以解決什么問題?

如果數(shù)據(jù)集足夠充分,那么用一半(甚至少得多)的數(shù)據(jù)訓練算出來的梯度與用全部數(shù)據(jù)訓練出來的梯度是幾乎一樣的。這就是批梯度下降法(Mini-batches Learning)。

在合理范圍內(nèi),增大 Batch_Size 有何好處?內(nèi)存利用率提高了,大矩陣乘法的并行化效率提高。?跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,對于相同數(shù)據(jù)量的處理速度進一步加快。?在一定范圍內(nèi),一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震蕩越小。 盲目增大 Batch_Size 有何壞處?內(nèi)存利用率提高了,但是內(nèi)存容量可能撐不住了。?跑完一次 epoch(全數(shù)據(jù)集)所需的迭代次數(shù)減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數(shù)的修正也就顯得更加緩慢。?

3.3?調(diào)節(jié) Batch_Size 對訓練效果影響到底如何??

Batch_Size 增大到一定程度,其確定的下降方向已經(jīng)基本不再變化。 調(diào)節(jié) Batch_Size 對訓練效果影響到底如何??這里展示了在 MNIST 數(shù)據(jù)集上的效果。如圖所示:

算法架構(gòu):

?

Batch_Size對訓練結(jié)果的影響:

結(jié)論:

  • Batch_Size 太小,算法在 200 epoches 內(nèi)不收斂。?
  • 隨著 Batch_Size 增大,處理相同數(shù)據(jù)量的速度越快。?
  • 隨著 Batch_Size 增大,達到相同精度所需要的 epoch 數(shù)量越來越多。?
  • 由于上述兩種因素的矛盾, Batch_Size 增大到某個時候,達到時間上的最優(yōu)。?由于最終收斂精度會陷入不同的局部極值,因此 Batch_Size 增大到某些時候,達到最終收斂精度上的最優(yōu)。

總結(jié)

以上是生活随笔為你收集整理的tf.nn.conv2d() / tf.nn.depthwise_conv2d() 和 Batchsize效益的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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