我对使用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)?
答案 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形状相当于。