В некоторых руководствах по Tensorflow с tf2 (например, Neural Machine Translation with Attention и Eager essentials), они определяют пользовательские tf.keras.Model
вместо tf.keras.layers.Layer
(например, BahdanauAttention(tf.keras.Model):
)
Кроме того, в документе Модели: создание слоев tf.keras.Model
используется явно. В разделе говорится:
Основной класс, используемый при создании многослойной вещи, которая содержит другие слои, — это tf.keras.Model. Реализация осуществляется путем наследования от tf.keras.Model.
Похоже, нам нужно наследовать tf.keras.Model
, чтобы определить слой, который составляет дочерние слои.
Однако, насколько я проверял, этот код работает, даже если я определяю ResnetIdentityBlock
как дочерний класс tf.keras.layers.Layer
. Два других руководства также работают с Layer
. В дополнение к этому, еще один учебник говорит
Модель похожа на слой, но с дополнительными утилитами для обучения и сериализации.
Таким образом, я понятия не имею, в чем реальная разница между tf.keras.Model
и tf.keras.layers.Layer
и почему эти три учебника с выполнением Eager используют tf.keras.Model
, хотя они не используют утилиты обучения и сериализации tf.keras.Model
.
Почему нам нужно наследовать tf.keras.Model
в этих туториалах?
Дополнительный комментарий
утилиты Model
работают только со специальными подмножествами Layer
(Слои, чьи call
получают только один ввод). Таким образом, я думаю, что идея типа "Всегда расширять Модель, потому что Модель имеет больше возможностей" неверна. Кроме того, это нарушает базовую программу программирования, например SRP.