python - 使用 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 ]
由于我仍处于参数调整阶段(是否会停止:-)),
- 回顾(使用 LSTM),
- 训练/验证/测试的拆分百分比,
- 和批量
仍然会不断变化。所有提到的都会影响训练数据的实际长度和形状。
我可以尝试通过一些计算总是找到下一个适合batch_size的 int。例如,如果batch_size = 4 和samples=21,我可以将batch_size减少到3。但是如果训练样本的数量是例如素数,这又是行不通的。另外,如果我选择 4,我可能想要 4。
我想复杂吗?有没有很多异常编程的简单解决方案?
谢谢
解决方案
感谢这篇文章中的 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)。
推荐阅读
- html - 更改车把中默认模板的值
- ios - 使 UITabViewController 中的一些但不是所有选项卡可重新排序
- android - 单击项目时 MediaBrowserServiceCompat 接收空包
- php - 如何使用 php 正确加载主题文件
- templates - 是否可以通过命令行发布 Visual Studio 模板扩展?
- javascript - SQlite 打开一个连接并创建一个表但不插入到表中
- postgresql - CREATE DATABASE 永无止境
- sql - 是否可以从列中获取金额并从该金额中减去子查询?
- android - Android 在另一个之上添加一个小活动
- javascript - 视频仅在 Chrome 上出现像素化