Класс Sequential

Класс 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()



Report Page