Это введение в серию из трех частей.
- Многоканальный вывод с настраиваемой функцией стоимости.
- Несколько выходов с пользовательской параметризованной функцией стоимости.
- Multi-Input Multi-Output с предопределенной функцией стоимости.
В примере с несколькими выходами и пользовательской функцией стоимости демонстрируется процесс построения нейронной сети с несколькими выходами в TensorFlow и определение пользовательской функции стоимости для оценки потерь между прогнозируемыми выходами и фактическими выходами. Пользовательская функция стоимости позволяет более точно и конкретно оценивать потери, в отличие от использования предопределенной функции стоимости.
Чтобы построить нейронную сеть с несколькими выходами в TensorFlow, мы будем использовать высокоуровневый API tf.keras
, который предоставляет удобный и удобный интерфейс для разработки моделей глубокого обучения. В этом примере показано, как определить архитектуру нейронной сети с несколькими выходами, а также как скомпилировать модель и указать оптимизатор и пользовательскую функцию стоимости, которые будут использоваться во время обучения.
Реализация выглядит следующим образом:
import tensorflow as tf from tensorflow.keras.layers import Input, Dense from tensorflow.keras import Model from tensorflow.keras.optimizers import RMSprop import tensorflow.keras.backend as K import numpy as np def model(input_shape=4, output_shape=3, lr=0.0001): """ A function that creates a multi-output deep neural network model with a custom loss function. The model has a single input and two outputs. The first output uses a custom loss function, while the second output uses the mean squared error (MSE) loss. The total loss is a weighted sum of the loss for each output. Parameters: input_shape (int, optional): The shape of the input tensor. Default value is 4. output_shape (int, optional): The shape of the output tensor for the first output (actions). Default value is 3. lr (float, optional): The learning rate to be used by the optimizer. Default value is 0.0001. Returns: Model: A Keras model instance. """ # STEP-1: Define the input layer of the model. input_layer = Input(input_shape) # STEP-2: Add the first dense layer to the model. layer_1 = Dense(units=32, activation='elu', kernel_initializer='he_uniform')(input_layer) # STEP-3: Define the two output layers of the model, with names 'actions' and 'values'. y_1 = Dense(units=output_shape, activation='softmax', kernel_initializer='he_uniform', name='actions')(layer_1) y_2 = Dense(units=1, activation='linear', kernel_initializer='he_uniform', name='values')(layer_1) # STEP-4: Define the custom loss function for the 'actions' output. def custom_loss(y_true, y_pred): """ A custom loss function for the 'actions' output. The loss is calculated as the entropy loss, which is defined as: entropy_loss = -y_pred * K.log(y_true + 1e-10) Parameters: y_true (tensor): The true values for the 'actions' output. y_pred (tensor): The predicted values for the 'actions' output. Returns: tensor: The calculated entropy loss. """ entropy_loss = -y_pred * K.log(y_true + 1e-10) return entropy_loss # STEP-5: Define the dictionaries for the loss functions and loss weights, with keys as the names of the output layers. LossFunc = {'actions': custom_loss, 'values': 'mse'} lossWeights = {'actions': 0.5, 'values': 0.5} # STEP-6: Create the model using the input layer and the two output layers. Network_model = Model(inputs=input_layer, outputs=[y_1, y_2]) # STEP-7: Compile the model using the specified optimizer, loss functions, loss weights, Network_model.compile(optimizer=RMSprop(learning_rate=lr), loss=LossFunc, loss_weights=lossWeights) return Network_model
Шаги:
- Определение входного слоя. Сюда входит указание формы и типа входных данных, которые будет получать нейронная сеть.
- Определение первого и промежуточного слоев. Это включает в себя указание архитектуры нейронной сети, включая количество скрытых слоев и функции активации, которые будут использоваться.
- Определение выходных слоев. Это включает в себя указание количества выходных данных, которые будет создавать нейронная сеть, и присвоение имен выходным слоям. Важно отметить, что каждый выходной слой может иметь свою функцию стоимости, связанную с ним. В этом примере функция потерь для выхода «
values
» представляет собой стандартную среднеквадратичную ошибку (mse
), а функция потерь для выхода «actions
» — это пользовательская функция потерь, которая является просто функцией энтропии. - Определение пользовательской функции потерь. Чтобы определить пользовательскую функцию потерь, необходимо создать функцию с аргументами
y_true
иy_pred
. Важно отметить, что эти имена нельзя изменить и что при вычислении потерь следует использовать только математические инструменты изtensorflow.keras.backend
(обычно импортируемые какk
). - Определение словарей для функций потерь и весов потерь. На этом шаге создаются словари для функций потерь и весов потерь с ключами в качестве имен выходных слоев. Значения в словаре функций потерь соответствуют используемым функциям стоимости, а значения в словаре весов потерь соответствуют весам, которые должны быть присвоены каждому выходному слою. В примере для результата «
values
» мы стремимся использовать встроенную функцию среднеквадратичной ошибки (mse
), тогда как для выхода «actions
» мы стремимся использовать функциюcustom_loss
. Соответствующие веса используются как значения в словаре «lossWeights
». - Создание модели. На этом этапе создается модель с соответствующими входными и выходными данными, которые анализируются как списки.
- Компиляция модели. Наконец, модель компилируется путем анализа словарей на предмет функций потерь и весов потерь. Это включает в себя указание оптимизатора, функций потерь и весов потерь, которые будут использоваться во время обучения. Как показано в примере, мы указали
loss=Lossfunc
иloss_weights=LossWeights
.
В заключение можно сказать, что построение нейронной сети с несколькими входами и несколькими выходами в TensorFlow с пользовательскими функциями стоимости обеспечивает гибкое и мощное решение для различных задач глубокого обучения, таких как классификация изображений, сегментация изображений и машинный перевод. Определив пользовательские функции затрат, вы можете настроить оценку потерь в соответствии со своими конкретными потребностями и оптимизировать производительность модели. С высокоуровневым API TensorFlow, tf.keras
, создание таких моделей никогда не было проще. Расширьте возможности своих проектов глубокого обучения уже сегодня с помощью архитектур с несколькими входами и выходами и настраиваемых функций затрат!