Автор оригинала: Pankaj Kumar.
Theano – это численная библиотека вычислений для Python. Это общий выбор для внедрения моделей нейронных сетей, поскольку он позволяет эффективно определять, оптимизировать и оценивать математические выражения, включая многомерные массивы (numpy.ndaray)
Отказ
Theano Python
Theano позволяет достичь высоких скоростей, которые дают жесткую конкуренцию для реализации ручного назначения C для проблем, связанных с большим количеством данных. Он может воспользоваться последними процессорами, который делает его лучше, чем C на процессоре значительных порядков при определенных обстоятельствах.
Theano получил удивительный компилятор, который может выполнять различные оптимизации различной сложности. Несколько таких оптимизаций:
- Арифметическое упрощение (например,
--x -> x; x + y - x -> y
) - Использование псевдонима памяти, чтобы избежать расчета
- Постоянная складка
- Объединение аналогичных подграфов, чтобы избежать избыточных расчетов
- Степление петли для элементарных подпроекций
- ГПУ вычисления
Вы можете увидеть полный список оптимизаций здесь.
Почему библиотека Theano Python?
Обычно мы манипулируем матрицами, используя Numpy Package, так что сделать Theano лучше, чем любой такой пакет!
Theano – это своего рода гибрид между Numpy и Sympy, предпринимается попытка комбинировать два в одну мощную библиотеку. Давайте посмотрим на некоторые преимущества над другими:
- Оптимизация устойчивости: Theano может узнать некоторые нестабильные выражения и могут использовать более стабильные средства для их оценки
- Оптимизация скорости исполнения: Как упоминалось ранее, Theano может использовать последние GPU и выполнять части выражений в вашем процессоре или GPU, что делает его намного быстрее, чем Python
- Символическая дифференциация: Theano достаточно умно, чтобы автоматически создавать символические графики для вычислительных градиентов
Ну, достаточно теории, давайте начнем работать над примером.
Theano Tutorial
Чтобы начать работу с Theano, установите его, используя PIP, как показано на изображении ниже.
Экспрессия теано в Callable объекты
С Theano мы можем конвертировать выражения в Callable объекты. Давайте посмотрим фрагмент кода:
import theano from theano import tensor x = tensor.dscalar() y = tensor.dscalar() z = x + y f = theano.function([x,y], z) print(f(1.5, 2.5))
Когда мы запускаем это, мы получаем следующий вывод: Теперь, давайте попробуем понять, что произошло в приведенной выше программе:
- Начнем с объявления двух символических скалелярей или переменных с плавающей точкой
- Затем мы создали простое выражение для суммы двух чисел
- После выражения мы преобразуем выражение в Callable объект, который занимает
(х, у)
в качестве ввода и возвращает значение дляz
После вычисления - Наконец, мы называем функцию с некоторыми параметрами и распечатаем результаты
Логистическая функция
Давайте посмотрим на скорее сложный пример, чем просто добавлять два числа. Давайте попробуем вычислить логистическую кривую, которая дана: если мы построим график для этого уравнения, он будет выглядеть так: логистическая функция применяется к каждому элементу матрицы. Давайте напишем фрагмент кода, чтобы продемонстрировать это:
import theano from theano import tensor # declare a variable x = tensor.dmatrix('x') # create the expression s = 1 / (1 + tensor.exp(-x)) # convert the expression into a callable object which takes # a matrix as parameter and returns s(x) logistic = theano.function([x], s) # call the function with a test matrix and print the result print(logistic([[0, 1], [-1, -2]]))
Когда мы запускаем сценарий, мы можем увидеть вывод как: все работает нормально, вывод выглядит так же, как и ожидалось. Теперь давайте приблизимся к функциям.
Ближе взглянуть на функцию Theano
Функции Theano помогают в взаимодействии с символическим графом. Они позволяют Theano построить вычислительный график и оптимизировать его.
Типичная функция Theano выглядит так:
f= theano.function([x],y)
Здесь X – список входных переменных, а Y – список выходных переменных. Давайте проверим, как эта функция имеет отличное использование.
Расчет нескольких результатов сразу
Скажем, мы должны вычислить разницу на элемен зрения, абсолютную разницу и разницу в квадрате между двумя матрицами «X» и «y». Делать это одновременно оптимизирует программу со значительной продолжительностью, поскольку нам не нужно снова и снова ходить в каждый элемент для каждой операции.
import theano from theano import tensor # declare variables x, y = tensor.dmatrices('x', 'y') # create simple expression for each operation diff = x - y abs_diff = abs(diff) diff_squared = diff**2 # convert the expression into callable object f = theano.function([x, y], [diff, abs_diff, diff_squared]) # call the function and store the result in a variable result= f([[1, 1], [1, 1]], [[0, 1], [2, 3]]) # format print for readability print('Difference: ') print(result[0]) print('Absolute Difference: ') print(result[1]) print('Squared Difference: ') print(result[2])
Когда мы запускаем эту программу, мы можем увидеть вывод как напечатанный несколько результатов:
Использование функции Theano Gradient
Давайте попробуем несколько полезных и сложных функций, поскольку мы движемся к минимальному примеру. Здесь мы постараемся выяснить производное выражения относительно параметра
Мы вычисляем градиент логистической функции, определенной выше, которая может быть нанесена как: давайте продемонстрируем работу для градиента с примером:
import numpy import theano from theano import tensor from theano import pp # declare variable x = tensor.dmatrix('x') #create a simple expression for logistic function s = tensor.sum(1 / (1 + tensor.exp(-x))) # create expression to compute gradient of s with respect to x gs = tensor.grad(s, x) # create callable object dlogistic = theano.function([x], gs) # call the function and print the results print(dlogistic([[0, 1], [-1, -2]]))
Когда мы запускаем эту программу, мы можем увидеть вывод как: Таким образом, Theano можно использовать для эффективной символической дифференциации (поскольку выражение, возвращаемое Tensor.Grad, будет оптимизировано во время компиляции), даже для функции со многими входами.
Давайте вместе поставим вещи в простой пример тренировок, чтобы понять Theano лучше!
Минимальный пример тренинга Theano
Давайте попробуем что-нибудь тренируйте, используя Theano. Мы будем использовать градиентное происхождение для обучения веса в W, чтобы мы получили лучшие результаты от модели, чем существующие (0,9):
import theano import numpy # declare variables x = theano.tensor.fvector('x') target = theano.tensor.fscalar('target') W = theano.shared(numpy.asarray([0.2, 0.7]), 'W') # create expressions y = (x * W).sum() cost = theano.tensor.sqr(target - y) gradients = theano.tensor.grad(cost, [W]) W_updated = W - (0.1 * gradients[0]) updates = [(W, W_updated)] # create a callable object from expression f = theano.function([x, target], y, updates=updates) # call the function and print results for i in range(10): result = f([1.0, 1.0], 20.0) print(result)
Когда мы запускаем эту программу, мы можем увидеть вывод как: вторая входная переменная «цель» будет действовать как целевое значение, которое мы используем для обучения:
target = theano.tensor.fscalar('target')
Нам нужна затратная функция для обучения модели, которая обычно в квадрате расстояние от целевого значения
cost = theano.tensor.sqr(target - y)
Далее нам необходимо рассчитать частичные градиенты для обновления параметров в отношении функции затрат. Как мы видели, что в предыдущем примере, Theano сделает это для нас. Мы просто называем градурную функцию с необходимыми аргументами:
gradients = theano.tensor.grad(cost, [W])
Теперь давайте определим переменную для обновленной версии параметра. Как известно, в градиентном спуске. Обновленная стоимость равен градиентом времени обучения, вычитается из существующего значения.
Предполагая, что обучение.1:
W_updated = W - (0.1 * gradients[0])
Далее мы должны снова определить функцию Theano с парой изменений:
f = theano.function([x, target], y, updates=updates)
Когда функция вызывается, она принимает значения для x и цели и возвращает значение y в качестве вывода, и Theano выполняет все обновления в списке обновлений.
Теперь мы неоднократно называем функцию, чтобы тренировать, 10 раз в этом примере, чтобы быть конкретным. Как правило, данные обучения содержат разные значения, но для этого примера мы используем одни и те же значения x = [1.0, 1.0] и каждый раз, чтобы проверить вещи правильно.
На выходе выше обратите внимание, как целевое значение движется ближе к 20 (целевое значение) на каждом шаге.
Сводка Neural Network
В этом посте мы обнаружили библиотеку Theano Python для эффективных численных вычислений.
Мы узнали, что это библиотека фундамента, используемая для глубоко изучения исследований и разработок, и что ее можно использовать непосредственно для создания моделей глубокой обучения или удобными библиотеками, построенными на его вершине, такие как Lasagne и Keras.