带有noise_shape的Keras Dropout
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有noise_shape的Keras Dropout相关的知识,希望对你有一定的参考价值。
我有一个关于Keras函数Dropout的问题,其中包含noise_shape的参数。
问题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:
我觉得这有点像一个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:
说实话,我不确定你的第二个问题。
编辑:您可以做的是获取输入形状的第一个维度,该维度应该是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形状等效解决它。
以上是关于带有noise_shape的Keras Dropout的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Keras 的 TensorBoard 创建日志文件时出错
为啥带有 TensorFlow 的 Keras 没有使用所有 GPU 内存
带有 TensorFlow 后端的 Keras 不使用 GPU