Синтаксис модели TensorFlow

#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:

Оба способа, которые вы описали, верны. Давайте рассмотрим это шаг за шагом.

  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 чаще используется в задачах обучения передаче. Но, в конце концов, это также зависит от вас и вашего стиля кодирования.