Долгое время я просто пытался решить, какую из них изучить между TensorFlow и PyTorch, двумя из самых популярных библиотек для глубокого обучения. Мне лучше было потратить время на изучение и совершенствование одного, чем просто на сравнение. Спустя какое-то время я понял, что не так много можно потерять, если предпочтет одно другому. В конце концов я просто решил воспользоваться TensorFlow от Google и взяться за дело.
Как только я начал изучать TensorFlow, я понял, что TensorFlow имеет множество функций и по каждой из них так много ресурсов. Это меня очень смутило. Обратившись к нескольким источникам, я смог получить хорошее представление о его работе и функциях. Это моя попытка представить библиотеку с высоты птичьего полета и сосредоточиться на основных частях построения глубоких нейронных сетей.
В этой статье основное внимание уделяется объяснению TensorFlow для начинающих, а не обучению машинному обучению.
Ниже приведены предварительные условия или предположения:
- У вас есть практические знания в области машинного обучения
- Вы знакомы с интуитивным пониманием построения нейронных сетей.
Обзор:
Я буду рассматривать следующие 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. Определение функции
Это используется, чтобы сообщить 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 ()
Следующий раздел:
- Создание собственных оценщиков с использованием TensorFlow
- Как отлаживать код TensorFlow
- Нейронная сеть с использованием API низкого уровня TensorFlow