Написанный на языке С++ командой Google в 2015 году TensorFlow является одним из самым популярных фреймворков Deep Learning. Сегодня пойдет речь об интерфейсе, который предоставляет TensorFlow для Python: разница между Tensorflow 1 и TensorFlow 2, встроенный фреймворке Keras, построение моделей и визуализация с TensorBoard.
TensorFlow 1 и TensorFlow 2
Прежде всего проведем границу между версиями TensorFlow 1.x и TensorFlow 2.x. У них есть разительные отличия. Как уже было сказано в прошлой статье, фреймворк оперирует статическими вычислительными графами, а это значит, что они выполняются только в момент компиляции. Рассмотрим тривиальный пример: сумму двух скаляров (чисел). В TensorFlow 1 результатом этой суммы окажется не число, а операция, которую нужно выполнить в будущем:
>>> a = tf.constant(3.0) >>> b = tf.constant(4.0) >>> total = a + b Tensor("add:0", shape=(), dtype=float32)
Для того чтобы получить результат вычисления, необходимо инициализировать tf.Session
:
>>> sess = tf.Session() >>> sess.run(total) 7.0
Подобные действия могут отвлекать от самого процесса построения моделей машинного обучения и к тому же приносить неудобства при отладке. Поэтому TensorFlow 2 лишен этих лишних действий с Session
и placeholders
– теперь можно производить вычисления на лету благодаря режиму Eager, который включен по умолчанию:
>>> a = tf.constant(3.0) >>> b = tf.constant(4.0) >>> total = a + b <tf.Tensor: shape=(), dtype=float32, numpy=7.0> >>> tf.executing_eagerly() True
Такой режим позволяет следить за отладкой, но есть у него недостаток – вычисления производятся медленнее. Поэтому если вы строите модель и экспериментируете с ней, то лучше оставить режим Eager. А если требуется модель в production-качестве, то его лучше отключить. Для повышения производительности режима Eager разработчики рекомендуют использовать декоратор tf.function
:
@tf.function def dense_layer(x, w, b): return add(tf.matmul(x, w), b) dense_layer(tf.ones([3, 2]), tf.ones([2, 2]), tf.ones([2]))
Кроме того, TensorFlow 2 интегрировала слои, функции активации, функции потерь, метрики в модуль tf.keras
, поэтому само построение модели должно осуществляться через этот модуль. В первой версии создавать слои можно было несколькими способами, включая через фреймворк Keras.
Модуль Keras в TensorFlow 2
Фреймворк глубокого обучения Keras перекочевал в TensoFlow 2, и теперь его функционал хранится в модуле tf.keras
. Данный модуль содержит инструменты для построения модели, такие как:
- Слои (layers), включая полносвязный (Dense), сверточный (Conv1D), рекуррентный (RNN, LSTM). Всего насчитывается 105 слоев.
- Функции активации (activations), включая Softmax, ReLU, Sigmoid. Некоторые же функции активации, например, PReLU, доступны в виде слоев. Всего их 15.
- Функции потерь (losses), включая Binary Crossentropy, MAE, MSE. Всего их 25.
- Метрики(metrics), например, MAE, MSE, Cosine Similarity. Всего 43 в виде классов и 25 в виде функций.
- Оптимизаторы (optimizers), включая SGD, Adam, Adagrad. Всего их 9.
- Обратные вызовы (callbacks), включая RemoteMonitor для передачи событий на сервер, History для отслеживания истории событий модели, EarlyStopping для остановки модели в случае отсутствии улучшений, TensorBoardдля активации режима визуализации. Всего их 14.
Построение моделей
Есть два пути создания моделей в TensorFlow. Первый подразумевает последовательное наслоение блоков, как в конструкторе. В этом случае вы доверяете встроенным реализациям алгоритмов прямого и обратного проходов. Ниже на Python создается нейронная сеть (neural network) с полносвязными слоями, которая иллюстрирует блочный вид построения.
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(shape_0, shape_1)), tf.keras.layers.Dense(256, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) model.evaluate(x_test, y_test)
Продвинутые ML-специалисты могут воспользоваться вторым вариантом, создавая модель со своими слоями, функциями активациями и т.д. Этот вид построения подразумевает субклассирование. Пример ниже иллюстрирует, как в Python можно построить сверточную нейронную сеть (convolutional neural network).
class MyModel(tf.keras.Model): def __init__(self): super(MyModel, self).__init__() self.conv1 = Conv2D(64, 3, activation='relu') self.flatten = Flatten() self.d1 = Dense(128, activation='relu') self.d2 = Dense(10, activation='softmax') def call(self, x): x = self.conv1(x) x = self.flatten(x) x = self.d1(x) return self.d2(x) model = MyModel() with tf.GradientTape() as tape: logits = model(images) loss_value = loss(logits, labels) grads = tape.gradient(loss_value, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables))
Вариант с субклассированием открывает поле для экспериментов, но придется изучить API-интерфейс, который предоставляет tf.keras
.
Визуализация с TensorBoard
TensorFlow имеет собственный инструмент для визуализации — TensorBoard. С помощью TensorBoard можно
- следить за процессом изменения точности (accuracy) и потерь (loss) в реальном времени;
- визуализировать граф модели со слоями и операциями;
- показать параметры модели (веса, смешения) или другие тензоры, которые меняются со временем;
- вывести картинки, видео или аудио.
- и многое другое [1].
Вывести TensorBoard можно на локальном компьютере в localhost, либо в блокнотах Jupyter или Colab. Рисунок ниже иллюстрируют интерфейс TensorBoard.
В следующей статье проведем краткий обзор PyTorch. А как применять фреймворк TensorFlow для построения моделей машинного обучения в реальных задачах Data Science, вы сможете узнать на наших курсах по Python в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве.