Недавно я наткнулся на высокоуровневый API для запуска кодов TensorFlow. Он называется TFLearn. Вы можете установить его, используя следующую строку в терминале (сначала убедитесь, что у вас установлен TensorFlow):

pip install tflearn

Лучшая часть этого API - то, что он очень удобен для тех, кто знаком с scikit-learn. Например, для обучения оценщика мы также используем метод .fit(X, y). В этом посте мы реализуем простую задачу двоичной классификации на TFLearn и проверим ее производительность. Прежде чем продолжить, убедитесь, что у вас установлен sklearn.

Импортировать набор данных

Сначала мы импортируем набор данных, который будет использоваться в задаче классификации. В нашем сценарии мы собираемся использовать Набор данных по раку молочной железы UCI, штат Висконсин, который доступен в sklearn.datasets. Вот код для импорта данных:

from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(True)

Давайте также получим некоторую исходную статистику:

In [1]: # Total number of samples and features
    ...: n_samples, n_features = X.shape
    ...:
    ...: # Number of positive classes
    ...: n_positive = sum(y)
    ...:
    ...: # Number of negative classes
    ...: n_negative = n_samples - n_positive
    ...:
    ...: # Print the results
    ...: print("Total number of samples: {}".format(n_samples))
    ...: print("Total number of features: {}".format(n_features))
    ...: print("Number of positive classes: {}".format(n_positive))
    ...: print("Number of negative classes: {}".format(n_negative))
    ...:
    ...:
Total number of samples: 569
Total number of features: 30
Number of positive classes: 357
Number of negative classes: 212

Мы можем заметить, что набор данных содержит 30 характеристик 569 человек, из которых 357 являются положительными (с диагнозом рак) и 212 отрицательными (без рака).

Тренировка / тестовый сплит

Теперь давайте разделим набор данных на подмножества для обучения и тестирования:

from sklearn.model_selection import train_test_split
from tflearn.data_utils import to_categorical
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# Convert class vector to binary class matrix
y_train = to_categorical(y_train, nb_classes=2)
y_test = to_categorical(y_test, nb_classes=2)

Хотя это задача двоичной классификации, использование одного столбца для каждого класса на практике может привести к лучшим результатам. Вот почему y_train было переопределено как to_categorical(y_train, nb_classes=2).

Определение модели классификатора NN

Теперь давайте инициализируем модель нейронной сети:

import tflearn
NUMBER_OF_FEATURES = n_features
NUMBER_OF_CLASSES = len(set(y))
# Build neural network
net = tflearn.input_data(shape=[None, NUMBER_OF_FEATURES])
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, NUMBER_OF_CLASSES, activation='softmax')
net = tflearn.regression(net)
# Create an instance of the model
model = tflearn.DNN(net)

В этом отличие от оценщиков sklearn: мы должны указать архитектуру модели. Будьте особенно внимательны, чтобы сопоставить количество объектов в первом слое tflearn.input_data и количество классов в выходной форме. В нашем примере количество функций - 30, а количество классов - 2.

Обучение классификатора

А теперь займемся обучением классификатора. Лучшая часть TFLearn заключается в том, что это можно сделать с помощью только одной строчки кода:

# Train the classifier
model.fit(X_train, y_train)

Результат выглядит примерно так:

---------------------------------
Run id: W3JV3W
Log directory: /tmp/tflearn_logs/
---------------------------------
Training samples: 381
Validation samples: 0
--
Training Step: 6  | total loss: 0.67709 | time: 0.126s
| Adam | epoch: 001 | loss: 0.67709 -- iter: 381/381
--
Training Step: 12  | total loss: 0.62926 | time: 0.013s
| Adam | epoch: 002 | loss: 0.62926 -- iter: 381/381
--
Training Step: 18  | total loss: 0.59753 | time: 0.018s
| Adam | epoch: 003 | loss: 0.59753 -- iter: 381/381
--
Training Step: 24  | total loss: 0.65958 | time: 0.012s
| Adam | epoch: 004 | loss: 0.65958 -- iter: 381/381
...

Получите точность

Наконец, давайте сообщим оценку точности модели в обучающем и тестовом наборах:

train_score = model.evaluate(X_train, y_train)
test_score = model.evaluate(X_test, y_test)
print("Training score: {:.2f}".format(train_score[0]))
print("Test score: {:.2f}".format(test_score[0]))
# OUTPUT:
# >>> Training score: 0.85
# >>> Test score: 0.89

Точность тестового набора - 89%. В отличие от оценок Sklearn, здесь мы используем метод model.evaluate вместо model.score, но он работает аналогично.

Резюме

По сути, реализовать нейронные сети с помощью этого API намного проще, чем с помощью самого TensorFlow. Вам не нужно беспокоиться о заполнителях, сеансах, переменных, константах, и, вероятно, это отличная отправная точка для тех, кто хочет начать работу с TensorFlow. Кроме того, это альтернатива Keras с точки зрения удобства использования и высокого уровня. Наконец, для тех, кто знаком со Sklearn, вот таблица некоторых методов в Sklearn и его эквиваленте в TFLearn (который будет расширен в будущем):

ПРИЛОЖЕНИЕ

Вот полный код, чтобы воспроизвести то, что было сделано в этом посте: