Tensorflow И Логистическая Регрессия

После короткой, но очень кровавой войны мне наконец удалось скомпилировать и собрать TensorFlow для GPU с возможностями CUDA=3.0. Теперь вы можете полностью погрузиться в это, ведь машинное обучение с помощью графического процессора — это быстро, легко и приятно, а без графического процессора — это порой просто огромная трата времени.

Попробуем запрограммировать простейшую логистическую регрессию.

Начнем с простого — с импорта tensorflow:

  
  
  
  
  
  
  
  
  
  
  
  
  
   

import tensorflow as tf

Далее загружаем данные:

train_X, train_Y, test_X, test_Y = load_data()

Функцию load_data, которая загружает ваши данные, вам нужно будет реализовать самостоятельно.

Структура данных предельно проста: — train_X и test_X — это массивы numpy с размерами NxF, где N — количество проанализированных экземпляров (другими словами, точек данных), а F — количество атрибутов для каждого экземпляра.

— train_Y и test_Y также являются numpy-массивами, но с размерностями NxC, где C — количество классов (в простейшем случае 2) Таким образом, если train_Y[i] содержит вектор [1 0], это означает, что i-й экземпляр принадлежит классу 0 (поскольку нулевой элемент вектора содержит 1).

Для удобства запомним важные размеры:

num_features = train_X.shape[1] num_classes = train_Y.shape[1]

Теперь определим символьные переменные для будущих вычислений:

X = tf.placeholder("float", [None, num_features]) Y = tf.placeholder("float",[None, num_classes])

Здесь мы создаем символьную переменную X типа «float» с размером «не меньше», чем num_features. Количество точек данных никак не влияет на суть расчетов, поэтому их нельзя зафиксировать в модели.

Но тогда мы сможем проводить расчеты по одной и той же модели как со 100 точками, так и с 10 миллионами.

C Y — полностью аналогичная ситуация.

Вам также необходимо создать переменные для хранения параметров модели:

W = tf.Variable(tf.zeros([num_features,num_classes])) B = tf.Variable(tf.zeros([num_classes]))

Теперь опишем модель:

pY = tf.nn.softmax(tf.matmul(X, W) + B)

В данном случае мы используем простейшую линейную модель вида y=Wx+B, завернутую в softmax. pY будет хранить результат расчета, то есть прогнозируемый Y, поэтому он также будет иметь размерность NxC. Далее мы определяем функцию потерь:

cost_fn = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pY, Y))

Можно, конечно, описать функцию потерь более явно:

cost_fn = -tf.reduce_sum(Y * tf.log(pY))

Затем создаем оптимизатор:

opt = tf.train.AdamOptimizer(0.01).

minimize(cost_fn)

Вместо Адама желающие могут использовать старый добрый градиентный спуск:

opt = tf.train.GradientDescentOptimizer(0.01).

minimize(cost_fn)

До сих пор мы только описали модель и ее параметры, но никаких расчетов еще не проводилось.

И вот, наконец, переходим к расчетам.

Сначала мы создаем сеанс и инициализируем все переменные.



sess = tf.Session() init = tf.initialize_all_variables() sess.run(init)

Теперь поехали:

num_epochs = 40 for i in range(num_epochs): sess.run(opt, feed_dict={X:train_X, Y:train_Y})

Здесь просто вызывается ранее описанный оптимизатор и передаются ему данные: символьная переменная X получает данные от train_X, а Y от train_Y. Таким образом, в модели больше нет неопределенности и все расчеты осуществимы.

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

Если данных много, то можно разбить их на блоки и изучать последовательно, то есть каждая эпоха будет включать в себя цикл по всем блокам.

Для оценки качества модели необходимо ввести критерий оценки:

accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(pY,1), tf.argmax(Y,1)), "float"))

Здесь сравнивается реальный класс и прогнозируемый класс, после чего результат сравнения преобразуется из логического типа в тип с плавающей запятой (истина — 1, ложь — 0), а затем берется среднее значение всех этих сравнений.

Обратите внимание, что предыдущая строка только определяет критерий, а не вычисляет его.

Приведенная выше формула, как и оптимизатор, зависят от символьных переменных, которые необходимо заполнить данными.

Поэтому, чтобы выполнить расчет, запустите run еще раз:

accuracy_value = sess.run(accuracy, feed_dict={X:test_X, Y:test_Y})

Однако сейчас мы используем тестовые данные, а не данные обучения.

Вот и все.

Это было совсем не сложно.

Теги: #python #TensorFlow #машинное обучение #логистическая регрессия #python #Интеллектуальный анализ данных #Большие данные #Машинное обучение #TensorFlow

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.