1. Пишите впереди
Недавно я изучал глубокое обучение, и каждый алгоритм глубокого обучения заставляет меня чувствовать, что он открывает новый мир.
Я не ожидал, что в первый раз, когда я участвовал в простом соревновании на kaggle, я достиг лучших результатов 5. Хотя это было только простое соревнование, этот результат также очень порадовал меня как новичка.
В настоящее время уровень распознавания моей модели составляет 99,771%, и после подъема до 52 он не может подняться. Если есть большой парень, у которого есть метод, который может улучшить уровень распознавания или даже достичь 100%, или у него есть какие-либо предложения для этой статьи, добро пожаловать в общение со мной.
Мой Weibo - это @Akou, который вау, добро пожаловать, чтобы прийти и поиграть со мной в OVO
2. Выбор модели
Здесь мы выбираем простейшую модель нейронной сети MLP.
Почему выбирают МЛП? Причин несколько:
1. Поскольку мастер сейчас очень беден, компьютер, который он использует, все еще 13-летний macbook или тот, у которого есть только установленный дисплей Мастер сверточной нейронной сети также проверил его, но компьютер немного сложно тренироваться, поэтому я сдался ╮(╯ ▽╰)╭.
2. Обучающие данные, предоставленные в kaggle, имеют точно такие же размеры, как и традиционные данные mnist. Все они представляют собой черно-белые изображения длиной и шириной 28 пикселей. Одно изображение имеет только 784 измерения. Даже если такие операции, как объединение и свертки не выполняются, параметров, которые необходимо обучать, тоже меньше 200 000.
3. Если простая нейронная сеть может решить проблему, не используйте сложную модель (конечно, сложная модель должна быть понятной и способной кодировать), ведь видеокарты сейчас такие дорогие... Забудьте об этом. ....
3. Подробное объяснение кода
Полный код проекта:это здесь
(https://github.com/hikariming/Digit_Recognizer_99.771-/blob/master/digit_kaggle.py)
1. Внедрить различные пакеты
Я не буду вдаваться в подробности на этом шаге, возможно, это введение различных пакетов, самое главное - представить keras и numpy.
# -*- coding: utf-8 -*-
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np
import csv
2. Введите обучающие данные
Определите функцию, чтобы открыть обучающий набор.Обучающие данные можно загрузить с kaggle.Форма загруженных данных (42000,784), то есть имеется 42000 обучающих данных.
def LoadTraincsvfile():
tmp=np.loadtxt('/Users/itwork/Desktop/train_set/big-mnist/train.csv',dtype=np.str,delimiter=',')
x_data=tmp[1:,1:].astype(np.float)
y_data=tmp[1:,0].astype(np.float)
return x_data,y_data
#打开从kaggle上下载下来的训练数据
x_data,y_data=LoadTraincsvfile()
3. Разверните тренировочные данные
Чтобы достичь более высокой скорости распознавания, нам нужно больше обучающих данных.Лично я считаю, что традиционный метод деформации изображения бесполезен для рукописных чисел (ведь рукописные числа не выглядят как числа после деформации и переворачивания, а обучение Пикселей данных относительно мало), поэтому я отказался от этого метода увеличения набора данных.
Здесь я напрямую ввожу стандартный набор данных mnist в обучающий набор, который содержит 600 миллионов изображений рукописных цифр 28x28.
path = './mnist.npz'
f = np.load(path)
x_train1, y_train1 = f['x_train'], f['y_train']
x_test1, y_test1 = f['x_test'], f['y_test']
f.close()
x_train1 = x_train1.reshape(60000, 784).astype('float32')
Объединяя рукописные обучающие данные на kaggle с рукописными данными mnist, получается 102 000 единиц обучающих данных, поэтому обучающие данные более чем удваиваются.
x_train=np.concatenate((x_data[0:42000,:],x_train1),axis=0)
y_train=np.concatenate((y_data[0:42000],y_train1),axis=0)
4. Создание набора тестов (незначительно), стандартизация данных
Тестовый набор здесь на самом деле бесполезен. Чтобы повысить точность, я использую все данные обучения, предоставленные kaggle, в качестве тренировочного набора. Здесь тестовый набор и тренировочный набор перекрываются.
Нормализация данных очень проста, достаточно разделить один пиксель на 255.
#构件测试集
x_test=x_data[41000:,:]
y_test=y_data[41000:]
print (x_train.shape)
print (y_train.shape)
#数据标准化
x_train /= 255
x_test /= 255
5. Установить сеть для начала обучения + настроить параметры
Начался художественный фильм, и после создания грубой модели MLP я медленно подгонял параметры.
В основном я настроил функцию потерь (после изменения функции потерь скорость распознавания резко взлетела, и я не понял, почему это произошло--), скорость обучения, количество нейронов в каждом слое
До настройки параметров и изменения функции потерь уровень распознавания этой модели составлял около 97%, можно сказать, что это сильно преувеличено.
Здесь я не использовал отсев, ап-мастер не очень любит использовать отсев, потому что я всегда чувствую, что это увеличит случайность и риск в сети и снизит скорость распознавания.
Код здесь не детализирован, просто обратитесь к официальной документации keras.
model = Sequential()
model.add(Dense(200, activation='relu', input_dim=784))
model.add(Dense(120, activation='relu'))
model.add(Dense(10, activation='softmax'))
#使用adam加速方法,beta的值是adam创始人论文的推荐值,因此就不调了
adam = keras.optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss='binary_crossentropy',
optimizer=adam,
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=50,
batch_size=256)
score = model.evaluate(x_test, y_test, batch_size=4096)
print(model.metrics_names)
print(score)
6. Делайте прогнозы по неизвестным данным и загружайте результаты на kaggle
Каждое соревнование на kaggle имеет определенные требования к формату загружаемого файла результатов, требования к формату находятся во вложении соответствующего соревнования, и вы можете скачать его для ознакомления.
Согласно требованиям конкурса Digit_Recognizer мы делаем прогнозы на тестовом наборе и выводим результаты прогнозов в виде csv-файла:
#预测部分
is_predict=1
if(is_predict):
#将测试数据标准化
tmp = np.loadtxt('/Users/itwork/Desktop/train_set/big-mnist/test.csv', dtype=np.str, delimiter=',')
x_predict = tmp[1:, :].astype(np.float)
x_predict /= 255
#进行预测
classes = model.predict_classes(x_predict)
#输出结果
resultlist = []
imgid = 1
for i in classes:
res_data = {'ImageId': imgid, 'Label': i}
resultlist.append(res_data)
imgid = imgid + 1
headers = ['ImageId', 'Label']
with open('result.csv', 'w', newline='') as f:
# 标头在这里传入,作为第一行数据
writer = csv.DictWriter(f, headers)
writer.writeheader()
for row in resultlist:
writer.writerow(row)
4. Постскриптум
1. Конкурс
Хотя цифровое распознавание является одной из самых простых задач классификации машинного обучения, очень приятно иметь возможность играть с такой высокой скоростью распознавания для таких новых людей, как я.
Формула построения функции потерь оказывает большое влияние на результаты прогнозирования.Я надеюсь, вы сможете лучше понять значение функции потерь.
Многие люди на kaggle достигли 100% узнаваемости, я действительно восхищаюсь этим и очень хочу знать, как они этого добились.
2. Последнее нытье
Из-за производительности моего компьютера я временно не могу изучать QAQ. Я предлагаю детям, которые хотят научиться глубокому обучению, купить хороший компьютер.
Большинство проблем с компьютерным зрением на kaggle, просто обучающий набор может напрямую заполнить память моего ноутбука, и компьютер зависает ╮(╯▽╰), даже если проблема с памятью решена. Если видеокарта нехорошая, даже если вы используете трансферное обучение, на обучение все равно уйдет несколько часов, а играть невозможно.
Затем я изучу связанные технологии LSTM и RNN и приму участие в конкурсе по распознаванию текста на kaggle.Заинтересованные друзья могут сформировать команду ~ Если вам не нравится моя технологическая тарелка с компьютерными картами, 2333