首页 文章

带有noise_shape的Keras Dropout

提问于
浏览
0

我有一个关于Keras函数Dropout的问题,其中包含noise_shape的参数 .

Question 1:

是什么意思 if your inputs have shape (batch_size, timesteps, features) and you want the dropout mask to be the same for all timesteps, you can use noise_shape=(batch_size, 1, features)?, and what's the benefit of adding this argument?

这是否意味着将被淘汰的神经元数量沿着时间步长是相同的?这意味着在每个时间步都会有n个神经元掉落?

Question 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 回答

  • 1

    Question 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]]])
    

    Question 2:

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

    Edit: 您可以做的是获取输入形状的第一个维度,该维度应该是batch_size,如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]))
    

    你可以看到我在张量流后端 . Dunno如果theano也有这些问题,如果它确实你可能只能用theano形状等效解决它 .

相关问题