Это введение в серию из трех частей.

  1. Многоканальный вывод с настраиваемой функцией стоимости.
  2. Несколько выходов с пользовательской параметризованной функцией стоимости.
  3. 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

Шаги:

  1. Определение входного слоя. Сюда входит указание формы и типа входных данных, которые будет получать нейронная сеть.
  2. Определение первого и промежуточного слоев. Это включает в себя указание архитектуры нейронной сети, включая количество скрытых слоев и функции активации, которые будут использоваться.
  3. Определение выходных слоев. Это включает в себя указание количества выходных данных, которые будет создавать нейронная сеть, и присвоение имен выходным слоям. Важно отметить, что каждый выходной слой может иметь свою функцию стоимости, связанную с ним. В этом примере функция потерь для выхода «values» представляет собой стандартную среднеквадратичную ошибку (mse), а функция потерь для выхода «actions» — это пользовательская функция потерь, которая является просто функцией энтропии.
  4. Определение пользовательской функции потерь. Чтобы определить пользовательскую функцию потерь, необходимо создать функцию с аргументами y_true и y_pred . Важно отметить, что эти имена нельзя изменить и что при вычислении потерь следует использовать только математические инструменты из tensorflow.keras.backend (обычно импортируемые как k).
  5. Определение словарей для функций потерь и весов потерь. На этом шаге создаются словари для функций потерь и весов потерь с ключами в качестве имен выходных слоев. Значения в словаре функций потерь соответствуют используемым функциям стоимости, а значения в словаре весов потерь соответствуют весам, которые должны быть присвоены каждому выходному слою. В примере для результата «values» мы стремимся использовать встроенную функцию среднеквадратичной ошибки (mse), тогда как для выхода «actions» мы стремимся использовать функцию custom_loss. Соответствующие веса используются как значения в словаре «lossWeights».
  6. Создание модели. На этом этапе создается модель с соответствующими входными и выходными данными, которые анализируются как списки.
  7. Компиляция модели. Наконец, модель компилируется путем анализа словарей на предмет функций потерь и весов потерь. Это включает в себя указание оптимизатора, функций потерь и весов потерь, которые будут использоваться во время обучения. Как показано в примере, мы указали loss=Lossfunc и loss_weights=LossWeights.

В заключение можно сказать, что построение нейронной сети с несколькими входами и несколькими выходами в TensorFlow с пользовательскими функциями стоимости обеспечивает гибкое и мощное решение для различных задач глубокого обучения, таких как классификация изображений, сегментация изображений и машинный перевод. Определив пользовательские функции затрат, вы можете настроить оценку потерь в соответствии со своими конкретными потребностями и оптимизировать производительность модели. С высокоуровневым API TensorFlow, tf.keras, создание таких моделей никогда не было проще. Расширьте возможности своих проектов глубокого обучения уже сегодня с помощью архитектур с несколькими входами и выходами и настраиваемых функций затрат!