Вопрос или проблема
Я просто хочу узнать, возможно ли использовать tf.estimator.DNNClassifier с несколькими разными функциями активации. Я имею в виду, могу ли я использовать оценщик DNNClassifier, который использует разные функции активации для разных слоев?
Например, если у меня есть модель из трех слоев, могу ли я использовать для первого слоя функцию sigmoid, для второго – функцию ReLu, а для последнего – функцию tanh?
Мне хотелось бы знать, если это невозможно сделать с DNNClassifier, как я могу сделать это простым способом.
Итак, это очень старый вопрос, но для всех, кто пришел из Google:
Согласно документации, предоставленной TensorFlow, у tf.estimator.DNNClassifier
есть параметр activation_fn
, который описывается как:
Функция активации, применяемая к каждому слою. Если None, будет использоваться tf.nn.relu
Таким образом, эта модель принимает только одну функцию активации и использует ее на всех слоях. Тем не менее, TensorFlow отмечает:
Предупреждение: оценщики не рекомендуются для нового кода. Оценщики запускают код в стиле v1.Session, который сложнее правильно писать и может вести себя неожиданно, особенно в сочетании с кодом TF 2. Оценщики подпадают под наши гарантии совместимости, но не получат исправлений, кроме устранения уязвимостей безопасности. См. руководство по миграции для подробностей.
Поэтому, чтобы решить эту проблему и быть совместимым с рекомендациями TensorFlow, можно использовать keras для создания желаемого DNN слой за слоем. Как показано в примере здесь:
import tensorflow as tf
inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
Функцию активации для каждого слоя можно указать при создании каждого слоя. Для получения дополнительной информации о keras.layers см. здесь.
Ответ или решение
Да, вы правы касательно функционала tf.estimator.DNNClassifier
. К сожалению, данный класс не поддерживает использование различных активационных функций для разных слоев. Параметр activation_fn
, который имеется в DNNClassifier
, принимает лишь одно значение активационной функции, которая будет применяться ко всем слоям сети. По умолчанию используется tf.nn.relu
, и если вы не укажете другую функцию, она будет использоваться во всех слоях модели.
В связи с тем, что TensorFlow на сегодняшний день рекомендует использовать Keras для новых проектов, вам будет проще и удобнее построить модель с различными активационными функциями с использованием API Keras. Основным преимуществом Keras является то, что вы можете задавать активационную функцию отдельно для каждого слоя.
Вот пример, который иллюстрирует, как можно создать DNN с использованием различных активационных функций для каждого слоя с помощью Keras:
import tensorflow as tf
# Определяем входные данные
inputs = tf.keras.Input(shape=(3,))
# Первый слой с активацией sigmoid
x = tf.keras.layers.Dense(4, activation='sigmoid')(inputs)
# Второй слой с активацией ReLU
x = tf.keras.layers.Dense(5, activation='relu')(x)
# Третий слой с активацией tanh
outputs = tf.keras.layers.Dense(2, activation='tanh')(x)
# Создание модели
model = tf.keras.Model(inputs=inputs, outputs=outputs)
# Компилируем модель
model.compile(optimizer='adam', loss='mean_squared_error')
# Выводим информацию о модели
model.summary()
В этом примере мы создаем модель с тремя полносвязными слоями, каждый из которых имеет свою активационную функцию: первый слой использует sigmoid
, второй — ReLU
, а третий — tanh
. Вы можете легко изменять количество нейронов и функции активации, а также добавлять дополнительные слои, по вашему усмотрению.
Таким образом, использование Keras предоставляет гораздо больше гибкости и удобства для построения нейронных сетей с различными активационными функциями.