TensorFlow в R

Этот блог посвящен TensorFlow в R. Мы увидим, какие функции в него включены и как с его помощью создать простую нейронную сеть.

Краткое введение в тензорный поток:

Tensorflow - это программная библиотека для программирования потоков данных. Это символьная математическая библиотека для проектов машинного обучения, таких как построение нейронных сетей. Tensor-flow был разработан командой Google Brain.

Важная терминология:

  • Тензор
  • Заполнитель
  • Переменная
  • Сессия
  • Форма
  • Типы данных

Тензор:

Тензор - это стандартный способ представления данных в тензорном потоке. Тензоры - это не что иное, как n-мерные массивы базовых типов данных. Тензор - это обобщение векторов и матриц на потенциально более высокие измерения. Вот изображение тензоров разных размеров, начиная с 1D, которое является векторным до 5D тензоров.

Заполнитель (заполнитель tf $):

Заполнитель - это то, что сохраняет значение позже. Это позволяет нам создавать операции и строить вычислительный граф, фактически не принимая никаких явных значений. В терминологии TensorFlow мы вводим данные в граф через эти заполнители. На следующем вычислительном графике тензорной доски кружки с именами «a», «b», «c», «d» и эллипсы с именами «addn» являются заполнителями.

Вот синтаксис для образца заполнителя.

x <- tf$placeholder(tf$float32, shape(NULL, 784L))

Переменная (tf $ Variable):

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

 var <- tf$Variable(tf$Zeros(shape(1,1)))

Сеанс (tf $ Session):

Сеанс - это то, что помещает операции графа на устройства, такие как процессоры или графические процессоры, и предоставляет методы для их выполнения. Объект сеанса используется для запуска созданного нами графа потока данных на ЦП. Мы должны закрыть сеанс после использования, чтобы освободить все ресурсы, используемые во время выполнения сеанса. Мы узнаем об этом больше при построении нашей модели.

sess = tf$Session()

Форма:

Форма в тензорном потоке позволяет нам определять размеры тензора, переменной или заполнителя.

Типы данных (tf $ DataType):

В тензорном потоке у нас есть много типов данных, как и в других языках программирования, таких как float, integer, boolean, string, complex, unsigned int.

Теперь приступим к работе с tenorflow:

Для этого вам необходимо установить пакет tenorflow, используя:

devtools::install_github("rstudio/tensorflow")
library(tensorflow)

После настройки библиотеки нам нужно установить все требования для запуска tensorflow. Это можно сделать, выполнив:

install_tensorflow()

Мы можем подтвердить нашу установку, выполнив следующий фрагмент кода:

Обратите внимание на объект сеанса, созданный как «sessions».

sess = tf$Session() 
hello <- tf$constant('Hello, TensorFlow!') 
sess$run(hello)

Теперь давайте выполним базовую операцию сложения, используя тензорный поток

#create a session
sess <- tf$Session()
#declaring two constants for performing addition
a <- tf$constant(3.0 , dtype = tf$float32)
b <- tf$constant(5.0 , dtype = tf$float32)
# run with session object
c <- a + b
sess$run(c)
[1] 8
# Finally close the session
sess$close()

Построение нейронной сети с набором данных MNIST:

Теперь давайте создадим модель регрессии softmax с набором данных MNIST, чтобы познакомиться с тензорным потоком. Набор данных MNIST - это набор данных, содержащий рукописные изображения цифр от 0 до 9. Подробнее об этом здесь.

# create a session
sess <- tf$Session()
# load the dataset
datasets <- tf$contrib$learn$datasets
mnist <- datasets$mnist$read_data_sets("MNIST-data",one_hot = TRUE)

Мы установили для параметра one_hot значение TRUE, чтобы преобразовать наш атрибут класса в формат быстрого кодирования. Думаю, вы знаете, что такое горячая кодировка, если нет, то можете сослаться на нее здесь.

Создание заполнителей и переменных

Давайте объявим все необходимые заполнители и переменные для нашей модели:

# NULL shows that it can be of any dimension 
x <- tf$placeholder(tf$float32, shape(NULL, 784L))
W <- tf$Variable(tf$zeros(shape(784L, 10L)))
b <- tf$Variable(tf$zeros(shape(10L)))

«X» не является конкретным значением. Это заполнитель, значение, которое мы вводим, когда просим TensorFlow выполнить вычисление. Мы хотим иметь возможность вводить любое количество изображений MNIST, каждое из которых сведено в 784-мерный вектор. Мы представляем это как двумерный тензор чисел с плавающей запятой с формой (NULL, 7784L).

Модель здания:

мы будем использовать функцию регрессии softmax для классификации нашего вывода. Для тех, кто не знаком с функцией softmax, это не что иное, как обобщение сигмовидной функции.

y = softmax (w * x + b).

вот фрагмент кода для того же

y <- tf$nn$softmax(tf$matmul(x, W) + b)

Теперь объявите заполнитель для хранения фактических выходных значений.

y_ <- tf$placeholder(tf$float32, shape(NULL, 10L))

Для определения потерь в нашей модели воспользуемся функцией кросс-энтропии:

>cross_entropy <- tf$reduce_mean (-tf$reduce_sum(y_ * tf$log(y), reduction_indices=1L))

Функция оптимизации

Наша цель - минимизировать потери, полученные на предыдущем шаге. Для этого мы используем функции оптимизатора. В этой модели воспользуемся функцией оптимизации градиентного спуска со скоростью обучения 0,5. Узнать больше о функции градиентного спуска можно здесь.

optimizer <- tf$train$GradientDescentOptimizer(0.5)
train_step <- optimizer$minimize(cross_entropy)

Нам нужно инициализировать все наши переменные с помощью объекта сеанса, прежде чем мы начнем обучение нашей модели. Global_variables_initializer () делает это за нас.

init <- tf$global_variables_initializer()
sess$run(init)

Теперь начните обучение, взяв случайную пакетную выборку размером 100 в заданный момент времени с 1000 эпох:

for (i in 1:1000) {
  batches <- mnist$train$next_batch(100L)
  batch_xs <- batches[[1]]
  batch_ys <- batches[[2]]
  sess$run(train_step,
           feed_dict = dict(x = batch_xs, y_ = batch_ys))
}

Модель обучена !!

Оценка модели:

После того, как обучение завершено, пора оценить модель. Мы используем точность как критерий оценки. Для этого у нас есть отличная функция tf $ argmax, которая возвращает индекс наибольшего значения по осям тензора.

correct_prediction <- tf$equal(tf$argmax(y, 1L), tf$argmax(y_, 1L))
accuracy <- tf$reduce_mean(tf$cast(correct_prediction, tf$float32))

tf $ argmax (y, 1L) - это метка, которая, по мнению нашей модели, наиболее вероятна для каждого ввода, а tf $ argmax (y_, 1L) - правильная метка. Он возвращает логический массив.

tf $ cast () используется для преобразования типа данных данных.

tf $ reduce_mean () используется для вычисления среднего значения.

Наконец, давайте посчитаем точность с нашими тестовыми данными.

sess$run(accuracy, feed_dict=dict(x = mnist$test$images, y_ =  mnist$test$labels))
sess$close()

Точность составляет 92%, что не очень хорошо. Это потому, что мы использовали простую регрессионную модель. Мы можем повысить точность, используя сложные нейронные сети, и повысить точность этого набора данных до 99%. Вы можете попробовать разные модели и проверить свою точность.