Создавать, тренировать и сохранять модели, используя керас и 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, который покрыт наих сайтПолем
Первоначально опубликовано на
Оригинал