使用Dropout图层的noise_shape。 Batch_size不适合提供的样本。该怎么办?

时间:2018-06-14 13:04:30

标签: python tensorflow keras dropout

我在模型中使用了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]

由于我仍处于参数调整阶段(确实停止了:-)),

  • 回顾(使用LSTM),
  • train / val / test的分割百分比,
  • 和batchsize

仍将不断变化。所有上述内容都会影响训练数据的实际长度和形状。

我可以尝试通过一些计算总是找到 batch_size 的下一个拟合int。例如,如果 batch_size = 4且samples = 21,我可以将 batch_size 减少到3.但是如果训练样本的数量是例如再次对此进行处理不起作用。另外如果我选择4,我可能想要4.

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

谢谢

1 个答案:

答案 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)遵循上面的代码。