首页 > 解决方案 > 使用 Dropout 层的 noise_shape。Batch_size 不适合提供的样本。该怎么办?

问题描述

我在我的模型中使用了一个 dropout 层。当我使用时态数据时,我希望每个时间步的noise_shape相同- > (batch_size, 1, features)。

问题是如果我使用的批量大小不适合提供的样本,我会收到一条错误消息。示例:batch_size = 2, samples= 7。在最后一次迭代中,batch_size (2) 大于其余样本 (1)

其他层(我的情况:Masking、Dense 和 LSTM)显然对此没有问题,只需对最后一个不合适的样本使用较小的批次。

ConcreteError:训练数据形状为:[23, 300, 34] batchsize=3

InvalidArgumentError(参见上面的回溯):不兼容的形状:[2,300,34] vs. [3,1,34] [[Node: dropout_18/cond/dropout/mul = Mul[T=DT_FLOAT, _device="/job:localhost /replica:0/task:0/device:CPU:0"](dropout_18/cond/dropout/div, dropout_18/cond/dropout/Floor)]]

这意味着对于最后一批 [ 2,300,34 ],batch_size 不能拆分为 [ 3,1,34 ]

由于我仍处于参数调整阶段(是否会停止:-)),

仍然会不断变化。所有提到的都会影响训练数据的实际长度和形状。

我可以尝试通过一些计算总是找到下一个适合batch_size的 int。例如,如果batch_size = 4 和samples=21,我可以将batch_size减少到3。但是如果训练样本的数量是例如素数,这又是行不通的。另外,如果我选择 4,我可能想要 4。

我想复杂吗?有没有很多异常编程的简单解决方案?

谢谢

标签: pythontensorflowkerasdropout

解决方案


感谢这篇文章中的 nuric,答案很简单。

当前的实现确实会根据运行时批量大小进行调整。从 Dropout 层实现代码:

 symbolic_shape = K.shape(inputs) noise_shape = [symbolic_shape[axis]
 if shape is None else shape
                for axis, shape in enumerate(self.noise_shape)]

因此,如果您noise_shape=(None, 1, features)按照上面的代码给出形状将是 (runtime_batchsize, 1, features)。


推荐阅读