Изучите логистическую регрессию с помощью TensorFlow и Keras в этой статье Армандо Фанданго, изобретателя продуктов с расширенными возможностями искусственного интеллекта, используя опыт в глубоком обучении, машинном обучении, распределенных вычислениях и вычислительных методах. Он также занимал руководящие должности в качестве главного специалиста по данным и директора в стартапах и крупных предприятиях.

Эта статья покажет вам, как реализовать алгоритм классификации, известный как полиномиальная логистическая регрессия, для идентификации набора данных рукописных цифр. Вы будете использовать как ядро ​​TensorFlow, так и Keras для реализации этого алгоритма логистической регрессии.

Логистическая регрессия с TensorFlow

Один из самых популярных примеров мультиклассовой классификации - это маркировка изображений рукописных цифр. Классы или метки в этом примере: {0,1,2,3,4,5,6,7,8,9}. Набор данных, который вы будете использовать, широко известен как MNIST и доступен по следующей ссылке: http://yann.lecun.com/exdb/mnist/. Набор данных MNIST содержит 60 000 изображений для обучения и 10 000 изображений для тестирования. Изображения в наборе данных выглядят следующим образом:

1. Сначала импортируйте datasetslib, библиотеку из https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Projects:

DSLIB_HOME = '../datasetslib'
import sys
if not DSLIB_HOME in sys.path:
sys.path.append(DSLIB_HOME)
%reload_ext autoreload
%autoreload 2
import datasetslib as dslib
from datasetslib.utils import imutil
from datasetslib.utils import nputil
from datasetslib.mnist import MNIST

2. Задайте путь к папке datasets в вашем домашнем каталоге, в котором вы хотите хранить все datasets:

import os
datasets_root = os.path.join(os.path.expanduser('~'),'datasets')

3. Получите данные MNIST с помощью datasetslib и распечатайте формы, чтобы убедиться, что данные загружены правильно:

mnist=MNIST()
x_train,y_train,x_test,y_test=mnist.load_data()
mnist.y_onehot = True
mnist.x_layout = imutil.LAYOUT_NP
x_test = mnist.load_images(x_test)
y_test = nputil.onehot(y_test)
print('Loaded x and y')
print('Train: x:{}, y:{}'.format(len(x_train),y_train.shape))
print('Test: x:{}, y:{}'.format(x_test.shape,y_test.shape))

4. Определите гиперпараметры для обучения модели:

learning_rate = 0.001
n_epochs = 5
mnist.batch_size = 100

5. Определите заполнители и параметры для вашей простой модели:

# define input images
x = tf.placeholder(dtype=tf.float32, shape=[None, mnist.n_features])
# define output labels
y = tf.placeholder(dtype=tf.float32, shape=[None, mnist.n_classes])
# model parameters
w = tf.Variable(tf.zeros([mnist.n_features, mnist.n_classes]))
b = tf.Variable(tf.zeros([mnist.n_classes]))

6. Определите модель с помощью logits и y_hat:

logits = tf.add(tf.matmul(x, w), b)
y_hat = tf.nn.softmax(logits)

7. Определите функцию loss:

epsilon = tf.keras.backend.epsilon()
y_hat_clipped = tf.clip_by_value(y_hat, epsilon, 1 - epsilon)
y_hat_log = tf.log(y_hat_clipped)
cross_entropy = -tf.reduce_sum(y * y_hat_log, axis=1)
loss_f = tf.reduce_mean(cross_entropy)

8. Определите функцию optimizer:

optimizer = tf.train.GradientDescentOptimizer
optimizer_f = optimizer(learning_rate=learning_rate).minimize(loss_f)

9. Определите функцию для проверки точности обученной модели:

predictions_check = tf.equal(tf.argmax(y_hat, 1), tf.argmax(y, 1))
accuracy_f = tf.reduce_mean(tf.cast(predictions_check, tf.float32))

10. Запустите цикл training для каждой эпохи в сеансе TensorFlow:

n_batches = int(60000/mnist.batch_size)
with tf.Session() as tfs:
tf.global_variables_initializer().run()
for epoch in range(n_epochs):
mnist.reset_index()
for batch in range(n_batches):
x_batch, y_batch = mnist.next_batch()
feed_dict={x: x_batch, y: y_batch}
batch_loss,_ = tfs.run([loss_f, optimizer_f],feed_dict=feed_dict )
#print('Batch loss:{}'.format(batch_loss))

11. Запустите функцию оценки для каждой эпохи с тестовыми данными в том же сеансе TensorFlow, который был создан ранее:

feed_dict = {x: x_test, y: y_test}
accuracy_score = tfs.run(accuracy_f, feed_dict=feed_dict)
print('epoch {0:04d}  accuracy={1:.8f}'
.format(epoch, accuracy_score))

Вы получите следующий результат:

epoch 0000 accuracy=0.73280001 epoch 0001 accuracy=0.72869998 epoch 0002 accuracy=0.74550003 epoch 0003 accuracy=0.75260001 epoch 0004 accuracy=0.74299997

Вот и все. Вы только что обучили свою самую первую модель логистической регрессии с помощью TensorFlow для классификации рукописных изображений цифр и получили точность 74,3%. Теперь посмотрите, как написание той же модели в Keras делает этот процесс еще проще.

Логистическая регрессия с Керасом

Keras - это библиотека высокого уровня, доступная как часть TensorFlow. В этом разделе вы перестроите ту же модель, созданную ранее с помощью ядра TensorFlow, с Keras:

1. Keras принимает данные в другом формате, поэтому вы должны сначала переформатировать данные, используя datasetslib:

x_train_im = mnist.load_images(x_train)
x_train_im, x_test_im = x_train_im / 255.0, x_test / 255.0

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

2. Затем вы строите модель:

model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

3. Скомпилируйте модель с sgd оптимизатором. Задайте категориальную энтропию как функцию loss и точность как метрику для тестирования модели:

model.compile(optimizer='sgd',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

4. Обучите модель для 5 эпох с помощью обучающего набора изображений и меток:

model.fit(x_train_im, y_train, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 3s 45us/step - loss: 0.7874 - acc: 0.8095
Epoch 2/5
60000/60000 [==============================] - 3s 42us/step - loss: 0.4585 - acc: 0.8792
Epoch 3/5
60000/60000 [==============================] - 2s 42us/step - loss: 0.4049 - acc: 0.8909
Epoch 4/5
60000/60000 [==============================] - 3s 42us/step - loss: 0.3780 - acc: 0.8965
Epoch 5/5
60000/60000 [==============================] - 3s 42us/step - loss: 0.3610 - acc: 0.9012
10000/10000 [==============================] - 0s 24us/step

5. Оцените модель с помощью тестовых данных:

model.evaluate(x_test_im, nputil.argmax(y_test))

В результате вы получите следующие оценочные баллы:

[0.33530342621803283, 0.9097]

Вау! Используя Keras, вы можете добиться более высокой точности. Здесь вы достигли точности примерно 90%. Это связано с тем, что Keras внутренне устанавливает множество оптимальных значений, чтобы вы могли быстро приступить к созданию моделей.

Если вам эта статья показалась интересной, вы можете изучить Проекты машинного обучения TensorFlow , чтобы реализовать такие предложения TensorFlow, как TensorBoard, TensorFlow.js, TensorFlow Probability и TensorFlow Lite для создания интеллектуальных проектов автоматизации. С помощью Проекты машинного обучения TensorFlow вы не только узнаете, как создавать сложные проекты с использованием различных наборов данных, но также сможете решать общие задачи, используя ряд библиотек из экосистемы TensorFlow.