часть 1 написана впереди
В этой статье рассматриваются некоторые основы, такие как MLP и softmax, RMSprop и т. д.
1. Принцип RMSprop здесь:blog.CSDN.net/BV 10101111…
2. Многослойный персептрон выглядит так:Знайте. Baidu.com/question/16…
3. Принцип softmax здесь:Ууху. Call.com/question/23…
В этой статье для обучения и тестирования используется набор данных mnist.mnist — известный набор данных рукописных цифр, содержащий 60 000 обучающих данных и 10 000 тестовых данных. Адрес загрузки и описание набора данных находятся здесь:yann.lecun.com/exdb/mnist/
часть 2 определение цели и создание сети
Предшественники говорили, что если вы хотите решить задачу с помощью нейронной сети, лучше всего сначала попробовать простейшую модель нейронной сети.
Если простейшая нейронная сеть не решает проблему, попробуйте более сложную нейронную сеть.
Основываясь на вышеизложенном опыте, сначала используем простейшую однослойную нейронную сеть для обучения и прогнозирования:
1. Представьте набор данных
path = './mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
2. Предварительная обработка данных
Измените исходные данные (n, 28, 28) на форму (n, 784).
(28, 28) — длина и ширина изображения, n — количество данных в тренировочном или тестовом наборе.
x_train = x_train.reshape(60000, 784).astype('float32')
x_test = x_test.reshape(10000, 784).astype('float32')
#将28X28的二维数据转成 一维数据
x_train /= 255
x_test /= 255
3. Определите модель, которую мы используем
По принципу «сначала простое, потом сложное» мы сначала используем для обучения нейронную сеть с одним скрытым слоем Модель примерно такая:
Входной слой → один скрытый слой (relu) → слой softmax
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))
4. Определить функцию потерь и метод оптимизации
#确定学习率等等参数,在此我只调整了学习率,其他参数是copy API的
rms = keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
#确定损失函数,优化器
model.compile(loss='categorical_crossentropy',
optimizer=rms,
metrics=['accuracy'])
#载入训练数据,设置mini-batch的值,训练波数
model.fit(x_train, y_train,
epochs=10,
batch_size=128)
5. Проверьте точность
score = model.evaluate(x_test, y_test, batch_size=128) #查看测试值准确度
print(score)
6. Запустите, точность модели составляет около 97%
часть 2 Настройка гиперпараметров
Мы знаем, что людям трудно ошибиться при распознавании рукописных цифр, поэтому показатель точности 97% явно не является удовлетворительным, поэтому мы начали корректировать параметры.
model.add(Dense(300, activation='relu', input_dim=784))
После увеличения количества нейронов в одном скрытом слое до 300 показатель точности достиг 98%, поскольку По в основном ходил принимать ванну, он не стал дальше снижать параметры.
После того, как число нейронов увеличивается, правильная скорость увеличивается.Лично мне кажется, что предыдущая нейронная сеть имеет слишком мало нейронов и недообучается, но на самом деле, когда нейроны скрытого слоя достигают 300, хотя правильная скорость увеличилась, эта сеть В состоянии переобучения (поскольку точность распознавания обучающих данных составляет 99,9%, а точность распознавания тестовых данных всего 98%), бессмысленно увеличивать количество нейронов.
Ввиду переоснащения предыдущей модели и обращения к соответствующим статьям я уменьшил 300 нейронов в скрытом слое до 150 нейронов и добавил скрытый слой из 100 нейронов:
model.add(Dense(150, activation='relu', input_dim=784))
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax'))
После вышеуказанной модификации явление переобучения в основном исчезло, но скорость распознавания по-прежнему неудовлетворительна.Когда я чувствую, что настройка других параметров малоэффективна, я выбираю изменить тип функции потерь и заменить функцию потерь функцией потерь журнала. . . .
Ссылка на функцию потери журнала находится здесь:
https://www.zhihu.com/question/27126057
После замены функции потерь уровень распознавания вырос до 99,57%
Почему скорость распознавания значительно увеличилась после замены функции потерь? Лично я думаю, что это потому, что предыдущая функция потерь является лишь «относительным» оптимальным решением, даже если она сходится к минимальному значению.После замены функции потерь полученное значение является приближенным оптимальным решением.
резюме части 3
Нейронные сети — это очень весело, но их трудно освоить. После долгого обучения я едва могу начать. Мне нужно написать много кода и много учиться, чтобы стать лучше. Если в этой статье есть какие-либо ошибки, пожалуйста, исправьте меня. .Ведь человек написавший эту статью тоже новичок ╮(╯▽╰ )╭
Кроме того, настройка параметров похожа на алхимию, которая очень метафизична.