Просмотр данных официального учебника fastai

глубокое обучение

Эта статья представляет собой скомпилированную версию официального руководства по фастаю. Если есть какие-либо ошибки, пожалуйста, поправьте меня.

Список:

  • *Просмотр данных. Этот раздел представляет собой учебное пособие для начинающих, в котором рассказывается, как быстро просмотреть данные и результаты прогнозирования модели.*
  • Ученик логического вывода: этот раздел представляет собой учебное пособие среднего уровня о том, как создать учащегося для логического вывода (модели).
  • Пользовательский класс ItemList (Custom ItemList): этот раздел представляет собой расширенное руководство, в котором рассказывается, как создать класс ItemBase и класс ItemList.
  • Внедрение глубокого обучения с минимальными затратами. В этом разделе описывается, как реализовать вывод с меньшими ресурсами графического процессора и избежать перезапуска ядра ноутбука.

Просмотр данных

Этот каталог статей:

  • Просмотр ввода и вывода
  • визуальная задача
    • проблема классификации
    • проблема с несколькими метками
    • Пример задачи регрессии
    • Пример задачи сегментации
  • текстовое задание
    • языковая модель
    • Категоризация текста
  • Табличный

Просмотр ввода и вывода

В этом руководстве мы покажем вам, как просматривать входные и выходные данные модели в визуальной задаче, текстовой задаче или приложении списка в одном API. Мы будем обрабатывать разные задачи и каждый раз использовать API блока данных в DataBunch для получения данных, посмотрите, как использовать showПакетный метод просматривает часть ввода, обучает соответствующего учащегося и использует show.Метод результатов рассматривает фактические выходные данные модели.

Примечание. Как обычно, эта страница генерируется из Блокнота, который вы можете найти в папке docs_src в ветке fasti git (https://github.com/fastai/fastai). Эти примеры предназначены для быстрой работы, поэтому мы используем частичный примерный набор данных (и используем ResNet18 в качестве базовой сети без длительного обучения). Вы можете изменить любой параметр, чтобы проводить собственные эксперименты!

визуальный

Для быстрого доступа ко всем функциям зрения внутри fastai мы используем общий оператор Import:

from fastai.vision import *

проблема классификацииДавайте используем набор данных рукописного ввода MINIST в качестве примера набора данных:

mnist = untar_data(URLs.MNIST_TINY)tfms = get_transforms(do_flip=False)

Он построен со структурой imagenet, поэтому мы используем его для загрузки наших наборов данных для обучения и проверки, затем маркируем их, преобразуем, конвертируем в ImageDataBunch и, наконец, нормализуем.

data = (ImageList.from_folder(mnist)
        .split_by_folder()          
        .label_from_folder()
        .transform(tfms, size=32)
        .databunch()
        .normalize(imagenet_stats))

Как только ваши данные правильно настроены в DataBunch, мы можем вызвать функцию data.showbatch() для просмотра (визуализации) данных.

data.show_batch()

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

data.show_batch(rows=3, figsize=(4,4))

Теперь давайте создадим объект Learner для обучения классификатора.

learn = cnn_learner(data, models.resnet18, metrics=accuracy)learn.fit_one_cycle(1,1e-2)
learn.save('mini_train')

Наша модель быстро достигла точности около 91%, давайте посмотрим, как модель работает на наборе проверочных образцов. Мы делаем это с помощью метода show_results.

learn.show_results()

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

learn.show_results(ds_type=DatasetType.Train, rows=4, figsize=(8,10))

проблема с несколькими метками

Теперь давайте продемонстрируем использование набора данных Planet, который отличается (от других наборов данных) тем, что каждое изображение может иметь несколько меток (вместо одной).

planet = untar_data(URLs.PLANET_TINY)
planet_tfms = get_transforms(flip_vert=True, max_lighting=0.1, max_zoom=1.05, max_warp=0.)

Здесь метки для каждого изображения хранятся в файле labels.csv. Нам нужно добавить префикс «поезд» и суффикс «.jpg» к имени файла и установить каждую метку так, чтобы она отделялась пробелом.

data = (ImageList.from_csv(planet, 'labels.csv', folder='train', suffix='.jpg')
        .split_by_rand_pct()
        .label_from_df(label_delim=' ')
        .transform(planet_tfms, size=128)
        .databunch()
        .normalize(imagenet_stats))

Мы можем просматривать данные через функцию data.show_batch.

data.show_batch(rows=2, figsize=(9,7))

Затем мы можем создавать объекты Learner и довольно легко проводить пробное обучение.

learn = cnn_learner(data, models.resnet18)
learn.fit_one_cycle(5,1e-2)
learn.save('mini_train')

Чтобы увидеть фактические результаты прогнозирования, нам просто нужно запустить метод Learn.show_results().

learn.show_results(rows=3, figsize=(12,15))

проблема регрессииВ следующем примере мы используем позу головы BIWI (https://data.vision.ee.ethz.ch/cvl/gfanelli/head).pose/headforest.html#db) набор данных. На изображении человека мы хотим найти центр лица. В документе fastai мы установили подмножество набора данных BIWI, содержащее 200 данных изображения, и сохранили имя файла, соответствующее координатам центра каждого изображения, в виде словаря.

biwi = untar_data(URLs.BIWI_SAMPLE)
fn2ctr = pickle.load(open(biwi/'centers.pkl', 'rb'))

Чтобы получить данные, мы используем этот словарь для маркировки наших элементов. Мы также используем PointsItemList для создания целевого типа ImagePoints (чтобы обеспечить правильное применение увеличения данных). Мы обязательно устанавливаем tfm_y=True при вызове функции преобразования.

data = (PointsItemList.from_folder(biwi)
        .split_by_rand_pct(seed=42)
        .label_from_func(lambda o:fn2ctr[o.name])
        .transform(get_transforms(), tfm_y=True, size=(120,160))
        .databunch()
        .normalize(imagenet_stats))

Далее мы можем визуализировать наши данные, используя data.show_batch().

data.show_batch(row=3, figsize=(9,6))

Мы предварительно обучаем нашу модель перед использованием функцииlearn.show_results().

learn = cnn_learner(data, models.resnet18, lin_ftrs=[100], ps=0.05)
learn.fit_one_cycle(5, 5e-2)
learn.save('mini_train')

learn.show_results(rows=3)

Разделить примерВ этом разделе мы будем использовать набор данных camvid (по крайней мере, его часть), нам нужно предсказать класс каждого пикселя в изображении данных. Каждое изображение в подпапке «images» соответствует соответствующей «метке» изображения, которая является маской сегментации изображения.

camvid = untar_data(URLs.CAMVID_TINY)
path_lbl = camvid/'labels'
path_img = camvid/'images'

Мы читаем информацию о категории и сопоставление каждого изображения с соответствующим именем маски из файла 'codes.txt'.

codes = np.loadtxt(camvid/'codes.txt', dtype=str)
get_y_fn = lambda x: path_lbl/f'{x.stem}_P{x.suffix}'

API модуля данных позволяет нам быстро получить любой контент в DataBunch, и мы можем просмотреть его через функцию show_batch.

data = (SegmentationItemList.from_folder(path_img)
        .split_by_rand_pct()
        .label_from_func(get_y_fn, classes=codes)
        .transform(get_transforms(), tfm_y=True, size=128)
        .databunch(bs=16, path=camvid)
        .normalize(imagenet_stats))
data.show_batch(rows=2, figsize=(7,5))

Далее мы обучаем сеть Unet на несколько эпох.

Примечание. Это обучение довольно нестабильно, лучшие результаты можно получить с большим количеством эпох обучения и более полным набором данных.

learn = unet_learner(data, models.resnet18)learn.fit_one_cycle(3,1e-2)learn.save('mini_train')

Общее время (00:23)

learn.show_results()

текст

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

from fastai.text import *

языковая модельСначала мы настраиваем предварительно обученную модель на подмножестве imdb.

imdb = untar_data(URLs.IMDB_SAMPLE)
data_lm = (TextList.from_csv(imdb, 'texts.csv', cols='text')
                   .split_by_rand_pct()
                   .label_for_lm()
                   .databunch())data_lm.save()

Здесь также можно использовать функцию data.show_batch(). Для языковой модели он показывает нам начало каждой текстовой последовательности в пакетном измерении (цель — угадать следующее слово).

data_lm.show_batch()

Теперь давайте определим учащегося языковой модели.Общее время: 00:25Затем мы можем просмотреть результаты. Он отобразит определенное количество слов (по умолчанию 20), за которыми следуют 20 целевых слов и предсказанных слов.

learn.show_results()

Категоризация текстаВ этом разделе представлен пример классификации текста. При использовании сохраненного кодировщика мы хотим использовать тот же словарь, что и языковая модель.

data_clas = (TextList.from_csv(imdb, 'texts.csv', cols='text', vocab=data_lm.vocab)
                   .split_from_df(col='is_valid')
                   .label_from_df(cols='label')
                   .databunch(bs=42))

Здесь начало (информация) каждого обзора (информация) и его цель (цель) отображаются функцией show_batch.

data_clas.show_batch()

Затем мы можем обучить классификатор, используя предыдущий кодировщик.

learn = text_classifier_learner(data_clas, AWD_LSTM)
learn.load_encoder('mini_train_encoder')
learn.fit_one_cycle(2, slice(1e-3,1e-2))learn.save('mini_train_clas')

Общее время: 00:25

learn.show_results()

список

В этом разделе описываются примеры приложений в данных списка. Сначала давайте импортируем все необходимые функции.

from fastai.tabular import *

Мы используем подмножество данных из набора данных для взрослых (https://archive.ics.uci.edu/ml/datasets/adult). Когда мы читаем CSV-файл, нам нужно указать коррелированные переменные, категориальные переменные, непрерывные переменные и используемый процессор.

adult = untar_data(URLs.ADULT_SAMPLE)df = pd.read_csv(adult/'adult.csv')
dep_var = 'salary'
cat_names = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'native-country']
cont_names = ['education-num', 'hours-per-week', 'age', 'capital-loss', 'fnlwgt', 'capital-gain']
procs = [FillMissing, Categorify, Normalize]

Затем мы можем использовать API блока данных, чтобы получить все до использования data.show_batch().


data = (TabularList.from_df(df, path=adult, cat_names=cat_names, cont_names=cont_names, procs=procs)
                           .split_by_idx(valid_idx=range(800,1000))
                           .label_from_df(cols=dep_var)
                           .databunch())

data.show_batch()

Здесь мы можем получить tabular_learnner после предварительного обучения.

learn = tabular_learner(data, layers=[200,100], metrics=accuracy)
learn.fit(5, 1e-2)
learn.save('mini_train')

Общее время: 00:19Мы можем использовать Learn.show_results() (чтобы увидеть результаты).

learn.show_results()

Сводная станция блога о технологиях искусственного интеллекта Panchuang: http://docs.panchuang.net/PyTorch, официальная учебная станция на китайском языке: http://pytorch.panchuang.net/OpenCV, официальный китайский документ: http://woshicver.com/