4

根據關於壓差的原始文件,正則化方法可以應用於通常會改善其性能的卷積層。 TensorFlow功能tf.nn.dropout支持通過具有noise_shape參數來允許用戶選擇張量的哪些部分將獨立退出。然而,論文和文件都沒有明確說明哪些尺寸應該獨立保存,而且TensorFlow對於如何工作的解釋還不清楚。如何正確實現在TensorFlow中卷積的壓差

只有具有noise_shape [i] == shape(x)[i]的尺寸纔會做出獨立的決定。

我會假設,因爲我們不希望個別行或列由自己輟學形狀[batch_size, height, width, channels]的典型CNN層輸出,而是整個渠道(這相當於在一個完全節點連接的NN),與示例無關(即不同的通道可以針對不同的示例在一批中丟棄)。我在這個假設中糾正了嗎?

如果是這樣,那麼將如何使用noise_shape參數實現具有這種特異性的丟失?會是:

noise_shape=[batch_size, 1, 1, channels] 

或:

noise_shape=[1, height, width, 1] 
+0

我不完全相信,刪除整個頻道是標準的。我已經閱讀了不同地方的不同的東西,在我看來,許多人獨立地放下個別元素(skalars),即將'noise_shape'保留爲默認值。 –

+0

你在做什麼叫做空間丟失([SO帖子]](https://stats.stackexchange.com/questions/147850/are-pooling-layers-added-before-or-after-dropout-layers/225873?noredirect = 1#comment612222_225873),[論文](https://arxiv.org/pdf/1411.4280.pdf))。在我看來,即使對於轉發層,標準丟失也是獨立的每個元素 –

回答

2
here

例如,如果形狀(X)= [K,L,M,N]和noise_shape = [k,1,1,n],每個批次和通道組件將獨立保存,每行和每列將保留或不保存在一起。

該代碼可能有助於解釋這一點。

noise_shape = noise_shape if noise_shape is not None else array_ops.shape(x) 
# uniform [keep_prob, 1.0 + keep_prob) 
random_tensor = keep_prob 
random_tensor += random_ops.random_uniform(noise_shape, 
              seed=seed, 
              dtype=x.dtype) 
# 0. if [keep_prob, 1.0) and 1. if [1.0, 1.0 + keep_prob) 
binary_tensor = math_ops.floor(random_tensor) 
ret = math_ops.div(x, keep_prob) * binary_tensor 
ret.set_shape(x.get_shape()) 
return ret 

random_tensor +=支持broadcast。當noise_shape [i]設置爲1時,這意味着此維度中的所有元素將添加相同的隨機值,範圍從0到1.因此,當noise_shape=[k, 1, 1, n]時,要素圖中的每一行和列都將保留或不保存在一起。另一方面,每個示例(批處理)或每個通道接收不同的隨機值,並且每個通道都將獨立保存。