Functional API и сравнение с PyTorch

Финальный урок: Functional API для нестандартных сетей и честное сравнение Keras с PyTorch.

Functional API — это способ описывать модели как граф, соединяя слои явно, что позволяет строить сети с несколькими входами/выходами и ветвлениями, недоступными в Sequential.

Sequential хорош для прямой цепочки, но реальные архитектуры (ResNet со skip-связями, многовходовые модели) — это графы. Для них Keras даёт Functional API. А в конце честно сравним Keras с главным конкурентом — PyTorch.

Functional API

Идея: вы создаёте Input, пропускаете его через слои как через функции и собираете Model из входа и выхода (требует TF):

from tensorflow.keras import layers, Model, Input

inputs = Input(shape=(784,))
x = layers.Dense(64, activation="relu")(inputs)
x = layers.Dense(64, activation="relu")(x)
outputs = layers.Dense(10, activation="softmax")(x)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy")

Главное отличие от Sequential — слой вызывается как функция от предыдущего тензора, поэтому можно делать ветвления и объединения:

# skip-связь (упрощённо)
branch = layers.Dense(64, activation="relu")(x)
merged = layers.add([x, branch])   # сложение двух веток

Keras против PyTorch — честно

КритерийKeras / TFPyTorch
Стильдекларативный, лаконичныйимперативный, гибкий
Цикл обученияготовый fit()пишется вручную
Порог входаниже, быстрый стартвыше, больше контроля
Исследованиярежеде-факто стандарт в науке
Продакшн/мобайлсильная экосистема (Lite, Serving)догнала (TorchScript, ExecuTorch)
Отладкапроще на верхнем уровнеочень удобна (обычный Python)

Тот же слой в двух фреймворках

Keras:

layers.Dense(64, activation="relu")

PyTorch (для сравнения, это не TF-код):

import torch.nn as nn
nn.Sequential(nn.Linear(in_features, 64), nn.ReLU())

В Keras активация — параметр слоя; в PyTorch она обычно отдельный модуль. В Keras обучение — один fit(); в PyTorch вы сами пишете цикл с loss.backward() и optimizer.step().

Как работает под капотом

Functional API строит явный граф вычислений: каждый вызов слоя добавляет узел, и Keras знает все связи заранее — поэтому может проверить совместимость форм и красиво нарисовать модель. PyTorch же строит граф динамически на каждом forward pass («define-by-run»), что даёт максимальную гибкость для нестандартной логики (циклы, условия внутри сети), но требует от вас писать цикл обучения руками.

Частые ошибки

  • Брать Sequential для графовой сети. Ветвления и несколько входов требуют Functional API.
  • Считать, что один фреймворк «лучше». Выбор зависит от задачи: быстрый прод-прототип — Keras, гибкие исследования — PyTorch.
  • Смешивать API в коде PyTorch и TF. Это разные экосистемы; модель пишут на одном.

Итог

  • Functional API описывает сеть как граф — для ветвлений, skip-связей и нескольких входов/выходов.
  • Слой вызывается как функция от предыдущего тензора.
  • Keras — декларативный и быстрый старт с готовым fit(); PyTorch — императивный, гибкий, со своим циклом обучения.
  • Выбор фреймворка — это задача и команда, а не «кто лучше вообще».
Проверьте себя
1. Когда нужен Functional API вместо Sequential?
AВсегда
BДля сетей с ветвлениями, skip-связями или несколькими входами/выходами
CТолько для CNN
DНикогда, это устаревший API
2. Чем цикл обучения в Keras отличается от PyTorch?
AВ Keras готовый fit(), в PyTorch цикл обычно пишут вручную
BВ PyTorch есть fit(), а в Keras нет
CОба требуют ручного цикла
DОба полностью автоматические
3. Как в Functional API слой соединяют с предыдущим?
AЧерез метод add()
BВызывая слой как функцию от предыдущего тензора: Dense(64)(x)
CАвтоматически по порядку в списке
DЧерез compile()