Keras Dropout with noise_shape

时间:2017-10-05 11:59:24

标签: python deep-learning keras dropout

我对使用noise_shape参数的Keras函数Dropout有疑问。

问题1:

如果您的输入具有形状(batch_size,timesteps,features)并且您希望所有时间步长的丢失掩码相同,那么的含义是什么?您可以使用noise_shape =(batch_size,1,features)?,添加此参数有什么好处?

这是否意味着在时间步骤中被丢弃的神经元数量是相同的?这意味着在每个时间步都会有n个神经元掉落?

问题2: 在创建模型时,我是否必须在noise_shape中包含'batch_size'? - >请参阅以下示例。

假设我有(10000,1,100,2)形状的多变量时间序列数据 - > (数据的数量,通道,时间步长,特征数量)。

然后我创建批量大小为64的批次 - > (64,1,100,2)

如果我想创建一个退出的CNN模型,我使用Keras功能API:

inp = Input([1, 100, 2])
conv1 = Conv2D(64, kernel_size=(11,2), strides(1,1),data_format='channels_first')(inp)
max1 = MaxPooling2D((2,1))(conv1)
max1_shape = max1._keras_shape
drop1 = Dropout((0.1, noise_shape=[**?**, max1._keras_shape[1], 1, 1]))

因为图层max1的输出形状应为(None,64,50,1),并且我不能将None分配给问号(对应于batch_size)

我想知道我应该如何应对这个问题?我应该使用(64,1,1)作为noise_shape吗?或者我应该定义一个名为'batch_size'的变量,然后将它传递给这个参数,如(batch_size,64,1,1)?

1 个答案:

答案 0 :(得分:2)

问题1:

我觉得这有点像一个numpy广播。

想象一下,你有2个批次巫婆3个时间步和4个功能(这是一个小例子,让它更容易显示它): (2,3,4)

如果使用(2,1,4)的噪音形状,每批都有自己的 将应用于所有时间步长的辍学掩码。

所以让我们说这些是形状的权重(2,3,4):

array([[[  1,   2,   3,   4],
        [  5,   6,   7,   8],
        [ 10,  11,  12,  13]],

       [[ 14,  15,  16,  17],
        [ 18,  19,  20,  21],
        [ 22,  23,  24,  25]]])

这将是随机的noise_shape(2,1,4) (1就像保持,0就像关掉它):

array([[[ 1,  1,  1,  0]],

       [[ 1,  0,  0,  1]]])

所以你有这两种噪音形状(每批次都有)。 然后它会在时间轴上播出。

array([[[ 1,  1,  1,  0],
        [ 1,  1,  1,  0],
        [ 1,  1,  1,  0]],

       [[ 1,  0,  0,  1],
        [ 1,  0,  0,  1],
        [ 1,  0,  0,  1]]])

并应用于权重:

array([[[  1,   2,   3,   0],
        [  5,   6,   7,   0],
        [ 10,  11,  12,   0]],

       [[ 14,   0,   0,  17],
        [ 18,   0,   0,  21],
        [ 22,   0,   0,  25]]])

问题2:

说实话,我不确定你的第二个问题。

修改 你可以做的是采取输入形状的第一个维度, 应该是这个github issue中提出的batch_size:

import tensorflow as tf

...

batch_size = tf.shape(inp)[0]
drop1 = Dropout((0.1, noise_shape=[batch_size, max1._keras_shape[1], 1, 1]))

正如你所看到的,我正处于张量流后端。 Dunno如果theano也 有这些问题,如果有,你可能只能解决它 theano形状相当于。