我在Keras中找到了一个代码片段,它执行以下操作
from Keras.layers import Input
_input = Input(batch_shape=shape)
_input._keras_history[0].supports_masking = True我不太明白第三行的意思。有人能告诉我它是做什么的吗?
发布于 2020-03-17 20:50:40
对我来说这听起来很奇怪。
掩蔽
Masking是与序列一起使用的东西,它告诉模型忽略某些时间步长,因为添加这些步骤只是为了将序列填充到您想要的大小。
向模型添加遮罩的两种主要方法是使用Masking()层或在Embedding()层中使用mask_zeros=True参数。
蒙版将被发送到模型中该点之后的所有层。因此,下面的层必须支持掩码。
有些层支持掩码,有些层不支持,这取决于这些层是如何构建的。添加supports_masking=True似乎唯一合理的地方是“在自定义层内”:您自己创建的层,并小心地正确处理掩码(如果有的话)。这将告诉Keras您的层可以在具有遮罩的模型中使用。
如果层不支持掩码,模型将不会按预期运行。但是,简单地说"supports_masking“而不正确处理面具似乎不是一个好的解决方案。
_keras_history
_keras_history是Keras添加到原始张量中的属性( Tensorflow张量,或Theano张量,...)这有助于Keras构建模型。它包含像张量的Keras形状这样的东西(这样Keras就可以按顺序构建层,知道它们的输入形状,而不需要询问)。
supports_masking可能是这些属性之一,可以帮助Keras构建模型并正确传播掩码。
但是,将其添加到“输入”张量中并没有多大意义。掩码还不存在,Masking层还没有添加,Embedding(..., mask_zeros=True)还没有添加。
我可以想象,也许他们正在使用一个“子模型”,添加到外部模型中。这个外部模型可能有一个需要传递给子模型的掩码。据我所知,这应该由Keras自动处理,但我在过去也听说过一些bug。也许(仅仅是可能)他们这样做是为了处理某个Keras版本中的错误,以便将面具传递给子模型。
https://stackoverflow.com/questions/60722151
复制相似问题