предисловие
Благодаря приведенному выше введению я в основном знакомлюсь с такими знаниями, как искусственный интеллект, и понимаю основы использования TensorFlow.Невозможно вспомнить, я могу только сказать грамотность, и я оглянусь назад, когда мне нужно будет использовать его позже;
ссылка выше
После введения базовых знаний, вообще говоря, нужно написать hello world, но для TensorFlow это не совсем вывод hello world, просто вывод hello world тоже упоминался в предыдущей статье:
import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
hello = tf.constant("Hello,TensorFlow")
#创建了图,里面放入hello,TensorFlow
sess = tf.Session()
#定义了一个会话
print(sess.run(hello))
#执行图计算
Если это просто печать, и она не имеет ничего общего с машинным обучением, что это за привет, мир машинного обучения? даРаспознавание рукописного ввода MNIST;
Введение в набор данных MNIST
MNIST — это набор данных компьютерного зрения начального уровня, который содержит различные изображения рукописных цифр:
Набор данных MNIST аннотирован, а изображения выше представляют 5, 0, 4 и 1 соответственно.
Официальный сайт набора данных MNIST:Yann LeCun's website
Цель
Обучите модель машинного обучения предсказывать числа на картинках
Загрузка данных MNIST
Ручная загрузка
Щелкните непосредственно на упомянутом выше официальном веб-сайте MNIST: http://yann.lecun.com/exdb/mnist/
Просто скачайте эти 4 содержания Я слышал, что вам нужно опрокинуть стену, поэтому вот прямая ссылка на студентов, которым нужно скачать:Ссылка: https://pan.baidu.com/s/1o9Ghq8gB6ywRuHozJBv7kg Пароль: mcab
После скачивания его не нужно распаковывать, просто поместите в директорию
автоматическая загрузка
Сначала опубликуйте адрес github: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/tutorials/mnist.
Создайте новый файл input_data.py:
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Functions for downloading and reading MNIST data."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import gzip
import os
import tempfile
import numpy
from six.moves import urllib
from six.moves import xrange # pylint: disable=redefined-builtin
import tensorflow as tf
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
При использовании создайте новый файл py, например test.py, в каталоге того же уровня, что и input_data.py, а затем выполните следующую команду, чтобы загрузить набор данных mnist, который создаст папку данных, которая будет предоставлена:
#下载用于训练和测试的mnist数据集的源码
import input_data
# 调用input_data
mnist = input_data.read_data_sets('data/', one_hot=True)
print(mnist)
После выполнения вы можете увидеть эти предложения.Хотя ошибка есть, но не обращайте на нее внимания, вы можете скачать ее нормально.
документ | содержание |
---|---|
train-images-idx3-ubyte.gz | Образы обучающего набора — 55000 обучающих изображений, 5000 проверочных изображений |
train-labels-idx1-ubyte.gz | Числовые метки, соответствующие изображениям в обучающем наборе |
t10k-images-idx3-ubyte.gz | Изображения тестового набора — 10000 изображений |
t10k-labels-idx1-ubyte.gz | Цифровая метка, соответствующая изображению тестового набора |
Загруженный набор данных разделен на две части:
Учебный набор данных из 60 000 строк и тестовый набор данных из 10 000 строк..
Вообще говоря, набор обучающих данных используется для обучения модели, набор проверочных данных может проверять правильность и переоснащение обученной модели, а тестовый набор невидим (эквивалентен черному ящику),
Но наша конечная цель — максимизировать производительность обученной модели (в данном случае точность) на тестовом наборе.
Каждый блок данных MNIST состоит из двух частей:
Изображение, содержащее написанные от руки цифры и соответствующую метку.
Как правило, этим изображениям присваивается значение «xs», а этим тегам — «ys». И обучающий набор данных, и тестовый набор данных содержат xs и ys,
Например, изображения набора обучающих данных — это mnist.train.images, а метки набора обучающих данных — mnist.train.labels.
Каждое изображение представляет собой матрицу 28*28 пикселей, которая может быть представлена двумерной целочисленной матрицей того же размера. следующее:
Разверните этот массив в вектор длиной 28x28 = 784. Неважно, как расширяется массив (порядок чисел), главное, чтобы каждое изображение расширялось одинаково.
В обучающем наборе данных MNIST mnist.train.images представляет собой тензор формы [60000, 784],
Первое измерение представляет индекс изображения,Второе измерение представляет собой индекс пикселя изображения со значением от 0 до 1..
Соответствующие метки в наборе данных MNIST — это числа от 0 до 9, которые описывают число, представленное на данном изображении.
Здесь мы используем «одноразовые векторы» для представления значения метки.
Горячий вектор имеет 0 во всех измерениях, кроме одного, который равен 1.Длина вектора - это количество значений меток. Один и только один бит в векторе 1, а остальные равны 0. Когда число представлено, соответствующее положение индекса в векторе устанавливается на 1.
Например, [0, 0, 0, 1, 0, 0, 0, 0, 0] используется для представления 3, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]. представляют 0;
Таким образом, mnist.train.labels представляет собой числовую матрицу [60000, 10];
Выше приведено описание набора данных MNIST и его представления в TensorFlow. Модель регрессии Softmax описана ниже.
Модель регрессии Softmax
Мы знаем, что каждое изображение в MNIST представляет собой число от 0 до 9. Мы хотим получить вероятность того, что данное изображение представляет каждую цифру.
Например, наша модель может сделать вывод, что изображение, содержащее цифру 9, с вероятностью 80 % представляет число 9, но вероятность того, что это число 8, составляет 15 % (поскольку и 8, и 9 имеют маленькие кружки в верхней половине). , определите, что вероятность того, что это число 6, составляет 5%, затем присвойте ему меньшую вероятность представления других чисел.
Регрессия Softmax — это простая модель, которая очень подходит для обработки распределения вероятностей объекта, который нужно классифицировать по нескольким категориям. Таким образом, эта модель обычно является последним шагом многих продвинутых моделей.
Регрессия Softmax примерно разделена на два этапа:
Step 1: add up the evidence of our input being in certain classes;
Step 2: convert that evidence into probabilities.
Чтобы получить свидетельство того, что данное изображение принадлежит к определенному классу цифр, мы вычисляем взвешенную сумму значений пикселей изображения.
Если у пикселя есть веские доказательства того, что изображение не принадлежит классу, то соответствующий вес отрицательный, тогда как если у пикселя есть убедительные доказательства того, что изображение принадлежит классу, вес положительный.
Вот интуитивно понятный пример, где синий представляет положительные значения, а красный представляет отрицательные значения (форма синей области имеет тенденцию быть числовой):
Затем мы преобразуем полученное значение доказательства в значение вероятности y с помощью функции «softmax»: Роль функции softmax здесь эквивалентна функции преобразования.Ее роль состоит в том, чтобы каким-то образом преобразовать вывод исходной линейной функции в нужное нам значение.Здесь нам нужно распределение вероятностей по десяти категориям 0-9. Определение функции softmax выглядит следующим образом:Развернув подформу в правой части уравнения, мы получим:Функция softmax здесь может получить распределение значений вероятности по категориям и гарантировать, что сумма значений вероятности по всем категориям равна 1. Следующая диаграмма поможет вам понять процесс вычисления функции softmax: Если сформулировать этот процесс, то получим:Если сформулировать этот процесс, то получим: Его также можно упростить до:
Вам стало не по себе после прочтения? Вначале это может быть понятно, но после того, как формула убрана, вы чувствуете, что это необъяснимо? Верно, это то, что вы хотите, так что вперед~
Реализовать регрессионную модель
Чтобы выполнять научные вычисления на Python, мы часто используем некоторые независимые пакеты библиотечных функций, такие как NumPy, для реализации сложных матричных вычислений. Но поскольку эффективность работы Python недостаточно высока, его часто реализуют на некоторых более эффективных языках. Однако это влечет за собой накладные расходы на преобразование языка (например, обратное преобразование в операции Python).
Tensorflow сделала некоторые оптимизации в этом отношении, что может полностью отделить поток ряд интерактивных расчетов, которые вы описываете из Python, что позволяет избежать накладных расходов языкового переключения.
Чтобы использовать TensorFlow, нам нужно сослаться на эту библиотечную функцию:
import tensorflow as tf
Используя некоторые символьные переменные для описания процесса интерактивных вычислений, создайте следующее:
x = tf.placeholder(tf.float32, [None, 784])
По описанию под функцией-заполнителем можно понимать формальный параметр, который используется для определения процесса и присвоения конкретного значения при его выполнении;
Здесь x — это не конкретное значение, а заполнитель, т. е. указанный при необходимости.
Мы вводим это значение, когда TensorFlow запускает вычисления. Мы хотим иметь возможность вводить любое количество изображений MNIST, каждое из которых сведено в 784-мерный вектор. Мы представляем эти графы двумерным тензором с плавающей запятой формы [None, 784(28*28)]. (Нет здесь означает, что первое измерение этого тензора может быть любой длины.)
Используйте Variable (переменная) для представления весов и смещений в модели, эти параметры являются переменными. следующее:
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
По описанию нули — это создание тензорного объекта со всеми параметрами 0;
Здесь и W, и b инициализируются нулевыми матрицами. Размер W равен 784 * 10, потому что нам нужно преобразовать значение 784-мерного пикселя в значение свидетельства по 10 категориям путем умножения соответствующих весов; b — это накопленное значение смещения по десяти категориям.
в настоящее время,Для реализации регрессионной модели softmax требуется только одна строка кода.:
y = tf.nn.softmax(tf.matmul(x,W) + b)
Среди них функция matmul реализует произведение x и W, где x — двумерная матрица, поэтому она помещена впереди. Видно, что реализовать регрессионную модель softmax в TensorFlow очень просто.
Обучите модель
Чтобы обучить модель, вам сначала нужно определить метрику, чтобы оценить, хороша ли эта модель.
На самом деле, в машинном обучении принято определять показатель, указывающий на то, что модель плохая, Этот показатель называется стоимостью или убытком, а затем пытаться минимизировать этот показатель. Однако оба пути одинаковы.
一个非常常见的,非常漂亮的成本函数是“交叉熵”(cross-entropy)。交叉熵产生于信息论里面的信息压缩编码技术,但是它后来演变成为从博弈论到机器学习等其他领域里的重要技术手段。 Он определяется следующим образом:
Здесь Y - прогнозируемое распределение вероятностей, а y '- это истинное распределение (этикетка изображения, представленная одним горячим вектором).
Интуитивно понятно, что выходное значение функции кросс-энтропии указывает, насколько хорошо прогнозируемое распределение вероятностей соответствует истинному распределению.
Для более глубокого понимания функции кросс-энтропии см.этот пост в блоге.
Чтобы реализовать функцию перекрестной энтропии, нам нужно сначала установить заполнитель для хранения правильного значения метки изображения,
y_ = tf.placeholder("float", [None,10])
Затем перекрестную энтропию можно рассчитать, используя −∑y′log(y):
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
Во-первых, используйте tf.log для вычисления логарифма каждого элемента y.
Затем умножьте каждый элемент y_ на соответствующий элемент tf.log(y) .
Наконец, используйте tf.reduce_sum для вычисления суммы всех элементов тензора. (Обратите внимание, что кросс-энтропия здесь — это не просто мера одной пары прогноза и истинного значения, а сумма кросс-энтропии всех 100 изображений. Эффективность прогнозирования для 100 точек данных лучше, чем производительность для единственная точка данных для описания производительности нашей модели.)
Теперь, когда мы знаем, для чего нам нужна наша модель, ее очень легко обучить с помощью TensorFlow.
Поскольку у TensorFlow есть график, описывающий ваши отдельные вычислительные единицы, он может автоматически использовать алгоритм обратного распространения, чтобы эффективно определить, как ваши переменные влияют на стоимость, которую вы хотите минимизировать.
Затем TensorFlow будет использовать алгоритм оптимизации по вашему выбору, чтобы постоянно изменять переменные для снижения стоимости.
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
Здесь для минимизации функции стоимости используется алгоритм градиентного спуска со скоростью обучения 0,01. Градиентный спуск — это простое вычисление, при котором значение переменной изменяется в направлении, уменьшающем значение функции стоимости. TensorFlow также предоставляет множество других алгоритмов оптимизации, которые можно вызвать всего одной строкой кода.
Что TensorFlow на самом деле делает здесь, так это то, что он добавляет ряд новых единиц вычислительных операций за кулисами к графу, который описывает ваши вычисления для реализации обратного распространения ошибки и градиентного спуска. Затем все, что он возвращает вам, — это одна операция, которая при запуске обучает вашу модель градиентному спуску, точной настройке ваших переменных и постоянному снижению затрат.
Перед обучением модели необходимо инициализировать все параметры:
init = tf.initialize_all_variables()
Модели можно запускать в сеансе и инициализировать:
sess = tf.Session()
sess.run(init)
Затем обучите модель, здесь цикл обучения 1000 раз:
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
В каждом цикле мы берем 100 случайных данных из обучающих данных, и эта операция называется пакетной.
Затем каждый раз, когда rain_step работает, ранее выбранные данные заполняются в установленные заполнители в качестве ввода модели.
Обучение с небольшим подмножеством случайных данных называется стохастическая тренировка - более точно стохастическая градиентная тренировка в этом случае.
В идеале мы хотели бы использовать все наши данные для каждого шага обучения, так как это даст нам лучшие результаты обучения, но очевидно, что это требует больших вычислительных ресурсов.
Следовательно, мы можем использовать разное подмножество данных для каждого обучения, что может не только снизить вычислительные затраты, но и максимизировать изучение общих характеристик набора данных.
Оценка модели
Итак, как мы оцениваем нашу модель?
Первое, что нужно сделать, это выяснить, какие метки предсказаны правильно. tf.argmax может дать значение индекса максимального значения данных тензорного объекта в определенном измерении.
Поскольку вектор метки состоит из 0 и 1, меткой категории является позиция индекса, в которой находится максимальное значение 1. Например, tf.argmax(y,1) возвращает значение метки, предсказанное моделью для любого входного значения x, а tf.argmax (y_,1) представляет правильную метку, и мы можем использовать tf.equal, чтобы проверить, соответствует ли наш прогноз истинной метке (одинаковая позиция индекса означает совпадение).
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
correct_prediction — это список логических значений, таких как [True, False, True, True].
Его можно преобразовать в [1, 0, 1, 1] с помощью функции tf.cast() для облегчения расчета точности (выше приведена точность 0,75).
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
Наконец, давайте получим точность модели на тестовом наборе,
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
Поскольку модель регрессии Softmax относительно проста, уровень точности тестового набора составляет около 91%, что не очень хорошо.
С помощью некоторых простых оптимизаций уровень точности может достигать 97%, а текущая лучшая модель имеет уровень точности 99,7%. (здесьВ наборе данных MNIST работает множество моделей).
исходный код
Полный код для распознавания рукописного ввода с использованием модели Softmax выглядит следующим образом:
Комментарии кода были улучшены, чтобы его было легче читать и понимать, а процесс обучения вывода был увеличен:
import input_data
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("data/", one_hot=True)
print("Download Done!")
# 设置权重weights和偏置biases作为优化变量,初始值设为0
weights = tf.Variable(tf.zeros([784, 10]))
biases = tf.Variable(tf.zeros([10]))
# 构建模型
x = tf.placeholder("float", [None, 784])
# 模型的预测值
y = tf.nn.softmax(tf.matmul(x, weights) + biases)
# 真实值
y_real = tf.placeholder("float", [None, 10])
# 预测值与真实值的交叉熵
cross_entropy = -tf.reduce_sum(y_real * tf.log(y))
# 使用梯度下降优化器最小化交叉熵
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# 比较预测值和真实值是否一致
correct_prediction = tf.equal(tf.argmax(y, 1), tf.arg_max(y_real, 1))
# 统计预测正确的个数,取均值得到准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
# 开始训练
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(5000):
# 每次随机选取100个数据进行训练,即所谓的随机梯度下降
batch_xs, batch_ys = mnist.train.next_batch(100)
# 正式执行train_step,用feed_dict的数据取代placeholder
sess.run(train_step, feed_dict={x: batch_xs, y_real:batch_ys})
if i % 100 == 0:
# 每训练100次后评估模型
print("Step " + str(i) +",Training Accuracy "+ str(sess.run(accuracy, feed_dict={x: mnist.test.images, y_real: mnist.test.labels})))
print("Accuarcy on Test-dataset: ", sess.run(accuracy, feed_dict={x: mnist.test.images, y_real: mnist.test.labels}))
Результат окончательного выполнения:
Если вы выполните его несколько раз, вы обнаружите, что каждый раз он разный, но в основном это 91%
Если вы увеличите количество тренировок до 10 раз, вы обнаружите, что показатель успеха составляет 98%.
Скриншот тренировочного процесса:
Что ж, привет, мир TensorFlow такой: потребовалось много времени, чтобы представить модель Softmax, особенно формулу, которую я не понимаю, но я чувствую, что математика действительно важна в машинном обучении~резюме:
В этой статье используется модель регрессии Softmax для обучения набора данных MNIST, в основном по принципу модели Softmax (не могу понять статью) и тому, как использовать эту модель в TensorFlow, и, что более важно, идеям дизайна, извлеченным из этой модели. ~
Спасибо всем~