Keras

Keras — высокоуровневый API нейросетей. В TensorFlow 2+ стал его официальным интерфейсом: нейронные сети собираются из модулей как из деталей конструктора.

Уровень: средний 18 разделов ⏱ 3 часа

1. Что такое Keras

Keras — это способ строить модели: Sequential (друг за другом), Functional API (разветвлённые графы) и Model Subclassing (полный контроль логики). Что отличает от чистого TensorFlow — простота и декларативность.

2. Установка

pip install keras
# или вместе с TensorFlow:
pip install tensorflow
from tensorflow import keras
from tensorflow.keras import layers

3. Sequential — стек слоёв

model = keras.Sequential([
    layers.Input(shape=(4,)),
    layers.Dense(16, activation='relu'),
    layers.Dense(8, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])
model.summary()

Sigmoid на выходе — вероятность для бинарной классификации; softmax — для многих классов.

4. Слои: что выбрать

СлойНазначение
Denseполносвязный, табличные данные
Conv2Dизображения, локальные признаки
LSTM / GRUпоследовательности, текст, время
Embeddingслова и категории в векторы
Dropoutзащита от переобучения

5. Компиляция

model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=1e-3),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

Оптимизаторы: Adam (всегда хорош), SGD (нужна настройка lr), RMSprop. Функции потерь — в соответствии с задачей.

6. Обучение

history = model.fit(
    X_train, y_train,
    batch_size=32,
    epochs=20,
    validation_split=0.2,
    verbose=1
)

Результат history.history — словарь списков лосса и метрик по эпохам.

7. Колбэки

callbacks = [
    keras.callbacks.EarlyStopping(monitor='val_loss', patience=3),
    keras.callbacks.ModelCheckpoint('best.keras',
        save_best_only=True, monitor='val_accuracy'),
    keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=2)
]
model.fit(X_train, y_train, epochs=50,
          validation_split=0.2, callbacks=callbacks)
EarlyStopping + ModelCheckpoint — минимальный набор для любого обучения: стоп при деградации и хранение лучшего веса.

8. Оценка и предсказание

model.evaluate(X_test, y_test)      # loss, метрики
prob = model.predict(X_test)        # вероятности
y_pred = (prob > 0.5).astype('int32')

9. Functional API

inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(32, 3, activation='relu')(inputs)
x = layers.MaxPooling2D(2)(x)
x = layers.Flatten()(x)
out = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs, out)

Functional позволяет ветвить и объединять пути — многоуровневые входы, множественные выходы, residual-связи.

10. Лучшие практики

Keras молча прощает небольшие несоответствия форм — тщательно проверяй входную форму через model.summary() и .shape данных.

11. Регуляризация против переобучения

Сложная сеть легко запоминает обучающий шум. Стандартные приёмы — Dropout, регуляризация весов и нормализация слоёв:

model = keras.Sequential([
    keras.layers.Dense(64, activation='relu',
                       kernel_regularizer='l2'),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(1)
])
Постепенное повышение Dropout (0.2 → 0.5) и сопоставление train vs val loss — самый надёжный способ найти границу между недообучением и переобучением.

12. Подача данных: tf.data и аугментация

Для больших выборок данные подают через tf.data.Dataset — потоковые пайплайны без загрузки всего в память:

dataset = tf.data.Dataset.from_tensor_slices((X, y))
dataset = dataset.shuffle(1024).batch(32).prefetch(1)
model.fit(dataset, epochs=10)

Аугментация расширяет обучающую выборку изображений случайными сдвигами, поворотами и отражениями, снижая переобучение «бесплатно»:

aug = keras.Sequential([
    keras.layers.RandomFlip("horizontal"),
    keras.layers.RandomRotation(0.1),
    keras.layers.RandomZoom(0.1)
])
model = keras.Sequential([aug, base_model, head])

13. Сохранение и загрузка моделей

Формат .keras сохраняет веса, архитектуру и оптимизатор — модель можно дообучать после восстановления:

model.save("model.keras")
restored = keras.models.load_model("model.keras")
model.export("saved_model")   # SavedModel для TF Serving
ФорматКогда использовать
.kerasполная модель для дальнейшего обучения
.h5старый вариант того же формата
SavedModelпродакшен и TF Serving
.tflite / .onnxмобильные устройства, независимый инференс

14. Трансферное обучение

Вместо обучения с нуля переносят признаки предобученной сети (ImageNet) и дообучают только голову:

base = keras.applications.ResNet50(
    weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base.trainable = False
model = keras.Sequential([base, keras.layers.GlobalAveragePooling2D(),
                          keras.layers.Dense(10, activation='softmax')])

Сначала фиксируют базу и учат голову, затем размораживают верхние слои и дообучают на малой скорости для тонкой настройки.

Флаг layer.trainable влияет на обучение только после вызова compile(): меняй его до компиляции, иначе изменения не подхватятся.

15. Пользовательские слои и модели

Стандартный стек не покрывает всех задач. Keras позволяет написать собственный слой через наследование от keras.layers.Layer — удобно для кастомного внимания, нормализаций или уникальных активаций:

class Scaling(Layer):
    def __init__(self, factor=2.0):
        super().__init__()
        self.factor = factor
    def call(self, inputs):
        return inputs * self.factor
Внутри call() работай через keras ops, а не чистый NumPy: так слой переживёт граф и GPU, а autograph соберёт его в оптимизированный computation.

16. KerasCV и KerasNLP: готовые пайплайны

Для типовых задач — классификация изображений, детекция объектов, тексты — не обязательно строить сеть из атомов. Отдельные библиотеки дают претрейн-модели и аугментацию «из коробки»:

pip install keras-cv keras-nlp
import keras_nlp
classifier = keras_nlp.models.BertClassifier.from_preset("bert_base_uncased")
Пресет тянет сотни мегабайт весов при первом использовании. Скачивай их на этапе сборки образа/артефакта, а не в рантайме, иначе инференс в проде затормозится.

17. Подбор гиперпараметров: Keras Tuner

Качество модели зависит от скорости обучения, числа нейронов, dropout. Перебирать руками долго, поэтому подключи keras-tuner и опиши пространство параметров:

def build_model(hp):
    units = hp.Int("units", 32, 256, step=32)
    return Sequential([Dense(units, activation="relu"), Dense(1)])
tuner = keras_tuner.RandomSearch(build_model, objective="val_loss", max_trials=30)
Не смешивай подбор на обучающей выборке с переобучением: используй отдельную валидационную set и как можно более жёсткий бюджет времени — иначе тюнер «подгонит» шум.

18. Экспорт в продакшен и квантование

Обученная модель живёт в разных окружениях: сервер, браузер, мобильное приложение. Экспорт начинается с model.save() в формат SavedModel, а дальше — трансформации:

model.save("app_model")                # SavedModel
converter = tf.lite.TFLiteConverter.from_saved_model("app_model")
model.tflite = converter.convert()
quantized = converter.quantize("int8") # 8-битное квантование
ФорматГдеОсобенность
SavedModelTF Serving, Pythonполный граф и метаданные
TFLiteAndroid/iOS/Edgeквантование до 8 бит
ONNXмультифреймворковыйпортирование между средами
Перед экспортом прогони конвертацию на маленьком тесте и сравни метрики на чистом срезе данных: потеря пары процентов точности на квантовании — плата за скорость.

19. Кастомные циклы обучения

Иногда fit недостаточно: нужны собственные шаги, перемешивание, EMA-обновления весов или нестандартные градиенты. Keras позволяет переопределить внутренний цикл.

class MyModel(Model):
    def train_step(self, data):
        x, y = data
        with tf.GradientTape() as tape:
            loss = self.compiled_loss(y, self(x, training=True))
        self.optimizer.apply_gradients(
            zip(tape.gradient(loss, self.trainable_variables),
                self.trainable_variables))
        return {"loss": loss}
Отлаживайте с run_eagerly=True, но для скорости верните граф: JIT-компиляция ускоряет цикл в разы.

20. Несбалансированные классы

Дисбаланс классов заставляет модель «заучивать» большинство с нулевым recall по редкому классу. Лечится на трёх уровнях: данные, веса, функция потерь.

model.fit(x, y, class_weight={0: 1.0, 1: 9.0})
Проверяйте распределение меток в валидации: стратифицированная нарезка обязательна при дисбалансе.

21. Оценка и анализ ошибок

Метрики на тесте — лишь среднее. Чтобы понять, где модель ошибается, нужны матрица ошибок, калибровка и подбор порога.

from sklearn.metrics import classification_report, confusion_matrix
print(classification_report(y_test, (pred > 0.5).astype(int)))
print(confusion_matrix(y_test, (pred > 0.5).astype(int)))
Для регрессии смотрите не только MAE: график остатков покажет смещения на краях диапазона целевой переменной.

22. MLOps: эксперименты и мониторинг

Разработка модели — половина дела. Вторая — управление версиями, реестром моделей и дрейфом данных.

Освойте теневой деплой: старая и новая версии считаются параллельно, а решение об откате принимается по метрикам.
Мониторьте не только accuracy: рост времени инференса тоже сигнал — возможно, переучили модель или упал кэш фич.

Что дальше

Keras живёт внутри TensorFlow, поэтому полноценный пайплайн — в курсе TensorFlow. Гипотезам и динамике — PyTorch.

← Вернуться к курсам