Https://course.fast.ai/

Набор данных Planet Amazon

Этот набор данных состоит из спутниковых изображений. На изображение может быть больше одной метки.

В соревнованиях Kaggle, если вы попадаете в топ-10%, вы знаете, что делаете что-то правильно.

ctrl + / = раскомментируйте / прокомментируйте что-нибудь в блокноте Jupyter. Вы можете сделать то же самое для нескольких строк.

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

API блока данных

src = (ImageFileList.from_folder(path)
       .label_from_csv('train_v2.csv',sep=' ',folder='train-jpg', suffix='.jpg')
       .random_split_by_pct(0.2))
data = (src.datasets()
        .transform(tfms, size=128)
        .databunch().normalize(imagenet_stats))

Класс набора данных:

class Dataset(object):
    def __getitem__(self,index):
        raise NotImplementedError
    def __len__(self):
        raise NotImplementedError

Нам нужно определить эти функции для создания набора данных. getitem означает, что мы можем получить данные с помощью indexo[3], а len означает, что мы можем получить длину набора данныхlen(o) Затем нам нужно сделать мини-пакеты из наших данных. Многие люди не понимают, что графические процессоры не вычисляют быстрее, чем центральные процессоры, но графические процессоры могут вычислять больше данных за одно и то же время, и поэтому мы его используем. Если вы не используете самые большие размеры пакетов, вы тратите некоторую вычислительную мощность, которую предлагает графический процессор.

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

DataBunch связывает вместе train_dl и valid_dl, которые являются загрузчиками данных.

# Where images are
src = (ImageFileList.from_folder(path)
       # Where labels are          
      .label_from_csv('train_v2.csv',sep=' ',folder='train-jpg', suffix='.jpg')
       # Splits data into train and valid sets
      .random_split_by_pct(0.2))
       # This creates a dataset
data = (src.datasets()
       # Transforms
        .transform(tfms, size=128)
       # Normalize
        .databunch().normalize(imagenet_stats))

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

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

data.c = сколько классов будет на выходе

В классификаторах data.c = len(data.classes), потому что мы хотим иметь одно предсказание для каждого класса. Будут предсказаны классы, вероятность которых превышает пороговое значение.

Обычная accuracy функция использует arg_max, что означает, что она выберет самую высокую вероятность. Если мы хотим использовать accuracy и вводить порог, нам нужно использовать accuracy_thresh(thresh=0.2)

Поскольку мы не можем определять каждый раз порог, нам нужно каким-то образом создать нашу собственную версию точности, где порог всегда равен 0,2.

def acc_02(inp,targ): return accuracy_thresh(inp,targ,thresh=0.2)

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

acc_02 = partial(accuracy_thresh, thresh=0.2)

Подробнее о частичном

камвид

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

Джереми показал технику, при которой вы сначала тренируете модель с меньшими изображениями, а затем вы тренируете ту же модель снова с большими изображениями. Таким образом вы сможете обучать модели быстрее, и они будут лучше обобщать.

В примере camvid мы использовали архитектуру под названием U-Net вместо ConvNet.

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

Когда вы используете его в библиотеке fastai, ничего принципиально не меняется. Вы просто пишете create_unet вместо create_cnn

fit_one_cycle

Обратите внимание! При звонке fit_one_cycle(5) количество эпох не имеет значения. Скорость обучения примет ту же форму, хотя есть 1,2,3,… эпохи. Таким образом, вызов fit_one_cycle(1) два раза не даст таких же результатов, как вызов fit_one_cycle(2) один раз.
Использование такой скорости обучения разумно по следующей причине.

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

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

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

learn = Learner.create_unet(data,models.resnet34,metrics).to_fp16()

модель классификации = прогнозирование меток
регрессионная модель = прогнозирование непрерывного числа

Помните, что если ваши значения y должны измениться при преобразовании данных, добавьте tfm_y=True в метод transform. Например, у нас была поза головы, где нам нужно было предсказать, где находится центр головы. Если мы повернули изображение, важно, чтобы значение y также вращалось так, чтобы оно находилось в том же месте, в центре лица.

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

learn = create_cnn(data, models.resnet34)
learn.loss_func = MSELossFlat()

Среднеквадратичная ошибка
перекрестная энтропия

Мои заметки:
заметки к уроку 1
заметки к уроку 2
заметки к уроку 3 < br /> Примечания к уроку 4
Примечания к уроку 5
Примечания к уроку 6
Примечания к уроку 7

~ Ланкинен