- BrainTools - https://www.braintools.ru -
Выбор фреймворка для глубокого обучения [1] — это стратегическое решение, влияющее на скорость разработки, стоимость и масштабируемость. Правило «PyTorch — для исследований, TensorFlow — для продакшена» больше не работает. К 2026 году оба фреймворка активно заимствуют лучшее друг у друга: PyTorch наращивает промышленные возможности (TorchServe, ExecuTorch), а TensorFlow с Keras 3 становится гибче для исследований.
Согласно опросу Stack Overflow Developer Survey 2024 [2], PyTorch (10,6%) и TensorFlow (10,1%) находились примерно на одной отметке по частоте использования у разработчиков, а в исследовательских и AI-first-компаниях уверенно лидирует PyTorch [3]. Но есть нюансы.
Эту статью мы подготовили вместе с Татьяной Булгаковой, экспертом в data science, консультантом по внедрению решений на базе искусственного интеллекта [4], чтобы помочь вам разобраться в потоке информации и сделать выбор, основанный на инженерных требованиях вашего проекта, а не на расхожих стереотипах.
Консультант по внедрению ИИ, фрилансер, преподаватель Нетологии на курсах по deap learning, ML и data science
Ключевое различие теперь не в возможностях, а в подходе:
PyTorch предлагает философию контроля и прозрачности: вы управляете процессом, что идеально для исследований, экспериментов и глубокого понимания механизмов.
TensorFlow предлагает философию интеграции и автоматизации: вы пользуетесь готовыми, слаженными инструментами, что оптимально для быстрого вывода стабильных решений в продакшен.
→ Если вам важнее максимальная гибкость и полный контроль над пайплайном или вы хотите глубже понять механику deep learning — в таком случае подойдёт PyTorch.
→ Если максимальная скорость получения рабочих прототипов и большой выбор готовых решений — TensorFlow.
Итак, рассмотрим историю обоих фреймворков, их конкретные особенности и список часто встречающихся ошибок при работе с ними.
Чтобы понять текущее состояние экосистемы, давайте посмотрим, откуда пришли эти фреймворки. Их история объясняет не только технические различия, но и то, почему сложилось их определённое восприятие [5] у сообщества.
PyTorch родился в 2016 году в исследовательской лаборатории Meta* (на тот момент — Facebook AI Research, *признана экстремистской организацией и запрещена на территории РФ) как наследник более раннего фреймворка Torch. Его создатели ставили перед собой чёткую цель: сделать инструмент, в котором учёным и инженерам будет максимально удобно экспериментировать.
Ключевой прорыв — императивное выполнение. Eager execution.
В отличие от доминировавших тогда систем со статическими графами, включая ранний TensorFlow, PyTorch позволил выполнять операции немедленно, построчно, как в обычном Python. Это радикально упростило отладку, интроспекцию и создание динамических архитектур, где граф вычислений может меняться на ходу, как, например, в рекуррентных сетях или с reinforcementlearning.
Путь к универсальности
Изначально воспринятый как сугубо исследовательский инструмент, PyTorch начал стремительно обрастать производственными возможностями. Ключевые вехи:
2018. PyTorch 1.0: введение TorchScript для экспорта моделей и torch.jit для компиляции, что стало мостом к продакшену.
2020. TorchServe: официальный фреймворк для обслуживания моделей, ответ на TensorFlow Serving.
2022. PyTorch 2.0 и torch.compile: глубокая интеграция компилятора TorchDynamo, резко повысившая производительность и приблизившая её к статическим графам.
2023. ExecuTorch: специализированный фреймворк для эффективного развёртывания на периферийных устройствах.
2026. PyTorch — это зрелая, универсальная платформа, которая сохранила свои ключевые суперсилы — интуитивность и контроль для разработчика — и дополнила её полным набором инструментов для промышленного внедрения.
TensorFlow был представлен в Google в конце 2015 года как преемник закрытой системы DistBelief. Его ДНК с самого начала была промышленной: масштабируемость, развёртывание на разнородном железе — от смартфонов до дата-центров, и поддержка больших инженерных команд.
Изначально TensorFlow 1.х требовал определять неизменяемый граф вычислений до начала обучения. Это позволяло оптимизировать продакшен, но создавало высокий порог входа и делало отладку довольно трудной: знаменитые ошибки [6] tf.Session.run(). Однако именно в эту эпоху он оброс мощной экосистемой: TensorFlow Serving, TensorFlow Lite, TFX (TensorFlow Extended).
2019. Революция TensorFlow 2.x
Осознав тренд, команда Google совершила кардинальный разворот: приняла императивное выполнение по умолчанию и полностью интегрировала Keras (изначально независимый высокоуровневый API от Франсуа Шолле) как стандартный способ построения моделей. Это резко снизило порог входа и приблизило опыт [7] разработки к PyTorch.
2023. Эра Keras 3 и универсальности
Последний и самый важный шаг — превращение Keras в мультибэкендовый фреймворк. Теперь один и тот же код на Keras может работать поверх бэкендов TensorFlow, JAX или (экспериментально) PyTorch. Для TensorFlow это означает, что его высокоуровневый API стал ещё более гибким и современным, а специализированные библиотеки KerasCV и KerasNLP предоставляют готовые, оптимизированные, наиболее современные модели.
2026. TensorFlow — это комплексная, модульная экосистема, которая предлагает исследователям удобные высокоуровневые абстракции (Keras 3), а инженерам — проверенный, интегрированный путь от прототипа до развёртывания на любом устройстве.
Таким образом, оба фреймворка прошли огромный путь навстречу друг другу:
PyTorch добавил промышленные инструменты;
TensorFlow приобрёл исследовательскую гибкость и удобство.
И выбор в 2026 году — это выбор между двумя разными философиями разработки и экосистемами, которые перекрывают большинство практических нужд.
Но различия всё же есть.
|
Аспект |
PyTorch |
TensorFlow |
|
Стиль выполнения |
Eager execution по умолчанию, динамические графы |
Eager execution по умолчанию с переходом в статический граф через |
|
Отладка |
Простая с помощью |
В eager-режиме — так же просто. В графовом режиме ( |
|
Экосистема для продакшена |
TorchServe, MLflow — развиваются. Поддержка .NET через стороннюю библиотеку TorchSharp. Но основной путь для продакшена —экспорт в ONNX |
TFX, TensorFlow Serving — зрелые решения |
|
Распределённое обучение |
|
|
|
Высокоуровневый API |
PyTorch Lightning — сторонняя библиотека |
Keras — полностью интегрирован |
|
Производительность |
|
XLA с Keras 3 обеспечивает автоматическую оптимизацию |
Здесь мы видим основные различия на текущий момент — оба фреймворка технически могут решать одни и те же задачи, но предлагают разные балансы между контролем и автоматизацией.
1. Гибкость и контроль (PyTorch):
TorchServe и MLflow развиваются, но требуют больше ручной настройки, чтобы построить полный MLOps-пайплайн.
Распределённое обучение (torch.distributed) требует глубокого понимания, но даёт максимальный контроль.
2. Интеграция и автоматизация (TensorFlow):
TFX и TensorFlow Serving — зрелые, готовые решения для промышленных пайплайнов.
tf.distribute.Strategy — простое в использовании API для распределённого обучения, абстрагирующее сложности.
|
Если вы цените максимальный контроль над каждым этапом и готовы тратить время на настройку, выбирайте PyTorch. Если вам важна целостность экосистемы и быстрый переход от прототипа к продакшену с минимумом шаблонного кода, выбирайте TensorFlow. |
А теперь переведём эти различия на язык требований проекта.
Установка PyTorch:
# Для Windows/Linux с CUDA 12.x
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
Установка TensorFlow:
# Установка TensorFlow с поддержкой GPU (для версий 2.15+ и CUDA 12)
pip install tensorflow[and-cuda]==2.15.*
Проверка GPU:
# PyTorch
import torch
print(f"PyTorch использует GPU: {torch.cuda.is_available()}")
# TensorFlow
import tensorflow as tf
print(f"TensorFlow использует GPU: {len(tf.config.list_physical_devices('GPU')) > 0}")
Лучший способ понять разницу — решить одну задачу двумя способами. Возьмём классическую MNIST и реализуем идентичную свёрточную сеть (CNN) на PyTorch и TensorFlow, сравнив не только метрики, но и опыт разработки.
Важная оговорка: код максимально упрощён для наглядности. В реальных проектах вы будете использовать более абстрактные API (Lightning для PyTorch, готовые model.fit() для Keras).
Реализация на PyTorch — контроль над каждым шагом
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 1. Подготовка данных (явная, пошаговая)
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_data = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST('./data', train=False, transform=transform)
train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
test_loader = DataLoader(test_data, batch_size=1000, shuffle=False)
# 2. Определение модели (наследование от nn.Module -- полная свобода)
class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout(0.25)
self.dropout2 = nn.Dropout(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = torch.relu(x)
x = self.conv2(x)
x = torch.relu(x)
x = torch.max_pool2d(x, 2)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = torch.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
return x
# 3. Настройка (всё явно: устройство, оптимизатор, функция потерь)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = ConvNet().to(device) # Явный перенос модели на устройство
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 4. Цикл обучения (пишем вручную -- полный контроль)
def train(model, device, train_loader, optimizer, criterion):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device) # Явный перенос данных
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
# 5. Валидация (тоже вручную)
def test(model, device, test_loader):
model.eval()
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(target.view_as(pred)).sum().item()
return 100. * correct / len(test_loader.dataset)
# 6. Запуск (одна эпоха для примера)
for epoch in range(1):
train(model, device, train_loader, optimizer, criterion)
acc = test(model, device, test_loader)
print(f'Эпоха {epoch+1}, Точность: {acc:.2f}%')
Что важно:
Вы контролируете всё: от загрузки данных до шага оптимизатора.
Вы самостоятельно указываете, где проводить вычисления — на CPU или GPU, используя .to(device). Это добавляет шаг, но даёт полный контроль и понимание, где выполняются операции.
Цикл обучения (train) пишете вы — можно легко добавлять кастомную логику [9], например логирование, смешанную точность, gradient clipping.
Реализация на TensorFlow (Keras) — лаконичность и интеграция
import tensorflow as tf
from tensorflow.keras import layers, models, datasets
# 1. Подготовка данных (встроенные утилиты, минимум кода)
(x_train, y_train), (x_test, y_test) = datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0
x_train = (x_train - 0.1307) / 0.3081 # Та же нормализация, что в PyTorch
x_test = (x_test - 0.1307) / 0.3081
# 2. Определение модели (Sequential API -- декларативно и лаконично)
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Dropout(0.25),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
# 3. Компиляция (всё в одной строке: оптимизатор, потеря, метрики)
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 4. Обучение (один вызов .fit() -- весь цикл инкапсулирован)
history = model.fit(
x_train, y_train,
batch_size=64,
epochs=1,
validation_split=0.1,
verbose=1
)
# 5. Валидация (встроенный метод .evaluate())
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f'Точность на тесте: {test_acc * 100:.2f}%')
Что важно:
Автоматизация: не нужно явно управлять устройством, TensorFlow сам использует GPU при наличии.
Минимум шаблонного кода: данные загружаются одной строкой, модель определяется декларативно.
Интеграция: весь тренировочный цикл, логирование и валидация упакованы в .fit().
Как видно в примерах выше, разница — не в возможности решить задачу, а в подходе.
PyTorch даёт конструктор: вы видите каждую деталь, собираете цикл обучения вручную и сами решаете, куда положить каждый тензор. Это путь максимального контроля и понимания.
TensorFlow (Keras) предлагает готовый инструмент: вы описываете, что должно быть в модели, а фреймворк решает, как это эффективно выполнить. Это путь быстрой сборки и интеграции.
Оба подхода ведут к одной цели — работающей нейронной сети, но они создают разный опыт для разработчика. Именно этот опыт и должен стать главным критерием выбора инструмента под конкретные задачи вашего проекта.
Учитывая все рассмотренные выше аспекты, ключ к выбору — определить приоритеты вашего проекта.
PyTorch подойдёт, если:
Вы создаёте нестандартные, эволюционирующие архитектуры, например в фундаментальных исследованиях. Динамические графы позволяют изменять логику на лету.
Глубокая интеграция с экосистемой Python критически важна. PyTorch ощущается как его естественное расширение.
Ваш workflow построен вокруг Hugging Face или других библиотек, исторически сложившихся в экосистеме PyTorch.
Вам требуется прямая работа из .NET-приложений через TorchSharp (сторонняя библиотека).
В продакшене чаще придётся собирать пайплайн из компонентов (TorchServe/MLflow и т. п.).
TensorFlow (с Keras 3) подойдёт, если:
Вам нужен один хорошо интегрированный стек от идеи до продакшена. Keras для разработки, TFX для пайплайнов, TF Serving для развёртывания.
Мобильное, или edge-развёртывание, — важное требование. TFLite — зрелое решение для mobile/edge за счёт оптимизаций и широкой поддержки железа.
Вы работаете преимущественно в Google Cloud или планируете использовать TensorFlow.js для веб-развёртывания.
Вы хотите использовать наиболее современные модели для CV/NLP, но цените готовые, оптимизированные и нативные API (через KerasCV и KerasNLP), а не сборку из отдельных библиотек.
Универсальные сценарии, когда оба фреймворка одинаково хорошо подходят:
Обучение стандартных моделей (CNN, RNN, Transformers). Оба фреймворка предоставляют все необходимые инструменты. Выбор может сводиться к личным предпочтениям команды.
Масштабирование обучения на несколько GPU/узлов. Оба имеют зрелые решения (torch.distributed, tf.distribute.Strategy).
Экспорт моделей для продакшена. Через ONNX модели из обоих фреймворков могут обслуживаться в единой среде.
Оба стека предоставляют полный путь от идеи до продакшена. Разница — в распределении усилий. PyTorch позволяет быстрее начать и экспериментировать, но потребует больше работы, чтобы построить пайплайн. TensorFlow может потребовать немного больше времени на освоение, но затем предоставляет более завершённые решения для масштабирования.
У обеих экосистем есть особенности, которые могут стать ловушкой. Ниже — самые частые проблемы и способы их решения.
Операции требуют точного совпадения форм, но способы получения этих форм различаются.
Решение в PyTorch: используйте tensor.shape, который возвращает объект torch.Size (похожий на кортеж). Отладка проста: можно вставить print(x.shape) в любом месте кода.
Решение в TensorFlow: используйте tf.shape(tensor), чтобы получить тензор с размерностями (может потребоваться .numpy(), чтобы получитьзначения). Чаще всего достаточно tensor.shape, который возвращает TensorShape.
Вы не видите прироста скорости, хотя GPU доступен.
Решение в PyTorch: вручную перенесите модель и данные на устройство: model.to(device), data.to(device).
Решение в TensorFlow: фреймворк пытается использовать GPU автоматически. Если этого не происходит, проверьте установку CUDA/cuDNN и убедитесь, что tf.config.list_physical_devices('GPU') возвращает устройство.
В PyTorch, если модель и данные находятся на разных устройствах (например, модель на GPU, а тензор на CPU), операция завершится ошибкой. В TensorFlow такое встречается реже, но возможно при ручном управлении устройствами.
Решение в PyTorch: всегда проверяйте устройство тензоров с помощью .device и явно переносите их на нужное устройство:
# Проверяем устройство модели
device = next(model.parameters()).device
# Переносим данные на то же устройство
data = data.to(device)
Решение в TensorFlow: убедитесь, что все операции выполняются в правильном контексте устройства. Используйте tf.debugging, чтобы проверить размещение:
# Временно включим логирование размещения операций
tf.debugging.set_log_device_placement(True)
# Далее запустите свой код, чтобы увидеть, где выполняются операции
Ошибка RuntimeError: CUDA out of memory останавливает обучение.
Общее решение: уменьшите batch_size, используйте градиентный аккумулятор, включите mixed precision training (torch.autocast или tf.keras.mixed_precision).
Специфичное решение для PyTorch: вызывайте torch.cuda.empty_cache(), чтобы очистить кеш. Убедитесь, что не накапливаете историю вычислений без необходимости: используйте .detach().
Специфичное решение для TensorFlow: включите рост памяти [10] tf.config.experimental.set_memory_growth(gpu, True).
При одинаковых seed вы получаете разные результаты от запуска к запуску.
Решение в PyTorch: установите torch.manual_seed() и torch.cuda.manual_seed_all(). Для полной детерминированности добавьте:
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
Решение в TensorFlow: установите tf.random.set_seed(). Для сложных сценариев может потребоваться установка переменной окружения TF_DETERMINISTIC_OPS=1.
|
Большинство этих проблем решаются внимательным чтением сообщений об ошибках и проверкой состояния (форматов, устройств, памяти) на ключевых этапах пайплайна. Но несмотря на то, что оба фреймворка значительно улучшили возможности диагностики, понимание этих «граблей» может сэкономить вам часы отладки. |
Чтобы понять, как это работает, подойдёт PyTorch. Его императивный стиль и близость к Python позволят вам шаг за шагом строить модель, чётко видя, как данные проходят через каждый слой. Это отличный выбор для глубокого погружения в механику deep learning.
Чтобы как можно быстрее получить работающий прототип, подойдёт Keras (TensorFlow). Высокоуровневый API Keras позволяет собрать и обучить модель, написав минимум кода. Это даст быстрое ощущение результата и уверенность.
Ваш выбор определяется контекстом проекта и долгосрочными требованиями, а не техническим превосходством одного из фреймворков.
Оптимальный выбор в зависимости от типа вашего проекта:
Исследовательский, с фокусом на нестандартные архитектуры и максимальную гибкость
PyTorch широко используют в R&D. Экосистема для исследований (Hugging Face, torchvision), динамические графы и активное сообщество делают его лидером в ML-исследованиях.
Промышленный, с чёткими сроками, требующий надёжного пайплайна от A до Z
TensorFlow (со стеком Keras, TFX, TFLite) предлагает самый целостный и интегрированный путь. Зрелость инструментов для MLOps (TFX, Serving) и edge-развёртывания (TFLite) снижает операционные риски.
Требует стратегической гибкости и защиты от привязки к вендору
Рассмотрите Keras 3 как абстрактный слой. Написав код на Keras, вы сможете запускать его на бэкендах JAX или TensorFlow без изменений. Это даёт возможность в будущем сменить низкоуровневый движок, не переписывая высокоуровневую логику модели.
Примечание: поддержка PyTorch в качестве бэкенда Keras 3 остаётся экспериментальной.
Интеграция в существующую экосистему (.NET, мобильные приложения)
Для .NET оцените путь через ONNX (подходит для обоих фреймворков) или прямую интеграцию PyTorch через стороннюю библиотеку TorchSharp. Для мобильных приложений TensorFlow Lite по-прежнему предлагает наиболее зрелый и оптимизированный стек.
И помните: освоив один фреймворк, вы получаете ключ к пониманию другого. Начните с решения вашей текущей задачи — оба инструмента вас в этом поддержат.
Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных лекций и материалов:
курса-симулятора «Введение в SQL и работу с базами данных [11]»;
марафона консультаций магистратуры НИУ ВШЭ «Инженерия данных [12]»;
занятия «Гибкое планирование: как достичь целей без саморазрушения [13]»;
курса «Специалист по информационной безопасности: старт карьеры [14]»;
вебинара «Карьера в IT: как ИИ даёт преимущество на рынке в 2026 году [15]».
Или можно стать востребованным сотрудником и открыть открыть бóльшие перспективы в карьере с профессиональным обучением:
на практическом курсе «Вайб-кодинг [16]»;
на программе профессиональной переподготовки «ИИ-разработчик: от API до агентов [17]» совместно с МТУСИ;
на практическом курсе Data Scientist [18] с оплачиваемой стажировкой и возможностью выбрать свой уровень погружения;
на проекте по повышению квалификации «Руководитель проектов в области искусственного интеллекта [19]» при участии МФТИ;
на курсе «Машинное обучение [20]».
Автор: mariavvv
Источник [21]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/25527
URLs in this post:
[1] обучения: http://www.braintools.ru/article/5125
[2] Stack Overflow Developer Survey 2024: https://survey.stackoverflow.co/2024/technology
[3] лидирует PyTorch: https://mlcontests.com/state-of-machine-learning-competitions-2024/
[4] интеллекта: http://www.braintools.ru/article/7605
[5] восприятие: http://www.braintools.ru/article/7534
[6] ошибки: http://www.braintools.ru/article/4192
[7] опыт: http://www.braintools.ru/article/6952
[8] Image: https://sourcecraft.dev/
[9] логику: http://www.braintools.ru/article/7640
[10] памяти: http://www.braintools.ru/article/4140
[11] Введение в SQL и работу с базами данных: https://netology.ru/programs/vvedenie-v-sql-i-rabotu-s-bazoi-dannih?utm_source=habr&utm_medium=externalblog&utm_campaign=up_it_sqlbasic_bou_habr_brand_article-11022026_media
[12] Инженерия данных: https://netology.ru/programs/marafon_konsultacij_vsheh_inzhenerii_dannyh?utm_source=habr&utm_medium=externalblog&utm_campaign=bhe_marafon-konsultacij_marafon_habr_brand_article-11022026_media
[13] Гибкое планирование: как достичь целей без саморазрушения: https://netology.ru/programs/plan-your-year?utm_source=habr&utm_medium=externalblog&utm_campaign=activ_pl25_oz_habr_brand_article-11022026_media
[14] Специалист по информационной безопасности: старт карьеры: https://netology.ru/programs/sibfree?utm_source=habr&utm_medium=externalblog&utm_campaign=re_it_sibfree_bou_habr_brand_article-11022026_media
[15] Карьера в IT: как ИИ даёт преимущество на рынке в 2026 году: https://netology.ru/programs/kak-ai-menyaet-it-karjeru?utm_source=habr&utm_medium=externalblog&utm_campaign=re_it_aiitweb_oz_habr_brand_article-11022026_media
[16] Вайб-кодинг: https://netology.ru/programs/ai-coding?utm_source=habr&utm_medium=externalblog&utm_campaign=up_it_aivibe_ou_habr_brand_article-11022026_media
[17] ИИ-разработчик: от API до агентов: https://netology.ru/programs/aid?utm_source=habr&utm_medium=externalblog&utm_campaign=bhe_bhelaid_ou_habr_brand_article-11022026_media
[18] Data Scientist: https://netology.ru/programs/prodatascience?utm_source=habr&utm_medium=externalblog&utm_campaign=re_it_dsu_ou_habr_brand_article-11022026_media
[19] Руководитель проектов в области искусственного интеллекта: https://netology.ru/programs/rukovoditel-proektov-v-oblasti-iskusstvennogo-intellekta-dpo-mfti?utm_source=habr&utm_medium=externalblog&utm_campaign=bhe_bhelpmii_ou_habr_brand_article-11022026_media
[20] Машинное обучение: https://netology.ru/programs/machine-learn?utm_source=habr&utm_medium=externalblog&utm_campaign=up_it_aml_ou_habr_brand_article-11022026_media
[21] Источник: https://habr.com/ru/companies/netologyru/articles/995500/?utm_campaign=995500&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.