Основы глубокого обучения - страница 19

Шрифт
Интервал

стр.



Наша задача — определить значения W и b, которые будут наиболее эффективно и точно классифицировать входящие данные. Сеть логистической регрессии можно выразить в схеме (рис. 3.4). Для простоты мы опустили смещения и их соединения.


Рис. 3.4.Интерпретация логистической регрессии как примитивной нейросети


Легко заметить, что сеть для интерпретации логистической регрессии довольно примитивна. У нее нет скрытых слоев, а следовательно, ее способность усваивать сложные взаимоотношения ограничена. У нас есть выходная функция мягкого максимума размерности 10, поскольку у нас 10 возможных исходов для каждого входного значения. Более того, есть входной слой размера 784 — один входной нейрон для каждого пиксела изображения! Модель в целом способна корректно классифицировать наш набор данных, но еще есть куда расти. До конца этой главы и в главе 5 мы будем стараться повысить точность нашей работы. Но сначала посмотрим, как реализовать эту логистическую сеть в TensorFlow, чтобы обучить ее на нашем компьютере.

Модель логистической регрессии строится в четыре этапа:

1) inference: создается распределение вероятностей по выходным классам для мини-пакета[34];

2) loss: вычисляется значение функции потерь (в нашем случае перекрестная энтропии);

3) training: отвечает за вычисление градиентов параметров модели и ее обновление;

4) evaluate: определяется эффективность модели.

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

Каждая строка выходного тензора содержит распределение вероятностей по классам для соответствующего образца данных в мини-выборке:

def inference(x):

tf.constant_initializer(value=0)

W = tf.get_variable("W", [784, 10], initializer=init)

b = tf.get_variable("b", [10], initializer=init)

output = tf.nn.softmax(tf.matmul(x, W) + b)

return output

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

def loss(output, y):

dot_product = y * tf.log(output)

# Reduction along axis 0 collapses each column into a

# single value, whereas reduction along axis 1 collapses

# each row into a single value. In general, reduction along

# axis i collapses the ith dimension of a tensor to size 1.

xentropy = — tf.reduce_sum(dot_product, reduction_indices=1)

loss = tf.reduce_mean(xentropy)

return loss

Теперь, имея значение потерь, мы вычисляем градиенты и модифицируем наши параметры соответственно. TensorFlow облегчает процесс, обеспечивая доступ к встроенным оптимизаторам, которые выдают специальную операцию обучения. Ее можно запустить в сессии для минимизации ошибок. Отметим, что, создавая операцию обучения, мы передаем переменную, которая отражает количество обрабатываемых мини-выборок. Каждый раз, когда операция запускается, растет эта переменная, и мы можем отслеживать процесс:

def training(cost, global_step):

optimizer = tf.train.GradientDescentOptimizer(learning_rate)

train_op = optimizer.minimize(cost, global_step=global_step)

return train_op

Наконец, мы можем создать простой вычислительный подграф для оценки модели на проверочных или тестовых данных:

def evaluate(output, y):

correct_prediction = tf.equal(tf.argmax(output, 1) tf.argmax(y, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

return accuracy

На этом настройка графа в TensorFlow для модели логистической регрессии завершена.

Журналирование и обучение модели логистической регрессии

У нас есть все компоненты, можно сводить их воедино. Чтобы сохранять важную информацию в процессе обучения модели, мы записываем в журнал несколько сводок статистики. Например, мы используем команды tf.scalar_summary[35] и tf.histogram_summary[36] для записи ошибки в каждом мини-пакете, ошибки на проверочном множестве и распределения параметров. Для примера приведем скалярную сводку статистик для функции потерь:


стр.

Похожие книги