Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
41
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

7.2. Разные способы создания моделей Keras    227

торопиться.и.для.начала.сделаем.из.вас.эксперта.по.библиотеке.Keras!.В.этой. главе.вы.познакомитесь.с.основными.способами.использования.Keras.API:.со. всем,.что.понадобится.для.решения.более.сложных.задач.глубокого.обучения,. с.которыми.вы.столкнетесь.в.будущем.

7.1. СПЕКТР РАБОЧИХ ПРОЦЕССОВ

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

Как.следствие,.не.существует.единственно.верного.способа.использования. Keras..Вместо.этого.Keras.предлагает.целый.спектр рабочих процессов,.от.очень. простых.до.очень.гибких..Keras.поддерживает.множество.способов.создания. моделей.и.множество.способов.их.обучения,.отвечающих.разным.потребностям.. Поскольку.все.эти.рабочие.процессы.основаны.на.одних.и.тех.же.объектах,.таких. как.Layer.и.Model,.компоненты.из.любого.рабочего.процесса.могут.использоваться. в.любом.другом.рабочем.процессе.—.все.они.способны.взаимодействовать.друг. с.другом.

7.2. РАЗНЫЕ СПОСОБЫ СОЗДАНИЯ МОДЕЛЕЙ KERAS

В.Keras.имеется.три.API.для.создания.моделей.(рис..7.1):

.последовательная модель .Sequential,.наиболее.доступный.API.—.по.сути,. это.список.Python,.поэтому.модели.данного.вида.ограничены.простыми. наборами.слоев;

.функциональный API,.ориентированный.на.архитектуры.моделей.в.виде.графов..Он.представляет.собой.золотую.середину.в.плане.удобства.применения. и.гибкости.и.поэтому.чаще.всего.используется.на.практике;

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

228    Глава 7. Работа с Keras: глубокое погружение

Рис. 7.1. Принцип постепенного раскрытия сложности при создании моделей

7.2.1. Последовательная модель Sequential

Самый.простой.способ.создать.модель.Keras.—.использовать.уже.знакомый.вам. класс.моделей.Sequential.

Листинг 7.1. Класс Sequential

from tensorflow import keras

from tensorflow.keras import layers

model = keras.Sequential([ layers.Dense(64, activation="relu"), layers.Dense(10, activation="softmax")

])

Обратите.внимание,.что.эту.модель.также.можно.построить,.последовательно. вызывая.метод.add(),.который.действует.подобно.методу.append() .списков. в.языке.Python.

Листинг 7.2. Последовательное создание модели Sequential

model = keras.Sequential() model.add(layers.Dense(64, activation="relu")) model.add(layers.Dense(10, activation="softmax"))

В.главе.4.вы.узнали,.что.слои.(точнее,.их.веса).создаются.только.в.момент. первого.вызова..Причина.подобного.поведения.в.том,.что.форма.слоев.зависит.от.формы.входных.данных:.пока.форма.входных.данных.неизвестна,.слои. не.могут.быть.созданы.

В.силу.этого.предыдущая.модель.Sequential .не.будет.иметь.весов.(листинг.7.3). до.передачи.ей.некоторых.данных.или.до.вызова.ее.метода.build() .с.описанием. формы.входных.данных.(листинг.7.4).

 

 

7.2. Разные способы создания моделей Keras    229

 

 

Листинг 7.3. Непостроенные модели не имеют весов

>>> model.weights

 

В этой точке модель еще не построена

 

ValueError: Weights for model sequential_1 have not yet been created.

Листинг 7.4. Первый вызов модели для ее построения

Этот вызов построит модель — после него модель будет готова принимать образцы с формой (3,). None в форме входных данных означает, что размер пакета может быть любым

>>>

model.build(input_shape=(None, 3))

 

 

 

Теперь можно получить

 

 

веса модели

>>>

model.weights

 

 

 

[<tf.Variable

"dense_2/kernel:0" shape=(3, 64) dtype=float32,

... >,

<tf.Variable

"dense_2/bias:0" shape=(64,) dtype=float32,

... >

<tf.Variable

"dense_3/kernel:0" shape=(64, 10) dtype=float32, ... >,

<tf.Variable

"dense_3/bias:0" shape=(10,) dtype=float32,

... >]

После.того.как.модель.будет.построена,.ее.содержимое.можно.вывести.вызовом. метода.summary(),.что.очень.удобно.на.этапе.отладки.

Листинг 7.5. Метод summary()

>>> model.summary() Model: "sequential_1"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

dense_2 (Dense) (None, 64) 256

_________________________________________________________________

dense_3 (Dense) (None, 10) 650

=================================================================

Total params: 906 Trainable params: 906 Non-trainable params: 0

_________________________________________________________________

Как.видите,.эта.модель.получила.имя.sequential_1..В.Keras.имя.можно.при- своить.чему.угодно.—.каждой.модели,.каждому.слою.

Листинг 7.6. Присваивание имен моделям и слоям путем передачи аргумента name

>>>model = keras.Sequential(name="my_example_model")

>>>model.add(layers.Dense(64, activation="relu", name="my_first_layer"))

>>>model.add(layers.Dense(10, activation="softmax", name="my_last_layer"))

>>>model.build((None, 3))

>>>model.summary()

Model: "my_example_model"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

230    Глава 7. Работа с Keras: глубокое погружение

my_first_layer (Dense) (None, 64) 256

_________________________________________________________________

my_last_layer (Dense) (None, 10) 650

=================================================================

Total params: 906 Trainable params: 906 Non-trainable params: 0

_________________________________________________________________

При.пошаговом.построении.модели.Sequential .удобно.иметь.возможность.посмотреть.на.ее.текущее.состояние.после.добавления.очередного.слоя..Но.сводку. невозможно.получить,.пока.модель.не.построена!.Эту.проблему.можно.решить,. строя.модель.Sequential .на.лету,.для.чего.достаточно.заранее.объявить.форму. входных.данных..Это.можно.сделать.с.помощью.класса.Input.

Листинг 7.7. Предварительное определение формы входных данных модели с помощью класса Input

model = keras.Sequential() model.add(keras.Input(shape=(3,))) model.add(layers.Dense(64, activation="relu"))

Использование Input для объявления формы входных данных. Обратите внимание, что аргумент shape должен определять форму одного образца, но не пакета

Теперь.вы.сможете.вызывать.summary() .и.наблюдать,.как.меняется.форма.выходных.данных.модели.по.мере.добавления.дополнительных.слоев:

>>> model.summary() Model: "sequential_2"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

dense_4 (Dense) (None, 64) 256

=================================================================

Total params: 256 Trainable params: 256 Non-trainable params: 0

_________________________________________________________________

>>>model.add(layers.Dense(10, activation="softmax"))

>>>model.summary()

Model: "sequential_2"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

dense_4 (Dense) (None, 64) 256

_________________________________________________________________

dense_5 (Dense) (None, 10) 650

=================================================================

Total params: 906 Trainable params: 906 Non-trainable params: 0

_________________________________________________________________