Это руководство для современного классификатора изображений в наборе данных fashion-mnist с использованием библиотеки fastai. Для меня это тоже упражнение. Это также первый блог, который я когда-либо писал. Итак, в этом блоге и в моем коде будут ошибки.

Я только что закончил урок 3 Fastai Практическое глубокое обучение для кодеров, часть 1 и хотел попробовать на других наборах данных. Я просматривал наборы данных kaggle и нашел этот набор данных fashion-mnist.

Набор данных

Fashion-MNIST - это набор данных изображений статей Zalando, состоящий из обучающего набора из 60 000 примеров и тестового набора из 10 000 примеров. Каждый пример представляет собой изображение в оттенках серого 28x28, связанное с меткой из 10 классов. Мы намерены Fashion-MNIST служить прямой заменой исходного набора данных MNIST для тестирования алгоритмов машинного обучения. Он имеет одинаковый размер изображения и структуру разделов для обучения и тестирования.



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

Fastai

Библиотека fastai упрощает обучение быстрым и точным нейронным сетям с использованием передовых современных методов. Посетите сайт fastai, чтобы начать работу. Библиотека основана на исследованиях лучших практик глубокого обучения, проведенных в fast.ai, и включает готовую поддержку моделей vision, text, tabular и collab (совместная фильтрация).

Fast.ai предлагает эти курсы бесплатно прямо сейчас.

Импорт набора данных fashion-mnist

Мы собираемся импортировать набор данных fashion-mnist из ввода kaggle. Набор данных находится в формате csv. Мы собираемся выполнить необходимую предварительную обработку и разделить набор данных на наборы для обучения и проверки.

train_df = pd.read_csv('../input/fashion-mnist_train.csv')
test_df = pd.read_csv('../input/fashion-mnist_test.csv')
def split_df(df):
    '''return a tuple (X, y) 
    
        X : the training inputs which is in (samples, height, width, channel) shape
        y : the label which is flatten
    '''
    y = df['label'].values.flatten()
    X = df.drop('label', axis=1).values
    X = X.reshape(X.shape[0], 28, 28)
    return (X,y)
X_train, y_train = split_df(train_df)
X_valid, y_valid = split_df(valid_df)
X_test, y_test   = split_df(test_df)
# normalizing data 
X_train = X_train.astype('float64') / 255
X_valid = X_valid.astype('float64') / 255
X_test = X_test.astype('float64') / 255
# adding missing color channels 
X_train = np.stack((X_train,) * 3, axis=-1)
X_valid = np.stack((X_valid,) * 3, axis=-1)
X_test  = np.stack((X_valid,) * 3, axis=-1)

Мы можем легко визуализировать данные с помощью библиотеки matplotlib в блокноте jupyter.

labels =['Tshirt/top',"Trouser","Pullover","Dress","Coat","Sandal","Shirt",'Sneaker',"Bag","Ankle boot"]
index = 1
plt.imshow(X_train[index,], cmap='gray')
plt.title(labels[y_train[index]])

Наша модель

Мы собираемся использовать предварительно обученную сверточную нейронную сеть (CNN) под названием resnet34. Если вы хотите узнать больше о CNN, вы можете прочитать здесь.

Минимум строк кода для создания предварительно обученной CNN с Fastai - 3.

data = ImageClassifierData.from_arrays(PATH, trn=(X_train,y_train), val=(X_valid, y_valid), tfms=tfms_from_model(arch, 28), test=(X_test, y_test))
learn = ConvLearner.pretrained(arch, data, precompute=True, tmp_name=TMP_PATH, models_name=MODEL_PATH)
learn.fit(7e-3, 3, cycle_len=1, cycle_mult=2)

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

`epoch      trn_loss   val_loss   accuracy                    
    0      0.613051   0.531897   0.807083  
    1      0.562998   0.473142   0.8255                      
    2      0.550981   0.463921   0.827917                    
    3      0.531509   0.450046   0.834417                    
    4      0.521323   0.432002   0.838167                    
    5      0.473791   0.420071   0.846                       
    6      0.478062   0.422824   0.845
[0.4228235457738241, 0.845]

Точность теста

После ТТА мы получаем точность теста 85%.

log_preds, _ = learn.TTA(is_test=True)
prods = np.exp(log_preds)
prods = np.mean(prods, 0)
accuracy_np(prods, y_test)
0.855

Весь код находится в моем ядре kaggle, и здесь этот результат взят из минимума строк кода. Есть несколько вещей, которые мы можем сделать, чтобы повысить точность. Я не буду объяснять их здесь, потому что есть гораздо лучшие ресурсы. Если вас интересуют эти методы, ознакомьтесь с этими публикациями, а также посетите потрясающие курсы fast.ai.







Моя первая попытка, немного повозившись, дала точность более 90%. Я постараюсь включить их в свое ядро.