Недавно я наткнулся на высокоуровневый 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_splitfrom 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 (который будет расширен в будущем):
ПРИЛОЖЕНИЕ
Вот полный код, чтобы воспроизвести то, что было сделано в этом посте: