Это руководство для современного классификатора изображений в наборе данных 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%. Я постараюсь включить их в свое ядро.