我在模型中使用了dropout图层。当我使用时态数据时,我希望 noise_shape 与 timestep 相同 - > (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] [[节点:dropout_18 / cond / dropout / mul = MUL [T = DT_FLOAT, _device = “/作业:本地主机/复制:0 /任务:0 /装置:CPU:0”](dropout_18 / COND /返回/ DIV, dropout_18 / COND /返回/地板)]]
意味着对于最后一批[ 2 ,300,34],batch_size无法拆分为[ 3 ,1,34]
由于我仍处于参数调整阶段(确实停止了:-)),
仍将不断变化。所有上述内容都会影响训练数据的实际长度和形状。
我可以尝试通过一些计算总是找到 batch_size 的下一个拟合int。例如,如果 batch_size = 4且samples = 21,我可以将 batch_size 减少到3.但是如果训练样本的数量是例如再次对此进行处理不起作用。另外如果我选择4,我可能想要4.
我认为复杂吗?有没有很多异常编程的简单解决方案?
谢谢
答案 0 :(得分:1)
感谢this post中的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)遵循上面的代码。