Начало работы с выполнением графов для TensorFlow — TensorFlow docs

Google машинное обучение искусственный интеллект TensorFlow Программа перевода самородков
Начало работы с выполнением графов для TensorFlow — TensorFlow docs

Приступаем к выполнению графа

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

Если вы соответствуете следующим трем условиям, продолжайте чтение:

  • Более или менее слышал о машинном обучении
  • Хотите научиться писать программы TensorFlow
  • Может программировать на Python

Premade Estimators

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

Проблема классификации ирисов

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

Эксперты по ирисам могут идентифицировать более 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:

  1. Установить ТензорФлоу
  2. Если вы установили TensorFlow с помощью virtualenv или Anaconda, инициализируйте среду TensorFlow.
  3. Установить/обновить панды:

    pip install pandas

Выполните следующие шаги, чтобы найти образец программы:

  1. Чтобы клонировать удаленный репозиторий модели TensorFlow из github в локальный, команда выглядит следующим образом:

    `git clone https://github.com/tensorflow/models`
    
  2. В этой ветке перейдите в каталог, содержащий пример кода для этой статьи:

    `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 предоставляет два типа оценщиков:

tf.estimator.DNNClassifier

    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_unitslist, вы можете отлаживать количество скрытых слоев или нейронов.

Идеальное количество слоев/нейронов определяется набором данных или самой проблемой. Как и во всем остальном в области машинного обучения, выбор формы нейронной сети требует большого количества экспериментов и больших знаний. Как правило, увеличивайте количество скрытых слоев/количество нейронов.довольно частоМожно построить более мощную модель, которая требует эффективного обучения на большем количестве данных.

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

  1. Обработайте данные тестового набора, преобразуя функции и метки вtf.datasetобъект.
  2. Создайте партию образцов тестового набора (образцы тестового набора не нужно перемешивать или повторно рандомизировать).
  3. Верните образцы тестового набора в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, вместо этого выполните следующие действия:

  1. Преобразуйте 3-элементные функции набора данных, которые мы только что создали.
  2. Создайте партию из 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. Если вы хотите углубиться в машинное обучение, мы рекомендуем изучитьградиентный спуск, пакеты и нейронные сети.

Столбец функций