#python #tensorflow #machine-learning #keras #neural-network
#python #tensorflow #машинное обучение #keras #нейронная сеть
Вопрос:
Я новичок в нейронных сетях и Tensorflow
Обычно, когда мы создаем модель нейронной сети в TensorFlow, мы определяем ее следующим образом:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
Недавно я придумал код, использующий transfer learning, и он определил модель следующим образом:
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
x = layers.Dense(1,activation='sigmoid')(x)
Вот last_output
выходные данные модели обучения transfer.
Кто-нибудь может объяснить, чем это отличается от последовательного метода? кроме того, почему выходные данные предыдущего слоя указаны в круглых скобках в конце нового слоя?
Ответ №1:
Оба способа, которые вы описали, верны. Давайте рассмотрим это шаг за шагом.
-
Первая модель использует
Sequential
API.Объявление этого API выглядит следующим образом.tf.keras.Последовательный (layers=None, name=None)
API принимает layers
аргумент в виде списка layers
для добавления в модель.
Отсюда и приведенный вами пример.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu')])
Здесь последовательный API накладывает каждый слой поверх другого и соединяет их. Этот API самостоятельно управляет тем, что выходные данные предыдущих слоев являются входными данными для следующего слоя. Это обеспечивает нам удобство.
2. Подход заключается в создании модели с использованием Functional
API. Вы можете думать об этом как о вызове слоя как функции. Единственное, что вам нужно будет сделать дополнительно, это предоставить предыдущий слой в качестве входных данных для следующего слоя. Поскольку функциональный API не использует что-то похожее на List, единственный способ, которым API узнает, с какого уровня поступают входные данные, — это фактически предоставить предыдущий уровень в качестве аргумента.
Итак, берем ваш пример.
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation='relu')(x)
x = layers.Dense(1,activation='sigmoid')(x)
Функциональный API будет знать, что слой Flatten
должен быть подключен к last_output
layer. Тогда следующий плотный слой будет подключен к Flatten
слою, который x
передается ему в качестве аргумента. Я думаю, вы поняли идею здесь.
Существует также еще один способ создания модели путем создания подкласса Model
класса. Вы можете посмотреть на Functional
API и Model
класс подклассов здесь.
Комментарии:
1. не могли бы вы также объяснить, какой из них является лучшим способом? поскольку большинство программ обучения передаче используют функциональный API, а остальные используют последовательный API, и есть ли какая-либо разница между ними?
2. Таким образом, в принципе, здесь нет ничего правильного или неправильного. И ни в одном из них нет преимущества в производительности. Единственное отличие заключается в том, что инженеры предпочитают использовать функциональный API, поскольку он обеспечивает функциональный способ написания кода, и я думаю, что это также делает его интуитивно понятным при обучении передаче. Итак, вы правы, функциональный API чаще используется в задачах обучения передаче. Но, в конце концов, это также зависит от вас и вашего стиля кодирования.