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 / TF | PyTorch |
| Стиль | декларативный, лаконичный | императивный, гибкий |
| Цикл обучения | готовый 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 — императивный, гибкий, со своим циклом обучения. - Выбор фреймворка — это задача и команда, а не «кто лучше вообще».