Приступаем к выполнению графа
В этом документе объясняется, как использовать машинное обучение для классификации набора данных цветов ириса, подробно рассматривается исходный код TensorFlow и объясняются основы машинного обучения.
Если вы соответствуете следующим трем условиям, продолжайте чтение:
- Более или менее слышал о машинном обучении
- Хотите научиться писать программы TensorFlow
- Может программировать на Python
Если вы хотите много узнать об основах машинного обучения, рекомендуется изучитьУскоренный курс по машинному обучению.
Проблема классификации ирисов
Предположим, вы ботаник и хотите автоматически классифицировать ирисы. Машинное обучение предлагает множество алгоритмов классификации. Например, хорошие алгоритмы классификации классифицируют цветы посредством распознавания изображений. И мы не хотим останавливаться на достигнутом, мы хотим классифицировать цветы, зная только длину и ширину лепестков и чашелистиков.
Эксперты по ирисам могут идентифицировать более 300 видов цветов, но наша программа в настоящее время классифицирует их по следующим трем:
- класс сетоса
- виргинский класс
- класс лишай
слева направо,Iris setosa (by Radomil, CC BY-SA 3.0),Iris versicolor (by Dlanglois, CC BY-SA 3.0) иIris virginica (by Frank Mayfield, СС BY-SA 2.0).
мы нашлиНабор данных ириса, содержит 120 данных с измерениями чашечек и лепестков. Этот набор данных очень типичен и является хорошим вводным материалом для задач классификации машинного обучения. (Набор данных MNIST, содержит большое количество рукописных цифр, а также является типичными общими данными для задач классификации).
Первые 5 строк набора данных Iris следующие:
длина чашечки | ширина чашечки | длина лепестка | ширина лепестка | разновидность |
---|---|---|---|---|
6.4 | 2.8 | 5.6 | 2.2 | 2 |
5.0 | 2.3 | 3.3 | 1.0 | 1 |
4.9 | 2.5 | 4.5 | 1.7 | 2 |
4.9 | 3.1 | 1.5 | 0.1 | 0 |
5.7 | 3.8 | 1.7 | 0.3 | 0 |
Сначала введем терминологию:
-
Последний столбец (виды) называетсяотметка(метка); первые четыре столбца называютсяособенность(особенность).особенностьиспользуется для описания выборочных данных,отметкаиспользуется для последующих прогнозов.
-
Одинобразец(пример) Набор, содержащий все функции и метки образцов. В приведенной выше таблице 5 образцов данных взяты из набора данных, состоящего из 120 элементов данных.
Каждый токен представляет собой строку (например, «setosa»), но поскольку в машинном обучении часто используются числа, мы сопоставляем каждой строке число, и соответствующая парадигма выглядит следующим образом:
- 0 соответствует сетозе
- 1 для лишай
- 2 для вирджиники
Дополнительные этикетки и образцы образцов см.Раздел «Терминология машинного обучения» ускоренного курса по машинному обучению.
обучение модели
Модель(модель) можно рассматривать как взаимосвязь между признаками и маркерами. В задаче об ирисе модель определяет взаимосвязь между размерами лепестков чашечки и видом цветка. Иногда простую модель можно описать всего несколькими строками алгебраических обозначений, в то время как некоторые сложные модели содержат множество математических обозначений и сложных взаимосвязей переменных, которые трудно выразить численно.
Теперь возникает вопрос: четыре признака, один маркер рода, можно ли определить отношения между ними без использования машинного обучения? Другими словами, можете ли вы использовать традиционные языки программирования (например, множество условных операторов, таких как if/else) для создания моделей? Есть такая возможность. Если у вас есть много времени для изучения набора данных, вы, возможно, в конечном итоге найдете взаимосвязь между лепестками чашечки и видами цветка. Однако хороший алгоритм машинного обучения может предсказать модель за вас. Пока у вас есть достаточное количество репрезентативных данных и вы применяете соответствующую модель, окончательная программа поможет вам точно определить взаимосвязь между видами цветка и лепестками чашечки.
тренироваться(обучение) — этап контролируемого машинного обучения, представляющий собой процесс постепенной оптимизации (самообучения) модели.
Проблема с радужкойконтролируемое обучениеТипичный пример этого типа модели обучается на помеченных выборочных данных.
Также есть класс машинного обучения:неконтролируемое обучение. Такие образцы моделей не имеют маркировки, и модель ищет закономерности только через функции. )
Подготовка перед запуском примера программы
Перед запуском примера программы установите TensorFlow:
- Установить ТензорФлоу
- Если вы установили TensorFlow с помощью virtualenv или Anaconda, инициализируйте среду TensorFlow.
-
Установить/обновить панды:
pip install pandas
Выполните следующие шаги, чтобы найти образец программы:
-
Чтобы клонировать удаленный репозиторий модели TensorFlow из github в локальный, команда выглядит следующим образом:
`git clone https://github.com/tensorflow/models`
-
В этой ветке перейдите в каталог, содержащий пример кода для этой статьи:
`cd models/samples/core/get_started/`
существуетget_started
В каталоге файлов найдите файл с именемpremade_estimator.py
файл питона.
Запустите пример программы
Запустите программу TensorFlow, как программу Python. Введите следующую команду в командной строке для запускаpremade_estimators.py
:
python premade_estimator.py
После запуска программы будет выведено много информации, а последние 3 строки — это результаты предсказания, а именно:
...
Prediction is "Setosa" (99.6%), expected "Setosa"
Prediction is "Versicolor" (99.8%), expected "Versicolor"
Prediction is "Virginica" (97.9%), expected "Virginica"
Если программа сообщает об ошибке, результаты прогнозирования не генерируются. Ознакомьтесь со следующими вопросами:
- Вы успешно установили TensorFlow?
- Вы используете правильную версию TensorFlow? программа
premade_estimators.py
Требуется номер версии не ниже TensorFlow v1.4. - Если вы установили TensorFlow через virtualenv или Anaconda, инициализировали ли вы среду?
Стек технологий TensorFlow
Как показано на рисунке ниже, стек технологий TensorFlow предоставляет несколько уровней API.
Среда программирования TensorFlow
Приступая к написанию программ TensorFlow, мы настоятельно рекомендуем вам использовать следующие два высокоуровневых API:
- Estimators
- Datasets
Хотя иногда нам приходится использовать другие низкоуровневые API, в этом документе в основном рассматриваются эти два типа API.
код
Читатели, у которых хватит терпения заглянуть сюда, заходите, давайте продолжим копаться в коде поглубже. Подобно большинству программ TensorFlow, следующее:premade_estimator.py
Обычные шаги программы:
- Введите набор данных и проанализируйте его.
- Создайте столбцы функций для описания данных
- Выберите модель
- Обучите модель
- Модель оценки
- Используйте обученную модель, чтобы делать прогнозы.
Следующие подразделы расширяют объяснение.
Введите набор данных и проанализируйте его.
Проблема с радужной оболочкой требует введения данных из следующих двух CSV-файлов:
- обучающий набор данных
http://download.tensorflow.org/data/iris_training.csv
- тестовый набор данных
http://download.tensorflow.org/data/iris_test.csv
обучающий набор данныхСодержит образцы, используемые для обучения модели.тестовый набор данныхСодержит образцы, используемые для оценки модели.
Наборы данных для обучения и тестирования изначально находятся в одном наборе данных, а затем обрабатывается набор данных выборки: большая его часть используется в качестве данных для обучения, а остальные — в качестве тестовых данных. Увеличение количества выборок в обучающем наборе обычно приводит к улучшению модели, а увеличение количества выборок в тестовом наборе позволяет лучше оценить модель.
premade_estimators.py
программа прошлаload_data
Функция считывает соседний путьiris_data.py
файл и анализируется в обучающие и тестовые наборы.
Код выглядит следующим образом (с подробными комментариями)
# 定义数据 csv 文件地址
TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"
CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth',
'PetalLength', 'PetalWidth', 'Species']
...
def load_data(label_name='Species'):
"""Parses the csv file in TRAIN_URL and TEST_URL."""
# 新建路径本地训练集文件
train_path = tf.keras.utils.get_file(fname=TRAIN_URL.split('/')[-1],
origin=TRAIN_URL)
# 训练集路径为: ~/.keras/datasets/iris_training.csv
# 解析本地 CSV 文件
train = pd.read_csv(filepath_or_buffer=train_path,
names=CSV_COLUMN_NAMES, # 列
header=0 # 忽略 CSV 文件首行
)
# 定义 train 变量为 DataFrame(pandas 库中类似表的数据结构)。
# 1. 定义变量 train_label 为样本标记,DataFrame 的最右行,
# 2. 从 DataFrame 中删除最右行,
# 3. 定义 DataFrame 中的剩余行为 train_features 样本特征。
train_features, train_label = train, train.pop(label_name)
# 对测试数据集执行上述操作
test_path = tf.keras.utils.get_file(TEST_URL.split('/')[-1], TEST_URL)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
test_features, test_label = test, test.pop(label_name)
# 返回解析好的 DataFrame
return (train_features, train_label), (test_features, test_label)
Keras — это библиотека машинного обучения с открытым исходным кодом;tf.keras
является реализацией Keras в TensorFlow.premade_estimator.py
программа простоtf.keras
Вход функции , а именно:tf.keras.utils.get_file
способ упростить копирование удаленных CSV-файлов в локальную систему.
перечислитьload_data
Возвращаемое значение функции — два набора(feature,label)
Да, два набора данных соответствуют обучающему набору и тестовому набору:
# 调用 load_data() 解析 CSV 文件
(train_feature, train_label), (test_feature, test_label) = load_data()
Pandas — это библиотека Python с открытым исходным кодом, используемая в функциях TensorFlow. ПандыDataFrameЭто табличная структура данных, каждый столбец имеет заголовок столбца, а каждая строка имеет метку строки. Следующий примерtest_feature
Датафрейм.
SepalLength SepalWidth PetalLength PetalWidth
0 5.9 3.0 4.2 1.5
1 6.9 3.1 5.4 2.1
2 5.1 3.3 1.7 0.5
...
27 6.7 3.1 4.7 1.5
28 6.7 3.3 5.7 2.5
29 6.4 2.9 4.3 1.3
Описательные данные
tf.feature_column.numeric_column
# 为所有特征创建特征列
my_feature_columns = []
for key in train_x.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
Код ниже менее элегантен, но более четко кодирует описанный выше процесс.
my_feature_columns = [
tf.feature_column.numeric_column(key='SepalLength'),
tf.feature_column.numeric_column(key='SepalWidth'),
tf.feature_column.numeric_column(key='PetalLength'),
tf.feature_column.numeric_column(key='PetalWidth')
]
Выберите тип модели
Далее нам нужно выбрать тип модели для обучения. Моделей много, но чтобы найти лучшую, нужен некоторый опыт. Мы выбираем нейронную сеть для решения проблемы с радужной оболочкой.
пройти черезНейронные сетиМогут быть обнаружены сложные отношения между функциями и маркерами. Нейронная сеть представляет собой высокоструктурированный граф, состоящий из одного или несколькихскрытый слой. Каждый скрытый слой содержит один или нескольконейроны. Существуют разные категории нейронных сетей. Здесь мы используемПолностью подключенная нейронная сеть, то есть: вход нейронов в каждый слой поступает извсеНейроны. В качестве примера на рисунке ниже показана полносвязная нейронная сеть с тремя скрытыми слоями:
- Первый слой состоит из 4 нейронов.
- Второй раз есть 3 нейрона,
- Третий слой состоит из 2 нейронов.
Нейронная сеть с 3 скрытыми слоями
Для более подробного ознакомления с нейронными сетями см.Ускоренный курс «Введение в нейронные сети для машинного обучения».
Мы создаем экземплярEstimatorclass для указания типа модели. TensorFlow предоставляет два типа оценщиков:
- Предопределенные оценщики, код был написан другими.
- Пользовательский оценщик, вам нужно написать код более-менее самостоятельно.
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=[10, 10],
n_classes=3)
использоватьhidden_units
Параметры определяют количество нейронов в каждом скрытом слое. Назначьте этому параметру список. следующее:
hidden_units=[10, 10],
hidden_units
Длина списка — это количество скрытых слоев (здесь 2). Каждое значение в списке представляет количество нейронов в этом слое (здесь первый слой имеет 10 нейронов, а второй слой имеет 10 нейронов). просто изменитьhidden_units
list, вы можете отлаживать количество скрытых слоев или нейронов.
Идеальное количество слоев/нейронов определяется набором данных или самой проблемой. Как и во всем остальном в области машинного обучения, выбор формы нейронной сети требует большого количества экспериментов и больших знаний. Как правило, увеличивайте количество скрытых слоев/количество нейронов.довольно частоМожно построить более мощную модель, которая требует эффективного обучения на большем количестве данных.
Параметры задают количество возможных значений, которые предсказывает нейронная сеть. Так как в этой задаче классифицируются 3 ирисы, положимn_classes
это 3.
tf.Estimator.DNNClassifier
Конструктор имеет необязательный параметрoptimizer
оптимизатор, который здесь не объявлен в нашей программе.оптимизаторУправляет обучением модели. Чем глубже вы погружаетесь в машинное обучение, оптимизаторы искорость обучения(скорость обучения) станет важным.
Обучите модель
создавать экземплярtf.Estimator.DNNClassifier
Построена основа для моделей обучения. Теоретически мы сплели сеть, но еще не загрузили данные.
Теперь, вызывая объект оценщикаtrain
Метод обучения нейронной сети. следующее:
classifier.train(
input_fn=lambda:train_input_fn(train_feature, train_label, args.batch_size),
steps=args.train_steps)
steps
Значение параметра относится к тому, сколько итераций нужно остановить обучение модели.steps
Больший параметр означает большее время для обучения модели. Но обучение модели дольше не означает лучшую модель.args.train_steps
Значение по умолчанию 1000, количество шагов обучения настраивается.Гиперпараметры. Выбор правильного количества шагов часто требует большого опыта и практики.
input_fn
Назначение параметра — это функция для получения обучающих данных, а метод обучения вызывается черезtrain_input_fn
функция для получения обучающих данных. Вот сигнатура функции:
def train_input_fn(features, labels, batch_size):
даватьtrain_input_fn
Передайте следующие значения параметров:
-
train_feature
это словарь Python, в котором:- key — это имя примера функции,
- value — массив, содержащий все выборочные значения в тренировочном наборе
-
train_label
представляет собой массив, содержащий метки всех образцов в обучающем наборе -
args.batch_size
Тип данных целочисленный, что определяетразмер партии.
train_input_fn
функция зависит отDataset API. Это высокоуровневый TensorFlow API для чтения данных и преобразования их вtrain
Формат, требуемый методом.
Следующий вызов функции преобразует входные объекты и токены вtf.data.Dataset
Object, базовый класс для Dataset API:
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
tf.dataset
Классы предоставляют множество полезных предварительных примеров для обучения. Например, следующие три функции:
dataset = dataset.shuffle(buffer_size=1000).repeat(count=None).batch(batch_size)
Случайные обучающие выборки сделают обучение лучше. по функцииtf.data.Dataset.shuffle
рандомизировать выборку, установитьbuffer_size
Значение больше, чем размер выборки (120), чтобы обеспечить эффект перетасовки данных.
Во время обучения,train
Методы обычно обрабатывают образцы несколько раз. вызов без параметровtf.data.Dataset.repeat
сделатьtrain
Метод имеет бесконечный (имитируемый непрерывным процессом рандомизации) набор обучающих выборок.
train
метод каждый разпартияОбразцы процессов на всем протяженииtf.data.Dataset.batch
Метод объединяет несколько образцов для создания пакета. Настройка по умолчанию в нашей программеразмер партииравно 100, значитbatch
Метод объединяет группы из 100 образцов. Идеальный размер партии зависит от самой проблемы.train
методы обучают модели быстрее, но иногда за счет снижения точности.
return
возвращает пакет образцов вызывающему методу (train
метод).
return dataset.make_one_shot_iterator().get_next()
Модель оценки
оцениватьИспользуется для оценки достоверности результатов прогнозирования модели. Чтобы оценить эффективность модели классификации ирисов, мы передали модели некоторые измерения лепестков и чашечек, попросили ее предсказать виды цветка по поступающим данным, а затем сравнили предсказания модели с фактическими метками. Например, если модель может правильно предсказать половину выборочных данных, тоТочностьсоставляет 0,5. В следующем примере показана более эффективная модель:
тестовый набор | |||||
---|---|---|---|---|---|
особенность | отметка | предсказывать | |||
5.9 | 3.0 | 4.3 | 1.5 | 1 | 1 |
6.9 | 3.1 | 5.4 | 2.1 | 2 | 2 |
5.1 | 3.3 | 1.7 | 0.5 | 0 | 0 |
6.0 | 3.4 | 4.5 | 1.6 | 1 | 2 |
5.5 | 2.5 | 4.0 | 1.3 | 1 | 1 |
Модель верна на 80%.
Для оценки эффективности модели каждый оценщик предоставляетevaluate
метод.premade_estimator.py
программный вызовevaluate
следующее:
# 评估模型
eval_result = classifier.evaluate(
input_fn=lambda:eval_input_fn(test_x, test_y, args.batch_size))
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
перечислитьclassifier.evaluate
иclassifier.train
похожий. Самая большая разница в том,classifier.evaluate
Данные должны быть получены из тестового набора данных, а не из обучающего набора данных. Другими словами, чтобы объективно оценить эффективность модели, используйтеоцениватьОбразец модели и используется длятренироватьсяОбразцы должны быть разными. мы называемeval_input_fn
Функция обрабатывает партию образцов из тестового набора. следующее:
def eval_input_fn(features, labels=None, batch_size=None):
"""An input function for evaluation or prediction"""
if labels is None:
# 无标记,仅使用特征
inputs = features
else:
inputs = (features, labels)
# 转换输入为 tf.dataset 对象
dataset = tf.data.Dataset.from_tensor_slices(inputs)
# 批量处理样本
assert batch_size is not None, "batch_size must not be None"
dataset = dataset.batch(batch_size)
# 返回流程的读结尾
return dataset.make_one_shot_iterator().get_next()
Проще говоря,eval_input_fn
вызовclassifier.evaluate
Функция выполняет следующие шаги:
- Обработайте данные тестового набора, преобразуя функции и метки в
tf.dataset
объект. - Создайте партию образцов тестового набора (образцы тестового набора не нужно перемешивать или повторно рандомизировать).
- Верните образцы тестового набора в
classifier.evaluate
.
Выполнение кода приводит к выводу, подобному следующему:
Test set accuracy: 0.967
Точность 0,967 означает, что наша обученная модель правильно классифицировала 29 из 30 образцов радужной оболочки в тестовом наборе.
Для более подробного ознакомления с различными показателями оценки моделей см.Раздел «Классификация» ускоренного курса по машинному обучению.
предсказывать
Теперь мы обучили модель и «доказали», что она хороша, хотя и не идеальна, для задачи классификации радужной оболочки. Теперь используем обученную модель вНемаркированные образцы(без маркировки образцов только признаками) для прогнозирования;
В реальной жизни неразмеченные образцы поступают из разных источников: в приложениях, CSV-файлах, потоках данных и т. д. А пока давайте для простоты сделаем следующие немаркированные образцы:
predict_x = {
'SepalLength': [5.1, 5.9, 6.9],
'SepalWidth': [3.3, 3.0, 3.1],
'PetalLength': [1.7, 4.2, 5.4],
'PetalWidth': [0.5, 1.5, 2.1],
}
Каждый оценщик предоставляет одинpredict
метод,premade_estimator.py
Назовите это так:
predictions = classifier.predict(
input_fn=lambda:eval_input_fn(predict_x,
labels=None,
batch_size=args.batch_size))
такой жеevaluate
так же,predict
метод переданeval_input_fn
Соберите образцы.
При прогнозировании мыНетпередать тегeval_input_fn
, вместо этого выполните следующие действия:
- Преобразуйте 3-элементные функции набора данных, которые мы только что создали.
- Создайте партию из 3 образцов из набора данных прямо сейчас.
- Возвращает партию образцов в
classifier.predict
.
predict
Метод возвращает итерируемый объект Python, который выводит результаты прогнозирования для каждой выборки в структуре словаря. Словарь содержит несколько пар ключ-значение.probabilities
Значение представляет собой список из 3 значений с плавающей запятой, каждое из которых представляет вероятность того, что входной образец представляет собой этот вид ириса. Например, следующееprobabilities
Список:
'probabilities': array([ 1.19127117e-08, 3.97069454e-02, 9.60292995e-01])
Список показывает:
- Вероятность того, что этот образец радужной оболочки принадлежит сетозе, ничтожно мала.
- Вероятность принадлежности к классу Versicolor составляет 3,97%.
- Существует вероятность 96,0% быть классом Вирджиния.
class_ids
Значение представляет собой массив только с одним элементом, указывающим, какой тип выборки, скорее всего, будет:
'class_ids': array([2])
первое2
Класс соответствует классу Iris сорта Вирджиния. Следующий код повторяется по всемуpredictions
и для каждогоpredictions
Создать отчет:
for pred_dict, expec in zip(predictions, expected):
template = ('\nPrediction is "{}" ({:.1f}%), expected "{}"')
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print(template.format(iris_data.SPECIES[class_id], 100 * probability, expec))
Вывод программы следующий:
...
Prediction is "Setosa" (99.6%), expected "Setosa"
Prediction is "Versicolor" (99.8%), expected "Versicolor"
Prediction is "Virginica" (97.9%), expected "Virginica"
резюме
Этот документ представляет собой краткое введение в машинное обучение.
так какpremade_estimators.py
Большая часть сложной математики в машинном обучении скрыта за счет высокоуровневых API. Если вы хотите углубиться в машинное обучение, мы рекомендуем изучитьградиентный спуск, пакеты и нейронные сети.