Класс Sequential
Часто архитектуры нейронных сетей строят в виде последовательности слоев, начиная с входного и заканчивая выходным:

Теоретически, число скрытых слоев может быть сколь угодно большим. Для описания такой модели, как раз и применяется класс Sequential.Например, для описания изображенной сети, модель можно сформировать, следующим образом. Вначале импортируем необходимые зависимости:
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf from tensorflow.keras.layers import Dense from tensorflow import keras from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical
А, затем, создаем экземпляр класса Sequential, то есть, последовательную архитектуру нейронной сети
model = keras.Sequential([
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
В действительности, это эквивалентно последовательному вызову слоев для некоторого входного тензора:
layer1 = Dense(128, activation='relu') layer2 = Dense(10, activation='softmax') x = tf.random.uniform((1, 20), 0, 1) y = layer2(layer1(x))
Класс Sequential предоставляет лишь удобство и некоторый дополнительный функционал при работе с моделью. Например, все слои доступны через список model.layers:
print(model.layers )
Можно удалить последний слой методом pop():
model.pop()
А, затем, добавить методом add():
model.add(Dense(5, activation='linear'))
Соответственно, можно вначале определить пустую модель (без слоев):
model = keras.Sequential()
а после этого добавить необходимые элементы:
model.add(Dense(128, activation='relu', name="layer1")) model.add(Dense(10, activation='softmax', name="layer2"))
При этом каждому слою можно задать свое имя, которые будут использоваться при отображении служебной информации о модели.
У каждого слоя и у модели в целом имеется свойство weights, содержащее список настраиваемых параметров (весовых коэффициентов). Если обратиться к первому слою и свойству weights:
print( model.layers[0].weights )
то увидим пустой список. А если сделать то же самое для всей модели:
print( model.weights )
то получим исключение (ошибку). Это связано с тем, что до момента подачи входного сигнала на вход сети весовые коэффициенты еще не были сформированы. Здесь все работает по аналогии с нашим классом DenseLayer, который мы создавали на предыдущем занятии. Пока не будет вызван метод build слоя, весовые коэффициенты отсутствуют.
Давайте пропустим через модель входной сигнал, состоящий из одного наблюдения длиной 20 чисел:
x = tf.random.uniform((1, 20), 0, 1) y = model(x)
Теперь при обращении к свойству weights получим список всех весовых коэффициентов модели:
print(model.weights )
и мы также можем вывести структуру этой модели с помощью метода summary():
model.summary()