Ваш tf.Module
создается внутри tf.keras.Model
;Модель Keras имеет две разные фазы:
- Построение модели, где каждый слой определяется с учетом входной формы
- Выполнение модели, где построенная модель используется для запуска вперед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 просто не может определить модель,