带有noise_shape的Keras Dropout

yih*_*.fu 5 python deep-learning keras dropout

我有一个关于带有noise_shape参数的Keras函数Dropout的问题。

问题 1:

是什么意思,如果你的输入有形状(batch_size时,时间步长,功能),你想辍学面膜是所有时间步长一样,你可以使用noise_shape =(batch_size时,1,特点)3,什么是增加的好处这个论点?

这是否意味着随着时间步长被丢弃的神经元数量是相同的?这意味着在每个时间步长 t,都会有 n 个神经元被丢弃?

问题 2: 创建模型时是否必须在 noise_shape 中包含“batch_size”?--> 看下面的例子。

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

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

如果我想创建一个带有 dropout 的 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]))
Run Code Online (Sandbox Code Playgroud)

因为层max1的输出shape应该是(None, 64, 50, 1),我不能给问号赋值None(对应batch_size)

我想知道我应该如何应对这种情况?我应该使用 (64, 1, 1) 作为噪声形状吗?或者我应该定义一个名为“batch_size”的变量,然后将它传递给这个参数,比如 (batch_size, 64, 1, 1)?

Nim*_*avi 5

问题 1:

我认为这有点像一个麻木的广播。

想象一下,你有 2 个批次,3 个时间步长和 4 个特征(这是一个小例子,可以更容易地展示它):(2, 3, 4)

如果您使用 (2, 1, 4) 的噪声形状,则每个批次都有自己的 dropout 掩码,该掩码将应用于所有时间步长。

所以让我们说这些是形状的权重 (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]]])
Run Code Online (Sandbox Code Playgroud)

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

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

       [[ 1,  0,  0,  1]]])
Run Code Online (Sandbox Code Playgroud)

所以你有这两种噪声形状(每批次一个)。然后它将沿着时间步长轴广播。

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]]])
Run Code Online (Sandbox Code Playgroud)

并应用于权重:

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]]])
Run Code Online (Sandbox Code Playgroud)

问题2:

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

编辑: 您可以做的是采用输入形状的第一维,这应该是batch_size,如this github issue中所建议的:

import tensorflow as tf

...

batch_size = tf.shape(inp)[0]
drop1 = Dropout((0.1, noise_shape=[batch_size, max1._keras_shape[1], 1, 1]))
Run Code Online (Sandbox Code Playgroud)

如您所见,我在 tensorflow 后端。不知道 theano 是否也有这些问题,如果有,您可能只能使用 theano 形状等效来解决它。