www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home
Занимательная история, выдающиеся люди, малоизвестные факты, находки, открытия, фальсификации. Присоединяйся!

Как использовать функциональный API Keras для глубокого обучения

Дата публикации 2017-10-27

Библиотека Keras Python позволяет быстро и легко создавать модели глубокого обучения.

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

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

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

После завершения этого урока вы узнаете:

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

Давайте начнем.

  • Обновление ноябрь 2017: Обновление примечания о висячем размере для входных слоев, влияющих только на 1D ввод, спасибо Джо
  • Обновлено ноябрь 2018: Добавлен отсутствующий выравнивающий слой для CNN, спасибо Константин.
  • Обновление ноябрь / 2018: Добавлено описание функционального синтаксиса API Python.

Обзор учебника

Этот урок разделен на 7 частей; они есть:

  1. Керас последовательных моделей
  2. Keras Функциональные модели
  3. Стандартные сетевые модели
  4. Модель общих слоев
  5. Несколько моделей ввода и вывода
  6. Лучшие практики
  7. NEW: Примечание к функциональному API-интерфейсу Python

1. Керас последовательных моделей

В качестве обзора, Keras предоставляет API последовательной модели.

Это способ создания моделей глубокого обучения, в которых создается экземпляр класса Sequential, и к нему создаются и добавляются слои модели.

Например, слои могут быть определены и переданы в Sequential в виде массива:

from keras.models import Sequential
from keras.layers import Dense
model = Sequential([Dense(2, input_dim=1), Dense(1)])

Слои также могут быть добавлены кусочно:

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1))

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

Например, непросто определить модели, которые могут иметь несколько разных входных источников, создать несколько выходных назначений или модели, которые повторно используют слои.

2. Функциональные модели Keras

Функциональный API Keras предоставляет более гибкий способ определения моделей.

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

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

Давайте по очереди рассмотрим три уникальных аспекта функционального API Keras:

1. Определение входных данных

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

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

Когда входные данные являются одномерными, например, для многослойного персептрона, форма должна явно оставлять место для формы размера мини-пакета, используемого при разделении данных при обучении сети. Поэтому кортеж формы всегда определяется с висящим последним измерением, когда вход является одномерным (2,), например:

from keras.layers import Input
visible = Input(shape=(2,))

2. Соединение слоев

Слои в модели связаны попарно.

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

Давайте поясним это на коротком примере. Мы можем создать входной слой, как указано выше, затем создать скрытый слой в качестве плотного, который получает входные данные только от входного слоя.

from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(2,))
hidden = Dense(2)(visible)

Обратите внимание на (видимый) после создания плотного слоя, который соединяет выходной слой как входной с плотным скрытым слоем.

Именно этот способ соединения слоев по частям дает функциональному API его гибкость. Например, вы можете увидеть, как легко начать определять специальные графики слоев.

3. Создание модели

После создания всех слоев вашей модели и их соединения вы должны определить модель.

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

Keras предоставляет класс Model, который вы можете использовать для создания модели из созданных вами слоев. Требуется указать только входной и выходной слои. Например:

from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(2,))
hidden = Dense(2)(visible)
model = Model(inputs=visible, outputs=hidden)

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

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

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

3. Стандартные сетевые модели

Приступая к работе с функциональным API, полезно посмотреть, как определяются некоторые стандартные модели нейронных сетей.

В этом разделе мы рассмотрим определение простого многослойного персептрона, сверточной нейронной сети и рекуррентной нейронной сети.

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

Многослойный персептрон

В этом разделе мы определим многослойную модель персептрона для бинарной классификации.

Модель имеет 10 входов, 3 скрытых слоя с 10, 20 и 10 нейронами и выходной слой с 1 выходом. Выпрямленные функции линейной активации используются в каждом скрытом слое, а функция активации сигмоида используется в выходном слое для двоичной классификации.

# Multilayer Perceptron
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
visible = Input(shape=(10,))
hidden1 = Dense(10, activation='relu')(visible)
hidden2 = Dense(20, activation='relu')(hidden1)
hidden3 = Dense(10, activation='relu')(hidden2)
output = Dense(1, activation='sigmoid')(hidden3)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='multilayer_perceptron_graph.png')

При выполнении примера печатается структура сети.

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 10)                0
_________________________________________________________________
dense_1 (Dense)              (None, 10)                110
_________________________________________________________________
dense_2 (Dense)              (None, 20)                220
_________________________________________________________________
dense_3 (Dense)              (None, 10)                210
_________________________________________________________________
dense_4 (Dense)              (None, 1)                 11
=================================================================
Total params: 551
Trainable params: 551
Non-trainable params: 0
_________________________________________________________________

График модели графа также создается и сохраняется в файл.

Сверточная нейронная сеть

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

Модель получает черно-белые изображения 64 × 64 в качестве входных данных, затем имеет последовательность из двух сверточных и пулирующих слоев в качестве экстракторов объектов, за которыми следует полностью подключенный слой для интерпретации объектов и выходной слой с сигмовидной активацией для предсказаний двух классов ,

# Convolutional Neural Network
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
visible = Input(shape=(64,64,1))
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(16, kernel_size=4, activation='relu')(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
flat = Flatten()(pool2)
hidden1 = Dense(10, activation='relu')(flat)
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='convolutional_neural_network.png')

Запуск примера суммирует слои модели.

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 64, 64, 1)         0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 61, 61, 32)        544       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 30, 30, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 27, 27, 16)        8208      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 13, 13, 16)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 2704)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                27050     
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 11        
=================================================================
Total params: 35,813
Trainable params: 35,813
Non-trainable params: 0
_________________________________________________________________

График модели графа также создается и сохраняется в файл.

Рекуррентная нейронная сеть

В этом разделе мы определим рекуррентную нейронную сеть с кратковременной памятью для классификации последовательностей.

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

# Recurrent Neural Network
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
visible = Input(shape=(100,1))
hidden1 = LSTM(10)(visible)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='recurrent_neural_network.png')

Запуск примера суммирует слои модели.

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 100, 1)            0
_________________________________________________________________
lstm_1 (LSTM)                (None, 10)                480
_________________________________________________________________
dense_1 (Dense)              (None, 10)                110
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 11
=================================================================
Total params: 601
Trainable params: 601
Non-trainable params: 0
_________________________________________________________________

График модели графа также создается и сохраняется в файл.

4. Модель общих слоев

Несколько слоев могут совместно использовать вывод из одного слоя.

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

Давайте посмотрим на оба этих примера.

Общий входной слой

В этом разделе мы определяем несколько сверточных слоев с ядрами разного размера для интерпретации входных данных изображения.

Модель принимает черно-белые изображения размером 64 × 64 пикселя. Есть две подмодели извлечения признаков CNN, которые разделяют этот вход; первый имеет размер ядра 4, а второй размер ядра 8. Выходные данные этих подмоделей выделения признаков сглаживаются в векторы и объединяются в один длинный вектор и передаются на полностью подключенный уровень для интерпретации, прежде чем конечный выходной уровень создает бинарная классификация.

# Shared Input Layer
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# input layer
visible = Input(shape=(64,64,1))
# first feature extractor
conv1 = Conv2D(32, kernel_size=4, activation='relu')(visible)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
flat1 = Flatten()(pool1)
# second feature extractor
conv2 = Conv2D(16, kernel_size=8, activation='relu')(visible)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
flat2 = Flatten()(pool2)
# merge feature extractors
merge = concatenate([flat1, flat2])
# interpretation layer
hidden1 = Dense(10, activation='relu')(merge)
# prediction output
output = Dense(1, activation='sigmoid')(hidden1)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='shared_input_layer.png')

Запуск примера суммирует слои модели.

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_1 (InputLayer)             (None, 64, 64, 1)     0
____________________________________________________________________________________________________
conv2d_1 (Conv2D)                (None, 61, 61, 32)    544         input_1[0][0]
____________________________________________________________________________________________________
conv2d_2 (Conv2D)                (None, 57, 57, 16)    1040        input_1[0][0]
____________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)   (None, 30, 30, 32)    0           conv2d_1[0][0]
____________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)   (None, 28, 28, 16)    0           conv2d_2[0][0]
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 28800)         0           max_pooling2d_1[0][0]
____________________________________________________________________________________________________
flatten_2 (Flatten)              (None, 12544)         0           max_pooling2d_2[0][0]
____________________________________________________________________________________________________
concatenate_1 (Concatenate)      (None, 41344)         0           flatten_1[0][0]
                                                                   flatten_2[0][0]
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 10)            413450      concatenate_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 1)             11          dense_1[0][0]
====================================================================================================
Total params: 415,045
Trainable params: 415,045
Non-trainable params: 0
____________________________________________________________________________________________________

График модели графа также создается и сохраняется в файл.

Слой извлечения общих объектов

В этом разделе мы будем использовать две параллельные подмодели для интерпретации выходных данных экстрактора признаков LSTM для классификации последовательностей.

Входные данные для модели - 100 временных шагов одной функции. Слой LSTM с 10 ячейками памяти интерпретирует эту последовательность. Первая модель интерпретации представляет собой неглубокий одиночный полностью связанный слой, а вторая - глубокую трехслойную модель. Выходные данные обеих моделей интерпретации объединяются в один длинный вектор, который передается на выходной слой, используемый для двоичного предсказания.

# Shared Feature Extraction Layer
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
from keras.layers.merge import concatenate
# define input
visible = Input(shape=(100,1))
# feature extraction
extract1 = LSTM(10)(visible)
# first interpretation model
interp1 = Dense(10, activation='relu')(extract1)
# second interpretation model
interp11 = Dense(10, activation='relu')(extract1)
interp12 = Dense(20, activation='relu')(interp11)
interp13 = Dense(10, activation='relu')(interp12)
# merge interpretation
merge = concatenate([interp1, interp13])
# output
output = Dense(1, activation='sigmoid')(merge)
model = Model(inputs=visible, outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='shared_feature_extractor.png')

Запуск примера суммирует слои модели.

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_1 (InputLayer)             (None, 100, 1)        0
____________________________________________________________________________________________________
lstm_1 (LSTM)                    (None, 10)            480         input_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 10)            110         lstm_1[0][0]
____________________________________________________________________________________________________
dense_3 (Dense)                  (None, 20)            220         dense_2[0][0]
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 10)            110         lstm_1[0][0]
____________________________________________________________________________________________________
dense_4 (Dense)                  (None, 10)            210         dense_3[0][0]
____________________________________________________________________________________________________
concatenate_1 (Concatenate)      (None, 20)            0           dense_1[0][0]
                                                                   dense_4[0][0]
____________________________________________________________________________________________________
dense_5 (Dense)                  (None, 1)             21          concatenate_1[0][0]
====================================================================================================
Total params: 1,151
Trainable params: 1,151
Non-trainable params: 0
____________________________________________________________________________________________________

График модели графа также создается и сохраняется в файл.

5. Несколько моделей ввода и вывода

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

Мы рассмотрим примеры каждого в этом разделе.

Модель с несколькими входами

Мы разработаем модель классификации изображений, которая использует две версии изображения в качестве входных данных, каждая разного размера. В частности, черно-белая версия 64 × 64 и цветная версия 32 × 32. Отдельное извлечение признаков модели CNN работают с каждой из них, затем результаты обеих моделей объединяются для интерпретации и окончательного прогнозирования.

Обратите внимание, что при создании экземпляра Model () мы определяем два входных слоя как массив. В частности:

model = Model(inputs=[visible1, visible2], outputs=output)

Полный пример приведен ниже.

# Multiple Inputs
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.layers.merge import concatenate
# first input model
visible1 = Input(shape=(64,64,1))
conv11 = Conv2D(32, kernel_size=4, activation='relu')(visible1)
pool11 = MaxPooling2D(pool_size=(2, 2))(conv11)
conv12 = Conv2D(16, kernel_size=4, activation='relu')(pool11)
pool12 = MaxPooling2D(pool_size=(2, 2))(conv12)
flat1 = Flatten()(pool12)
# second input model
visible2 = Input(shape=(32,32,3))
conv21 = Conv2D(32, kernel_size=4, activation='relu')(visible2)
pool21 = MaxPooling2D(pool_size=(2, 2))(conv21)
conv22 = Conv2D(16, kernel_size=4, activation='relu')(pool21)
pool22 = MaxPooling2D(pool_size=(2, 2))(conv22)
flat2 = Flatten()(pool22)
# merge input models
merge = concatenate([flat1, flat2])
# interpretation model
hidden1 = Dense(10, activation='relu')(merge)
hidden2 = Dense(10, activation='relu')(hidden1)
output = Dense(1, activation='sigmoid')(hidden2)
model = Model(inputs=[visible1, visible2], outputs=output)
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='multiple_inputs.png')

Запуск примера суммирует слои модели.

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_1 (InputLayer)             (None, 64, 64, 1)     0
____________________________________________________________________________________________________
input_2 (InputLayer)             (None, 32, 32, 3)     0
____________________________________________________________________________________________________
conv2d_1 (Conv2D)                (None, 61, 61, 32)    544         input_1[0][0]
____________________________________________________________________________________________________
conv2d_3 (Conv2D)                (None, 29, 29, 32)    1568        input_2[0][0]
____________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)   (None, 30, 30, 32)    0           conv2d_1[0][0]
____________________________________________________________________________________________________
max_pooling2d_3 (MaxPooling2D)   (None, 14, 14, 32)    0           conv2d_3[0][0]
____________________________________________________________________________________________________
conv2d_2 (Conv2D)                (None, 27, 27, 16)    8208        max_pooling2d_1[0][0]
____________________________________________________________________________________________________
conv2d_4 (Conv2D)                (None, 11, 11, 16)    8208        max_pooling2d_3[0][0]
____________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)   (None, 13, 13, 16)    0           conv2d_2[0][0]
____________________________________________________________________________________________________
max_pooling2d_4 (MaxPooling2D)   (None, 5, 5, 16)      0           conv2d_4[0][0]
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 2704)          0           max_pooling2d_2[0][0]
____________________________________________________________________________________________________
flatten_2 (Flatten)              (None, 400)           0           max_pooling2d_4[0][0]
____________________________________________________________________________________________________
concatenate_1 (Concatenate)      (None, 3104)          0           flatten_1[0][0]
                                                                   flatten_2[0][0]
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 10)            31050       concatenate_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 10)            110         dense_1[0][0]
____________________________________________________________________________________________________
dense_3 (Dense)                  (None, 1)             11          dense_2[0][0]
====================================================================================================
Total params: 49,699
Trainable params: 49,699
Non-trainable params: 0
____________________________________________________________________________________________________

График модели графа также создается и сохраняется в файл.

Модель с несколькими выходами

В этом разделе мы разработаем модель, которая делает два разных типа прогнозов Учитывая входную последовательность из 100 временных шагов одного объекта, модель будет классифицировать последовательность и выводить новую последовательность с той же длиной.

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

# Multiple Outputs
from keras.utils import plot_model
from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers.recurrent import LSTM
from keras.layers.wrappers import TimeDistributed
# input layer
visible = Input(shape=(100,1))
# feature extraction
extract = LSTM(10, return_sequences=True)(visible)
# classification output
class11 = LSTM(10)(extract)
class12 = Dense(10, activation='relu')(class11)
output1 = Dense(1, activation='sigmoid')(class12)
# sequence output
output2 = TimeDistributed(Dense(1, activation='linear'))(extract)
# output
model = Model(inputs=visible, outputs=[output1, output2])
# summarize layers
print(model.summary())
# plot graph
plot_model(model, to_file='multiple_outputs.png')

Запуск примера суммирует слои модели.

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_1 (InputLayer)             (None, 100, 1)        0
____________________________________________________________________________________________________
lstm_1 (LSTM)                    (None, 100, 10)       480         input_1[0][0]
____________________________________________________________________________________________________
lstm_2 (LSTM)                    (None, 10)            840         lstm_1[0][0]
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 10)            110         lstm_2[0][0]
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 1)             11          dense_1[0][0]
____________________________________________________________________________________________________
time_distributed_1 (TimeDistribu (None, 100, 1)        11          lstm_1[0][0]
====================================================================================================
Total params: 1,452
Trainable params: 1,452
Non-trainable params: 0
____________________________________________________________________________________________________

График модели графа также создается и сохраняется в файл.

6. Лучшие практики

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

  • Согласованные имена переменных, Используйте одно и то же имя переменной для входного (видимого) и выходного слоев (выходного) и, возможно, даже для скрытых слоев (hidden1, hidden2). Это поможет правильно соединить вещи.
  • Обзор уровня обзора, Всегда печатайте сводку модели и просматривайте выходные данные слоя, чтобы убедиться, что модель была соединена вместе, как вы ожидали.
  • Обзор графиков, Всегда создавайте график графика модели и просматривайте его, чтобы убедиться, что все собрано так, как вы планировали.
  • Назовите слои, Вы можете назначать имена слоям, которые используются при просмотре сводок и графиков графика модели. Например: Dense (1, name = ’hidden1 ′).
  • Отдельные подмодели, Рассмотрите возможность разделения развития подмоделей и объедините подмодели вместе в конце.

У вас есть свои советы по использованию функционального API?
Дай мне знать в комментариях.

7. Замечание о функциональном API-синтаксисе Python

Если вы новичок или новичок в Python, синтаксис, используемый в функциональном API, может сбивать с толку.

Например, учитывая:

...
dense1 = Dense(32)(input)
...

Что делает синтаксис двойной скобки?

Что это значит?

Это выглядит сбивающим с толку, но это не особенная вещь на Python, просто одна строка делает две вещи.

Первая скобка »(32)"Создает слой через конструктор класса, вторая скобка"(Вход)»- это функция без имени, реализованная через__вызов__()функция, которая при вызове соединит слои.

__вызов__()Функция является функцией по умолчанию для всех объектов Python, которая может быть переопределена и используется для «вызов»Экземпляр объекта. Так же, как__в этом__()Функция является функцией по умолчанию для всех объектов, вызываемых сразу после создания объекта для его инициализации.

Мы можем сделать то же самое в две строки:

# create layer
dense1 = Dense(32)
# connect layer to previous layer
dense1(input)

Я думаю, мы могли бы также назвать__вызов__()Функция на объекте явно, хотя я никогда не пробовал:

# create layer
dense1 = Dense(32)
# connect layer to previous layer
dense1.__call_(input)

Дальнейшее чтение

Этот раздел предоставляет больше ресурсов по этой теме, если вы хотите углубиться.

Резюме

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

В частности, вы узнали:

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

У вас есть вопросы?
Задайте свои вопросы в комментариях ниже, и я сделаю все возможное, чтобы ответить.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map