Долгое время я просто пытался решить, какую из них изучить между TensorFlow и PyTorch, двумя из самых популярных библиотек для глубокого обучения. Мне лучше было потратить время на изучение и совершенствование одного, чем просто на сравнение. Спустя какое-то время я понял, что не так много можно потерять, если предпочтет одно другому. В конце концов я просто решил воспользоваться TensorFlow от Google и взяться за дело.

Как только я начал изучать TensorFlow, я понял, что TensorFlow имеет множество функций и по каждой из них так много ресурсов. Это меня очень смутило. Обратившись к нескольким источникам, я смог получить хорошее представление о его работе и функциях. Это моя попытка представить библиотеку с высоты птичьего полета и сосредоточиться на основных частях построения глубоких нейронных сетей.

В этой статье основное внимание уделяется объяснению TensorFlow для начинающих, а не обучению машинному обучению.

Ниже приведены предварительные условия или предположения:

  1. У вас есть практические знания в области машинного обучения
  2. Вы знакомы с интуитивным пониманием построения нейронных сетей.

Обзор:

Я буду рассматривать следующие 3 раздела:

  • Стек программирования TensorFlow: понимание различных уровней API, присутствующих в TensorFlow
  • Граф вычислений: краткое введение в парадигму графа вычислений, используемую в TensorFlow.
  • Классификатор нейронной сети. Компоненты, участвующие в создании простого классификатора.

1. Стек программирования TensorFlow

Если вы являетесь пользователем Keras или читали об этом, вы бы знали, что Keras - это библиотека высокого уровня с TensorFlow и многими другими библиотеками в бэкэнде. Но знаете ли вы, что у самого TensorFlow есть собственный программный стек, включающий различные уровни API?

Проще говоря:

API высокого уровня: меньше кода и меньше гибкости

API низкого уровня: больше кода и большая гибкость

Чтобы не усложнять задачу, давайте сосредоточимся только на высокоуровневых API, включающих оценщики, и некоторых API среднего уровня, таких как набор данных. В следующих частях я расскажу о низкоуровневом API.

2. Расчет-граф

Для завершения давайте попробуем разобраться в графах вычислений в TensorFlow и методах оценки на очень простом примере. Я настоятельно рекомендую учиться в письменной форме и видеть результат самостоятельно, а не просто читать. Не копируйте и вставляйте код, введите его один раз и попытайтесь запомнить. Давайте попробуем следующий фрагмент в интерпретаторе Python.

import tensorflow as tf
x1 = tf.constant(2)
x2 = tf.constant(3)
res = x1 * x2
print(res)

У вас должен получиться примерно такой результат:

<tf.Tensor 'mul_1:0' shape=() dtype=int32>

Итак, что случилось ? Я ожидал, что результат будет 6, но я получил вышеуказанные результаты. Это потому, что Tensorflow следует парадигме графов вычислений. Это означает построение всего графа вычислений с использованием различных узлов, а затем выполнение всего этого единожды. Это гарантирует, что некоторые задачи на графике могут использовать преимущества параллельной обработки. Посмотрите это видео от Andrew NG, чтобы понять его простым языком. Пока в коде я построил только график. Необходимо явно передать это, чтобы фактически выполнить график и дать нам результаты. Подробнее о его преимуществах вы можете прочитать здесь.

Теперь попробуйте запустить приведенный ниже фрагмент, и вы должны получить 6 в качестве ответа. Это создает сеанс и запускает приведенный выше график.

sess = tf.Session()
print(sess.run(res))

3. Классификатор нейронных сетей.

Теперь вы знаете об API и графах вычислений. Давайте продолжим и создадим классификатор нейронной сети с использованием высокоуровневых API. Ниже приведены 4 основных компонента:

  1. Как определить особенности и их типы?
  2. Как создать модель (оценщик)?
  3. Как передать данные в модель для обучения / оценки / прогнозирования?
  4. Как применить методы к созданному объекту (обучение, прогнозирование и т. Д.)?

1. Определение функции

Это используется, чтобы сообщить TensorFlow, как использовать каждую функцию в данных. Один из распространенных методов - использовать функцию как числовой столбец.

def construct_features(features):
    return [ tf.feature_column.numeric_column(feature) for feature in features]

В классе feature_column в TensorFlow есть много других методов для обработки функций. Ознакомьтесь с ними здесь.

2. Создание экземпляра модели

Именно здесь я определяю архитектуру модели, которую собираюсь использовать. Наши определения функций подаются в качестве входных данных для модели во время создания экземпляра. На этом этапе определяются любые гиперпараметры, оптимизаторы. Я определяю сеть с 3 метками классов, и это содержит 2 скрытых слоя по 10 единиц в каждом слое. Я использую AdamOptimizer для обновления веса сети.

my_optimizer = tf.train.AdamOptimizer()
classifier = tf.estimator.DNNClassifier(feature_columns= construct_features(data.feature_names), hidden_units= [10, 10],
                                        optimizer=my_optimizer,
                                        n_classes = 3)

Готовые оценщики представлены в классе tf.estimator. В нем есть множество других оценщиков, включая LinearClassifier, LinearRegressor и т. Д. Ознакомьтесь с ними здесь. Вы могли встретить эти оценщики и в классе tf.contrib.learn. Не используйте их, так как они устарели.

3. Данные фида

Давайте продолжим и обучим модель, используя указанный выше классификатор, но для обучения требуется, чтобы данные подавались в каком-то определенном формате. Это требует, чтобы данные были в формате словаря. Ниже функция возвращает данные в необходимом формате.

def my_input_fn():
    features = {'Feature1': np.array([2.3, 4.7]),
                'Feature2':  np.array([8.1, 4.6]),
                'Feature3': np.array([6.3, 2.8]),
                'Feature4':  np.array([4.1, 3.4])}
    labels = np.array([2, 1])
    return features, labels

Вышеупомянутая функция выполняет свою работу, но рекомендуется использовать Dataset API от TensorFlow.

Почему ?

  • Он может читать разные форматы данных
  • Это может помочь нам в предоставлении данных в пакетах для методов.
  • Он может перетасовать данные за нас

Итак, лучший способ написать функцию выше выглядит следующим образом

def my_input_fn(data, batch_size, num_epochs, shuffle):
    feature_dict = {}
    for i in range(len(data.feature_names)):
        feature_dict[data.feature_names[i]] = data.data[:,i]
    
    return tf.estimator.inputs.numpy_input_fn(
            x = feature_dict,
            y = data.target,
            batch_size= batch_size, 
            num_epochs= num_epochs, 
            shuffle= shuffle)

Здесь я напрямую использую numpy_input_fn (). У меня также есть возможность принимать входные данные от панд, используя pandas_input_fn (). Функция ввода может быть создана с помощью Dataset API для преобразования данных в срезы Tensor, перемешивания, пакетной обработки и создания их итератора, но для простоты мы использовали здесь высокоуровневый API.

4. Обучайте модели и прогнозируйте

Это последний шаг в конвейере модели. Вызовите метод train в нашем классификаторе и загрузите необходимые данные с помощью функции my_input_fn. Я использую 100 образцов в пакете с 500 эпохами.

classifier.train(input_fn= my_input_fn(data, 100, 500, True))

При прогнозировании достаточно только одной эпохи и нет необходимости перетасовывать данные. Итак, код прогноза выглядит так:

pred = classifier.predict(input_fn= my_input_fn(data, 178, 1, False))

Полный код классификации вин можно найти здесь.

Несколько вещей, которые можно попробовать самостоятельно:

  • Создайте отдельные тестовые данные и получите по ним точность.
  • Загрузите любой другой набор данных как панд и используйте его для обучения и тестирования. Используйте pandas_input_fn, как упомянуто здесь.
  • Попробуйте изменить гиперпараметры и оптимизаторы
  • Попробуйте использовать Dataset API для создания input_fn ()

Следующий раздел:

  1. Создание собственных оценщиков с использованием TensorFlow
  2. Как отлаживать код TensorFlow
  3. Нейронная сеть с использованием API низкого уровня TensorFlow