对 LSTM 来说相当新,但我已经在寻找解决方案,但找不到任何令人满意甚至足够相似的东西。
所以这是我的问题:
我正在处理睡眠分类,并为大约 6k 名患者添加了注释记录。为了训练我的双向 LSTM,我选择了一名患者并将模型拟合到该数据上,而不是将所有患者的所有数据放入一个大矩阵中,因为我想在 Keras 进行小批量训练时防止患者样本混合。序列长度或samples_size
每个患者不一样。然后我循环遍历所有患者,并针对我考虑训练模型的时期数进行额外循环(如开发人员指南中所述)。
因此,由于 LSTM(如果不是有状态的)在每批之后重置它们的单元格和隐藏状态,并且默认batch_size
值为tf.keras.Sequential.fit()
32,我希望它与sample_size
我向网络展示的病人。如果我这样做,我会在一段时间后收到警告和培训过程错误。错误是:
警告:在 0x0000023F9D517708> 处对 .distributed_function 的最后 11 次调用中有 6 次触发了 tf.function 回溯。跟踪是昂贵的,并且过多的跟踪可能是由于传递了 python 对象而不是张量。此外, tf.function 具有 Experimental_relax_shapes=True 选项,可以放宽可以避免不必要的回溯的参数形状。请参阅https://www.tensorflow.org/beta/tutorials/eager/tf_function#python_or_tensor_args和https://www.tensorflow.org/api_docs/python/tf/function了解更多详情。
所以我查了我最长sample_size
的是什么,并相应地设置了我的batch_size
。
tl;dr:sample_size
在我的变量与我的变量不匹配的所有情况下,Keras 都在做什么batch_size=max(len(sample_size))
?
- 它只是向网络显示可用的样本吗?
batch_size=sample_size
如果是这样:为什么在设置导致训练失败的位置时会出现上述警告?
- 或者它是否向网络显示可用样本并用零填充其余样本以匹配给定
batch_size
?- 如果是这样:为什么在使用状态模式时需要屏蔽?
编辑:
所以,我尝试了一些额外的解决方法并构建了我自己的数据生成器,它将一名患者的数据证明为一批。然后我开始将steps_per_epoch=len(train_patients)
所有患者纳入一个时期。没有关于回溯的警告,我也不明白。
它似乎解决了我在不混合患者数据和变量的情况下每批显示一名患者的问题sample_size
,但我真的不明白所有这些可能性及其不同警告之间的区别。