Создавать, тренировать и сохранять модели, используя керас и tf.module

Создавать, тренировать и сохранять модели, используя керас и tf.module

11 июня 2025 г.

Обзор контента

  • Керас слои
  • Шаг сборки
  • Керас модели
  • Сохранение моделей кераса
  • Контрольная точка моделей Keras

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

В этом разделе вы изучите, как использует Kerastf.ModuleПолем Полное руководство пользователя по моделям Keras можно найти вКерас -гидПолем

Слои и модели кераса имеют гораздо больше дополнительных функций, включая:

  • Необязательные потери
  • Поддержка дляметрики
  • Встроенная поддержка дополнительнойtrainingаргумент для различения обучения и использования выводов
  • Сохранение и восстановление объектов Python вместо просто черных функций
  • get_configиfrom_configМетоды, которые позволяют точно хранить конфигурации, чтобы разрешить клонирование модели в Python

Эти функции позволяют создавать гораздо более сложные модели посредством подкласса, таких как пользовательский GAN или вариационная модель AutoEcoder (VAE). Читайте о них вПолный гиддля пользовательских слоев и моделей.

Модели Keras также поставляются с дополнительной функциональностью, которая облегчает их обучение, оценку, загрузку, сохранение и даже обучение на нескольких машинах.

Керас слои

tf.keras.layers.Layerбазовый класс всех слоев кераса, и он наследует отtf.ModuleПолем

Вы можете преобразовать модуль в слой кераса, просто заменив родителя, а затем изменив__call__кcall:

class MyDense(tf.keras.layers.Layer):
  # Adding **kwargs to support base Keras layer arguments
  def __init__(self, in_features, out_features, **kwargs):
    super().__init__(**kwargs)

    # This will soon move to the build step; see below
    self.w = tf.Variable(
      tf.random.normal([in_features, out_features]), name='w')
    self.b = tf.Variable(tf.zeros([out_features]), name='b')
  def call(self, x):
    y = tf.matmul(x, self.w) + self.b
    return tf.nn.relu(y)

simple_layer = MyDense(name="simple", in_features=3, out_features=3)

У слоев кераса есть свои__call__Это делает какую -то бухгалтерскую, описанную в следующем разделе, а затем вызываетcall()Полем Вы не должны заметить никаких изменений в функциональности.

simple_layer([[2.0, 2.0, 2.0]])

<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[1.1688161, 0.       , 0.       ]], dtype=float32)>

Аbuildшаг

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

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

buildназывается ровно один раз, и он вызывается с формой ввода. Обычно он используется для создания переменных (веса).

Вы можете переписатьMyDenseслой выше, чтобы быть гибким до размера его входов:

class FlexibleDense(tf.keras.layers.Layer):
  # Note the added `**kwargs`, as Keras supports many arguments
  def __init__(self, out_features, **kwargs):
    super().__init__(**kwargs)
    self.out_features = out_features

  def build(self, input_shape):  # Create the state of the layer (weights)
    self.w = tf.Variable(
      tf.random.normal([input_shape[-1], self.out_features]), name='w')
    self.b = tf.Variable(tf.zeros([self.out_features]), name='b')

  def call(self, inputs):  # Defines the computation from inputs to outputs
    return tf.matmul(inputs, self.w) + self.b

# Create the instance of the layer
flexible_dense = FlexibleDense(out_features=3)

На этом этапе модель не была построена, поэтому нет никаких переменных:

flexible_dense.variables

[]

Вызов функции выделяет переменные соответствующего размера:

# Call it, with predictably random results
print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0], [3.0, 3.0, 3.0]])))

Model results: tf.Tensor(
[[-2.531786  -5.5550847 -0.4248762]
 [-3.7976792 -8.332626  -0.6373143]], shape=(2, 3), dtype=float32)

flexible_dense.variables

[<tf.Variable 'flexible_dense/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[-0.77719826, -1.9281565 ,  0.82326293],
        [ 0.85628736, -0.31845194,  0.10916236],
        [-1.3449821 , -0.5309338 , -1.1448634 ]], dtype=float32)>,
 <tf.Variable 'flexible_dense/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>]

Сbuildвызывается только один раз, входы будут отклонены, если форма ввода не совместима с переменными слоя:

try:
  print("Model results:", flexible_dense(tf.constant([[2.0, 2.0, 2.0, 2.0]])))
except tf.errors.InvalidArgumentError as e:
  print("Failed:", e)

Failed: Exception encountered when calling layer 'flexible_dense' (type FlexibleDense).

{ {function_node __wrapped__MatMul_device_/job:localhost/replica:0/task:0/device:CPU:0} } Matrix size-incompatible: In[0]: [1,4], In[1]: [3,3] [Op:MatMul] name: 

Call arguments received by layer 'flexible_dense' (type FlexibleDense):
  • inputs=tf.Tensor(shape=(1, 4), dtype=float32)

Керас модели

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

Тем не менее, Keras также предоставляет полнофункциональный класс модели под названиемtf.keras.ModelПолем Это наследует отtf.keras.layers.LayerТаким образом, модель кераса может использоваться и вложена так же, как слои кераса. Модели Keras поставляются с дополнительной функциональностью, которая позволяет им простым тренироваться, оценивать, загружать, сохранять и даже тренироваться на нескольких машинах.

Вы можете определитьSequentialModuleсверху с почти идентичным кодом, снова преобразование__call__кcall()и изменение родителя:

@keras.saving.register_keras_serializable()
class MySequentialModel(tf.keras.Model):
  def __init__(self, name=None, **kwargs):
    super().__init__(**kwargs)

    self.dense_1 = FlexibleDense(out_features=3)
    self.dense_2 = FlexibleDense(out_features=2)
  def call(self, x):
    x = self.dense_1(x)
    return self.dense_2(x)

# You have made a Keras model!
my_sequential_model = MySequentialModel(name="the_model")

# Call it on a tensor, with random results
print("Model results:", my_sequential_model(tf.constant([[2.0, 2.0, 2.0]])))

Model results: tf.Tensor([[ 0.26034355 16.431221  ]], shape=(1, 2), dtype=float32)

Все те же функции доступны, включая переменные отслеживания и подмодули.

Примечание:Сыройtf.ModuleВложенные внутри слоя или модели кераса не будут собираться его переменные для обучения или сохранения. Вместо этого гнездо кераса слоев внутри слоев кераса.

my_sequential_model.variables

[<tf.Variable 'my_sequential_model/flexible_dense_1/w:0' shape=(3, 3) dtype=float32, numpy=
 array([[ 1.4749854 ,  0.16090827,  2.2669017 ],
        [ 1.6850946 ,  1.1545411 ,  0.1707306 ],
        [ 0.8753734 , -0.13549292,  0.08751986]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_1/b:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/w:0' shape=(3, 2) dtype=float32, numpy=
 array([[-0.8022977 ,  1.9773549 ],
        [-0.76657015, -0.8485579 ],
        [ 1.6919082 ,  0.49000967]], dtype=float32)>,
 <tf.Variable 'my_sequential_model/flexible_dense_2/b:0' shape=(2,) dtype=float32, numpy=array([0., 0.], dtype=float32)>]

my_sequential_model.submodules

(<__main__.FlexibleDense at 0x7f790c7e0e80>,
 <__main__.FlexibleDense at 0x7f790c7e6940>)

Переходящийtf.keras.Modelэто очень питонический подход к созданию моделей TensorFlow. Если вы мигрируете модели из других рамок, это может быть очень просто.

Если вы создаете модели, которые являются простыми скоплениями существующих слоев и входов, вы можете сэкономить время и пространство, используяФункциональный API, который поставляется с дополнительными функциями, касающимися модельной реконструкции и архитектуры.

Вот та же модель с функциональным API:

inputs = tf.keras.Input(shape=[3,])

x = FlexibleDense(3)(inputs)
x = FlexibleDense(2)(x)

my_functional_model = tf.keras.Model(inputs=inputs, outputs=x)

my_functional_model.summary()

Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 3)]               0         
                                                                 
 flexible_dense_3 (Flexible  (None, 3)                 12        
 Dense)                                                          
                                                                 
 flexible_dense_4 (Flexible  (None, 2)                 8         
 Dense)                                                          
                                                                 
=================================================================
Total params: 20 (80.00 Byte)
Trainable params: 20 (80.00 Byte)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

my_functional_model(tf.constant([[2.0, 2.0, 2.0]]))

<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[3.4276495, 2.937252 ]], dtype=float32)>

Основное различие здесь заключается в том, что входная форма указана впереди как часть процесса функционального конструкции. Аinput_shapeАргумент в этом случае не должен быть полностью указан; Вы можете оставить некоторые измерения какNoneПолем

Примечание:Вам не нужно указыватьinput_shapeилиInputLayerв подклассной модели; Эти аргументы и слои будут проигнорированы.

Сохранение моделей кераса

Модели кераса имеют свой собственный специализированный формат сохранения архива ZIP, отмеченный.kerasрасширение. При звонкеtf.keras.Model.save, добавить.kerasРасширение на имя файла. Например:

my_sequential_model.save("exname_of_file.keras")

Так же легко, их можно загрузить:

reconstructed_model = tf.keras.models.load_model("exname_of_file.keras")

Keras Zip Archives -.kerasФайлы - также сохраняют показатели метрики, потери и оптимизатора.

Эта реконструированная модель может быть использована и даст тот же результат при вызове тех же данных:

reconstructed_model(tf.constant([[2.0, 2.0, 2.0]]))

<tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[ 0.26034355, 16.431221  ]], dtype=float32)>

Контрольная точка моделей Keras

Модели Keras также могут быть контролируются, и это будет выглядеть так же, как иtf.ModuleПолем

Есть еще кое -что, чтобы узнать о сохранении и сериализации моделей Keras, включая предоставление методов конфигурации для пользовательских слоев для поддержки функций. ПроверьтеРуководство по сохранению и сериализацииПолем

Что дальше

Если вы хотите узнать более подробную информацию о керах, вы можете следовать существующим руководствам керасаздесьПолем

Еще один пример высокого уровня API, построенного наtf.moduleСонет из DeepMind, который покрыт наих сайтПолем


Первоначально опубликовано наTensorflowВеб -сайт, эта статья появляется здесь под новым заголовком и имеет лицензию в CC на 4.0. Образцы кода, разделенные по лицензии Apache 2.0.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE