Что делает keras_history [0] .supports_masking? - PullRequest
1 голос
/ 17 марта 2020

Я нашел фрагмент кода в Keras, который выполняет следующее

from Keras.layers import Input
_input = Input(batch_shape=shape)
_input._keras_history[0].supports_masking = True

Я не совсем понял 3-ю строку. Может кто-нибудь сказать, пожалуйста, что он делает?

1 Ответ

1 голос
/ 17 марта 2020

Это звучит довольно странно для меня.

Маскировка

Masking - это то, что вы используете с последовательностями, которые говорят модели игнорировать определенные временные шаги, поскольку вы добавили эти шаги просто для дополнения последовательности до желаемого размера.

Два основных способа добавить маску к вашей модели - использовать слой Masking() или параметр mask_zeros=True в слоях Embedding().

Маска будет отправлена ​​всем слоям после этой точки в модели. Таким образом, следующие слои должны поддерживать маскирование.

Некоторые слои поддерживают маскирование, некоторые нет. Это зависит от того, как были построены слои. Единственное место, где кажется разумным добавить supports_masking=True, это «внутри пользовательского слоя»: слой, который вы создали сами и позаботились о том, чтобы правильно обработать маску (если есть). Это скажет Keras, что ваш слой можно использовать в модели с маскированием.

Если слой не поддерживает маскирование, модель не будет работать должным образом. Но просто сказать «support_masking» без правильного обращения с маской, кажется, не является хорошим решением для этого.

_keras_history

_keras_history - это свойство, которое Keras добавляет к исходным тензорам (Tensorflow Tensor или Theano Tensor, ...), которое помогает Keras создавать модели. Он содержит такие вещи, как форма тензоров Керас (поэтому Керас может строить слои последовательно, зная их входные формы, не спрашивая).

supports_masking, вероятно, является одним из этих свойств, которые помогают Keras строить модель и правильно распространять маску.

Но не имеет смысла добавлять это к «входному» тензору. Маска еще не существует, слой Masking еще не добавлен, Embedding(..., mask_zeros=True) еще не добавлен.

Я могу представить, что, возможно, они используют «подмодель», которая будет добавлена ​​во внешнюю модель. И эта внешняя модель может иметь маску, которую нужно передать субмодели. Насколько я знаю, это должно автоматически обрабатываться Keras, но я слышал о некоторых ошибках в прошлом. Может быть (просто возможно) они делают это специально для того, чтобы справиться с ошибкой в ​​определенной версии Keras, чтобы позволить маске передаваться субмоделям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...