tf.function с ошибками входной подписи при вызове подслоя - PullRequest
1 голос
/ 27 октября 2019

Следующее работает просто отлично

class MyModel(tf.Module):
    def __init__(self):
        super(MyModel, self).__init__(name='MyModel')
        self.dense = tf.keras.layers.Dense(50)

    @tf.function
    def __call__(self, inputs):
        return self.dense(inputs)

my_model = MyModel()
my_model(tf.ones((4, 42, 30, 200), name='features'))

Однако, когда я пытаюсь явно указать входную подпись в декораторе tf.function, код завершается неудачно:

class MyModel(tf.Module):
    def __init__(self):
        super(MyModel, self).__init__(name='MyModel')
        self.dense = tf.keras.layers.Dense(50)

    @tf.function(input_signature=[
        tf.TensorSpec(shape=(None, None, None, None), dtype=tf.float32)
    ])
    def __call__(self, inputs):
        return self.dense(inputs)

my_model = MyModel()
my_model(tf.ones((4, 42, 30, 200), name='features'))

Приводит кследующая ошибка:

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

Может кто-нибудь объяснить, что я здесь делаю не так?

1 Ответ

0 голосов
/ 02 ноября 2019

Ваш tf.Module создается внутри tf.keras.Model;Модель Keras имеет две разные фазы:

  1. Построение модели, где каждый слой определяется с учетом входной формы
  2. Выполнение модели, где построенная модель используется для запуска впередpass.

Когда вы задаете форму ввода первого слоя вашей модели (используя атрибут input_shape Dense или слой tf.keras.layers.Input), Keras может выполнить первыйфаза, построение модели, потому что теперь она знает, что первая весовая матрица должна быть чем-то вроде input_shape[-1] * <number_units> (в вашем случае 50).

Когда вместо этого не указываете вводформа, то, что происходит, - то, что Keras не может выполнить построение модели во время определения модели, но он должен ждать, пока первый ввод не будет передан модели;этот вход имеет определенную форму ((4, 42, 30, 200) в вашем случае) и, таким образом, он может запускать построение и выполнение модели в ряд.

Все это происходит, когда вы не указываете форму.

Но во втором примере вы указываете форму ввода метода __call__ вашего tf.Module, который распространяется на __call__ вашего tf.keras.Model.

Таким образом, что здесь происходитв том, что вы просите модель Keras выполнить построение и выполнение модели в ряд, но поскольку нет определенных форм (поскольку вы передаете (None, None, None, None) и, следовательно, input_shape[-1] is None), Keras просто не может определить модель,

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