После короткой, но очень кровавой войны мне наконец удалось скомпилировать и собрать 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
-
Обзор Нетбука Eeepc-1005Ha
19 Oct, 24 -
Создание Небольшого Api На Deno
19 Oct, 24 -
Система Управления Проектами Agilean
19 Oct, 24 -
Новый Сотрудник Раннера
19 Oct, 24 -
Новый Релиз: Серверная Версия 3Cx Webmeeting
19 Oct, 24 -
Как Мы Делаем Спортмастер
19 Oct, 24