Разъяснение по маскировке Tensorflow 2.0 - PullRequest
0 голосов
/ 14 февраля 2020

Из документации Tensorflow при использовании API подклассов Keras они приводят этот пример о том, как передать маску другим слоям, которые реализуют маскирование. Мне интересно, требуется ли это явно или правильно ли оно обрабатывается после того, как слой Embedding имеет значение mask_zero = True.

class MyLayer(layers.Layer):

  def __init__(self, **kwargs):
    super(MyLayer, self).__init__(**kwargs)
    self.embedding = layers.Embedding(input_dim=5000, output_dim=16, mask_zero=True)
    self.lstm = layers.LSTM(32)

  def call(self, inputs):
    x = self.embedding(inputs)
    # Note that you could also prepare a `mask` tensor manually.
    # It only needs to be a boolean tensor
    # with the right shape, i.e. (batch_size, timesteps).
    mask = self.embedding.compute_mask(inputs)
    output = self.lstm(x, mask=mask)  # The layer will ignore the masked values
    return output

layer = MyLayer()
x = np.random.random((32, 10)) * 100
x = x.astype('int32')
layer(x)

Моя путаница связана с другой областью документации, которая гласит:

Маскировка

Этот слой поддерживает маскирование для входных данных с переменным числом временных шагов. Чтобы ввести маски в ваши данные, используйте слой Embedding с параметром mask_zero, установленным в значение True.

Что означает, что если mask_zero = True, дальнейшие команды на последующих слоях выполнять не нужно.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

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

Цитата:

Для каждого временного шага во входном тензоре (измерение # 1 в тензоре), если все значения во входном тензоре на этом временном шаге равны mask_value, тогда временной шаг будет замаскирован (пропущен) в все нижестоящие слои (если они поддерживают маскирование).

Если какой-либо нижестоящий слой не поддерживает маскирование, но получает такую ​​входную маску, будет сгенерировано исключение.

This другая ссылка также утверждает то же самое. Маска будет распространена на все слои.

Цитата:

При использовании Функционального API или Последовательного API маска, сгенерированная уровнем внедрения или маскирования, будет распространяться по сети для любого уровня, который может использовать их (например, слои RNN). Keras автоматически извлечет маску, соответствующую входу, и передаст ее любому слою, который знает, как его использовать.

Вторая ссылка действительно полна деталей по маскировке.

Примечание что код, который вы показали, предназначен для встраивания custom . Если научит вас «создавать и передавать» маску, если вы хотите создать слой, который будет создавать маску. Это в основном показывает, что делает обычный слой Embedded.

Итак, мы можем заключить, что если вы используете обычный Embedding слой, все, что вам нужно, это mask_zero=True, и все будет go вниз по течению.

0 голосов
/ 03 марта 2020

Я думаю, что вы должны передать маску от слоя к слою в подклассе слоя. Из документации Tensorflow: Quote

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

...