Команда Tensorflow заранее предупредила о грядущем выпуске Tensorflow 2.0, важной вехи, в котором основное внимание уделяется простоте и удобству использования. Я с нетерпением ждал появления Tensorflow 2.0, поэтому перевел этот документ, опубликованный командой Tensorflow:Эффективный TensorFlow 2.0: передовой опыт и изменения. Оригинальный адрес: https://medium.com/tensorflow/efficient-tensorflow-2-0-best-practices-and-whats-changed-a0ca48767aff, немного удален. Нажмите, чтобы прочитать исходный текст, чтобы перейти к этой статье, вам нужно перевернуть стену!
существуетнедавняя статьяВ разделе мы упомянули, что TensorFlow 2.0 был переработан с упором на производительность разработчиков, простоту и удобство использования.
Для подробного ознакомления с изменениями и применения передовых методов ознакомьтесь с новымЭффективное руководство по TensorFlow 2.0(опубликовано на GitHub). В этой статье представлен краткий обзор того, что содержится в этом руководстве. Если вас интересуют эти темы, перейдите к руководству, чтобы узнать больше!
Обзор основных изменений
В TensorFlow 2.0 есть много изменений, повышающих производительность пользователей, включая удалениеРезервный API, чтобы сделать API более согласованным (Единая РНН,Единый оптимизатор) и улучшенная интеграция со средой выполнения Python.Нетерпеливое исполнение.
многиеRFC(Проверьте их, если вы новичок в них!) Были объяснены изменения и мысли, которые сделали TensorFlow 2.0. В этом руководстве показано, как должна выглядеть разработка в TensorFlow 2.0. Предполагается, что вы уже знакомы с TensorFlow 1.x.
Очистка API
Многие API исчезли или изменились местами в TF 2.0, некоторые были заменены эквивалентными версиями 2.0.tf.summary, tf.keras.metrics и tf.keras.optimizers. Самый простой способ автоматической замены новым методом — использоватьскрипт обновления v2.
Нетерпеливое исполнение
TensorFlow 1.X требует, чтобы пользователь вручную вызывал API tf.*, чтобыАбстрактное грамматическое дерево(на фото) сшиты вместе. Затем пользователю необходимо передать набор выходных тензоров и входных тензоров вsession.run()вызов функции для ручной компиляции абстрактного синтаксического дерева. Напротив, TensorFlow 2.0 выполняется немедленно (как обычно делает Python), а в tf 2.0 графики и сеансы больше похожи на детали реализации.
уменьшить глобальные переменные
TensorFlow 1.X сильно зависит от неявного глобального пространства имен. перечислитьtf.Variable(), он будет помещен в граф по умолчанию и останется там, даже если вы забудете переменную Python, указывающую на него. Затем вы можете восстановитьtf.Variable, но только если вы знаете имя, под которым оно было создано. Это сложно сделать, если создание переменных не находится под вашим контролем. В результате появилось множество различных механизмов, пытающихся помочь пользователям снова найти свои переменные.
TensorFlow 2.0 убирает все эти механизмы (Variables 2.0 RFC), включив механизм по умолчанию: отслеживать переменные! если ты проиграешьtf.Variableтрассировки будут удалены сборщиком мусора.
функция, а не сеанс
session.run()Вызов почти аналогичен вызову функции: вы указываете входные данные и вызываемую функцию, а затем возвращаете набор выходных данных. В TensorFlow 2.0 вы можете использоватьtf.function()украсить функцию Python, чтобы пометить ее как скомпилированную JIT, в результате чего TensorFlow запустит ее как один график (Functions 2.0 RFC).
Этот механизм позволяет TensorFlow 2.0 использовать все преимущества графического режима:
- Производительность: функции могут быть оптимизированы (обрезка узлов, слияние ядра и т. д.)
- Портативность: функции можно экспортировать/реимпортировать (SavedModel 2.0 RFC), позволяя пользователям повторно использовать и совместно использовать модульные функции TensorFlow.
Благодаря возможности свободно распространять код Python и TensorFlow вы можете в полной мере воспользоваться выразительной мощью Python. Однако Portable TensorFlow выполняется без контекста интерпретатора Python — Mobile, C++ и JS. Чтобы помочь пользователям избежать переписывания кода при добавлении @tf.functions, AutoGraph преобразует некоторые конструкции Python в их эквиваленты TensorFlow.
Рекомендации соглашения TensorFlow 2.0
Рефакторинг кода в более мелкие функции
Распространенным шаблоном использования в TensorFlow 1.X является стратегия «приемника», при которой набор всех возможных вычислений предварительно упорядочивается, а затем проходит черезsession.run()Оцените выбранный тензор. В TensorFlow 2.0 пользователи должны реорганизовать свой код в более мелкие функции, которые вызываются по мере необходимости. Обычно нет необходимости использоватьtf.functionчтобы украсить эти меньшие функции, используя толькоtf.functionдля украшения сложных вычислений — например, шаг в обучении или прямой проход модели.
Используйте слои и модели Keras для управления переменными
Модели и слои Keras предоставляют удобные переменные иtrainable_variablesсвойство для рекурсивного сбора всех связанных переменных, что упрощает управление переменными локально там, где они используются.
Слои/модели Keras наследуются от tf.train.Checkpointable и интегрируются с @tf.function, что позволяет напрямую получать контрольные точки или экспортировать SavedModel из объектов Keras. Вам не обязательно использовать Keras's.fit() API для этих интеграций.
Объединение tf.data.Datasets и @tf.function
При повторении обучающих данных, загруженных в память, не стесняйтесь использовать обычную итерацию Python. В противном случае tf.data.Dataset — лучший способ перенести обучающие данные с диска. Наборы данных являются итерируемыми (не итераторами) и работают как другие итерации Python в режиме Eager. Вы можете воспользоваться преимуществами функции асинхронной предварительной выборки/потоковой передачи набора данных, обернув свой код в tf.function() , который заменяет итерации Python эквивалентными операциями графа с использованием AutoGraph.
@tf.function
def train(model, dataset, optimizer):
for x, y in dataset:
with tf.GradientTape() as tape:
prediction = model(x)
loss = loss_fn(prediction, y)
gradients = tape.gradients(loss, model.trainable_variables)
optimizer.apply_gradients(gradients, model.trainable_variables)
если вы используетеKeras.fit()API, вам не нужно учитывать итерацию набора данных.
model.compile(optimizer=optimizer, loss=loss_fn)
model.fit(dataset)
Управляйте процессом с помощью AutoGraph и Python
AutoGraph предоставляет способ преобразования потока управления, зависящего от данных, в эквивалентную схему графа, такую какtf.condиtf.while_loop.
Поток управления, зависящий от данных, обычно возникает в моделях последовательности.tf.keras.layers.RNNИнкапсулирует ячейки RNN, позволяя разворачивать циклы статически или динамически. В демонстрационных целях вы можете повторно реализовать динамическую раскрутку следующим образом:
class DynamicRNN(tf.keras.Model):
def __init__(self, rnn_cell):
super(DynamicRNN, self).__init__(self)
self.cell = rnn_cell
def call(self, input_data):
# [batch, time, features] -> [time, batch, features]
input_data = tf.transpose(input_data, [1, 0, 2])
outputs = tf.TensorArray(tf.float32, input_data.shape[0])
state = self.cell.zero_state(input_data.shape[1], dtype=tf.float32)
for i in tf.range(input_data.shape[0]):
output, state = self.cell(input_data[i], state)
outputs = outputs.write(i, output)
return tf.transpose(outputs.stack(), [1, 0, 2]), state
Агрегируйте данные с помощью tf.metrics и регистрируйте с помощью tf.summary.
Наконец-то полный комплектtf.summaryСкоро будут символы. Вы можете получить доступ, используя следующую командуtf.summaryВерсия 2.0:
from tensorflow.python.ops import summary_ops_v2
Следующий шаг
В этой статье представленыДействующие правила TF 2.0(Если вам интересны эти темы, перейдите туда, чтобы узнать больше!) Чтобы узнать больше о TensorFlow 2.0, мы также рекомендуем эти последние статьи: