使用 noise_shape 的 Dropout 层。 Batch_size 不适合提供的示例。该怎么办?

Using noise_shape of the Dropout layer. Batch_size does not fit into provided samples. What to do?

我在我的模型中使用了一个 dropout 层。当我使用时间数据时,我希望 noise_shape 每个 timestep -> (batch_size, 1 , 特征).

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

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

具体错误: 训练数据形状为:[23, 300, 34] 批量大小=3

InvalidArgumentError (see above for traceback): Incompatible shapes: [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 的下一个拟合整数。例如,如果 batch_size=4 和 samples=21,我可以将 batch_size 减少到 3。但是如果数字训练样本是例如素数这又行不通了。另外如果我选择4,我可能想要4。

我觉得很复杂吗?有没有不需要大量异常编程的简单解决方案?

谢谢

感谢 中的 nuric,答案很简单。

The current implementation does adjust the according to the runtime batch size. From the Dropout layer implementation code:

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

So if you give noise_shape=(None, 1, features) the shape will be (runtime_batchsize, 1, features) following the code above.