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