Резюме: в этом документе в основном рассматривается случай обучения классификации с помощью Keras и подробно представлен набор данных распознавания рукописного ввода MNIST.
Эта статья опубликована в сообществе HUAWEI CLOUD.«[Искусственный интеллект Python] 17. Keras строит классификационную нейронную сеть и анализ случаев цифрового изображения MNIST», по Истмаунт.
1. Что такое классификационное обучение
1.Classification
Задача регрессии, предсказывающая непрерывное распределение значений, таких как цена дома, скорость автомобиля, цена пиццы и т. д. Когда мы сталкиваемся с необходимостью судить, является ли изображение кошкой или собакой, мы больше не можем использовать регрессию для ее решения.В настоящее время нам нужно научиться классифицировать, чтобы классифицировать его в тот, который может распознать компьютер (кошка или собака).
Как показано на рисунке выше, вообще говоря, то, что обрабатывает компьютер, отличается от того, что обрабатывает человек: будь то звуки, изображения или слова, они могут отображаться в компьютерной нейронной сети только как число 0 или 1. Картинки, видимые нейронной сетью, на самом деле представляют собой набор чисел. Обработка чисел, наконец, генерирует еще один набор чисел, и это имеет определенное когнитивное значение. Через небольшую обработку мы можем узнать, что компьютер решил, что это изображение это кошка.. все еще собака.
КлассификацияОн относится к категории контролируемого обучения, которое является важной областью исследований в области интеллектуального анализа данных, машинного обучения и науки о данных. Модель классификации похожа на то, как люди учатся, изучая исторические данные или обучающие наборы для получения целевой функции, а затем используя целевую функцию для прогнозирования неизвестных атрибутов нового набора данных. Модель классификации в основном состоит из двух этапов:
-
тренироваться. Учитывая набор данных, каждый образец содержит набор функций и информацию о категории, а затем вызывается алгоритм классификации для обучения модели.
-
предсказывать. Используйте сгенерированную модель, чтобы сделать прогнозы классификации для нового набора данных (тестового набора) и оценить результаты его классификации.
Набор проверки обычно используется для проверки производительности изученной модели. Набор данных разделен на непересекающиеся обучающие и тестовые наборы, обучающий набор используется для построения модели классификации, а тестовый набор используется для проверки правильности классификации меток классов.
Итак, в чем разница между регрессией и классификацией?
И классификация, и регрессия относятся к обучению с учителем.Разница между ними заключается в том, что регрессия используется для прогнозирования непрерывных реальных значений, таких как заданная площадь дома, для прогнозирования цен на жилье, а возвращаемый результат — цены на жилье, а классификация используется для прогнозирования ограниченных дискретные значения Значения, такие как определение наличия у человека диабета, возвращают значение «да» или «нет». То есть ясно, к какому предопределенному целевому классу принадлежит объект.Предопределенный целевой класс является классификацией, когда это дискретное значение, и регрессией, когда это непрерывное значение.
2.MNIST
MNIST — это набор данных для распознавания рукописного ввода, который является очень классическим примером нейронной сети. Набор данных изображений MNIST содержит большое количество цифровых изображений рукописного ввода, как показано на рисунке ниже, мы можем попытаться использовать его для экспериментов по классификации.
Набор данных MNIST аннотирован, а цифры выше представляют собой числа 5, 0, 4 и 1 соответственно. Набор данных состоит из трех частей:
-
Набор обучающих данных: 55 000 образцов, mnist.train
-
Набор тестовых данных: 10 000 образцов, mnist.test
-
Набор данных проверки: 5000 образцов, mnist.validation
Обычно набор обучающих данных используется для обучения модели, а набор проверочных данных используется для проверки правильности обученной модели и ее переоснащения.Тестовый набор невидим (эквивалентен черному ящику), но наш окончательный цель состоит в том, чтобы влияние обученной модели на тестовый набор (здесь точность) было оптимальным.
Как показано на рисунке ниже, данные считываются компьютером в таком виде, например, 28*28=784 пикселя, белые места все 0, а черные места цифры, всего 55 000 картинок.
Образец данных в наборе данных MNIST состоит из двух частей: рукописного изображения и соответствующей метки. Здесь мы используем xs и ys для представления изображения и соответствующей метки соответственно. И набор обучающих данных, и набор тестовых данных имеют xs и ys. Используйте mnist.train.images и mnist.train.labels для представления данных изображения и соответствующие данные метки в наборе обучающих данных.
Как показано на рисунке ниже, он представляет собой изображение, состоящее из матрицы пикселей 2828. Если число 784 (2828) здесь помещено в нашу нейронную сеть, это размер входа x, а соответствующая матрица показано на рисунке ниже. , метка класса равна 1.
Окончательный набор обучающих данных MNIST формирует тензор с формой 55000 * 784 бит, который представляет собой многомерный массив.Первое измерение представляет собой индекс изображения, а второе измерение представляет собой индекс пикселя в изображении ( значение пикселя в тензоре находится между 0 и 0).1).
Значение y здесь на самом деле является матрицей, эта матрица имеет 10 позиций, если она равна 1, она записывает 1 в позицию 1 (2-е число) и записывает 0 в другом месте; если это 2, она находится в записи 1 в позиция 2 (3-я цифра) и 0 в других позициях. Таким образом классифицируются числа в разных позициях, например, [0,0,0,1,0,0,0,0,0,0] используется для представления числа 3, как показано на следующем рисунке. .
mnist.train.labels — это двумерный массив размером 55000*10, как показано на следующем рисунке. Он представляет 55000 точек данных, первые данные y представляют 5, вторые данные y представляют 0, третьи данные y представляют 4 и четвертые данные y представляют 1.
Зная состав набора данных MNIST и конкретное значение x и y, давайте начнем писать Keras!
2. Keras реализует классификацию MNIST
В этой статье с помощью Keras создается классификационная нейронная сеть, а затем обучается набор данных MNIST. Где X представляет изображение, 28*28, а y соответствует метке изображения.
Первым шагом является импорт пакета расширения.
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
Второй шаг — загрузка данных MNIST и их предварительная обработка.
- X_train.reshape(X_train.shape[0],-1) / 255
Нормализуйте каждый пиксель от 0-255 до диапазона 0-1.
- np_utils.to_categorical(y_train,nb_classes=10)
Вызовите up_utils, чтобы преобразовать метку класса в значение длины 10. Если число равно 3, оно будет помечено как 1 в соответствующем месте и 0 в других местах, то есть {0,0,0,1,0, 0,0, 0,0,0}.
Поскольку набор данных MNIST является примером данных Keras или TensorFlow, нам нужна только следующая строка кода для чтения набора данных. Если набор данных не существует, он будет загружен онлайн, если набор данных уже загружен, он будет вызван напрямую.
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize
# 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
Третий шаг — создание слоя нейронной сети.
Способ создания слоя нейронной сети, как описано ранее, заключается в использовании add() для добавления слоя нейронной сети после определения.
-
model = Sequential()
-
model.add(Dense(output_dim=1,input_dim=1))
Вот еще один способ добавить нейронные слои через список, когда Sequential() определен. При этом следует отметить, что здесь добавлена функция возбуждения нейросети и вызывается RMSprop для ускорения нейросети.
-
from keras.layers importDense, Activation
-
from keras.optimizersimport RMSprop
Слой нейронной сети:
-
Первый слой — Dense(32, input_dim=784), который преобразует входящие 784 в 32 выходных.
-
Данные загружаются с помощью функции активации Activation('relu') и преобразуются в нелинейные данные.
-
Второй слой — Dense(10), который выводит 10 единиц. В то же время Keras определяет, что нейронный слой по умолчанию будет использовать свои входные данные для вывода предыдущего слоя, который равен 32 (опущено)
-
Затем загрузите функцию активации Activation('softmax') для классификации
Another way to build your neural net
модель = последовательный([ Dense(32, input_dim=784), # входное значение 784(28*28) => выходное значение 32 Activation('relu'), # Функция активации преобразована в нелинейные данные Dense(10), # вывести результат в виде 10 единиц Activation('softmax') # Функция активации вызывает softmax для классификации ])
Another way to define your optimizer
rmsprop = RMSprop(lr=0,001, rho=0,9, эпсилон=1e-08, затухание=0,0) # скорость обучения lr
We add metrics to get more results you want to see
активировать нейронную сеть
модель.компилировать( оптимизатор = rmsprop, # ускорим нейросеть loss = 'categorical_crossentropy', # функция потерь metrics = ['accuracy'], # Расчет ошибки или точности )
Четвертый шаг — обучение и прогнозирование нейронной сети.
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test)
print("loss:", loss)
print("accuracy:", accuracy)
Полный код:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
#---------------------------载入数据及预处理---------------------------
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize
# 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
#---------------------------创建神经网络层---------------------------
# Another way to build your neural net
model = Sequential([
Dense(32, input_dim=784), # 输入值784(28*28) => 输出值32
Activation('relu'), # 激励函数 转换成非线性数据
Dense(10), # 输出为10个单位的结果
Activation('softmax') # 激励函数 调用softmax进行分类
])
# Another way to define your optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #学习率lr
# We add metrics to get more results you want to see
# 激活神经网络
model.compile(
optimizer = rmsprop, # 加速神经网络
loss = 'categorical_crossentropy', # 损失函数
metrics = ['accuracy'], # 计算误差或准确率
)
#------------------------------训练及预测------------------------------
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test)
print("loss:", loss)
print("accuracy:", accuracy)
Запуск кода сначала загрузит набор данных MNIT.
Using TensorFlow backend.
Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 18s 2us/step
Затем выведите результаты двух тренировок, вы видите, что ошибка уменьшается, а правильный показатель увеличивается. Потеря ошибки окончательного вывода теста составляет «0,185575», а правильная скорость — «0,94690».
Если читатель хочет видеть график нашей числовой классификации более интуитивно, функция может быть определена и отображена.
Полный код на данный момент выглядит так:
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 16:43:21 2020
@author: Eastmount CSDN YXZ
O(∩_∩)O Wuhan Fighting!!!
"""
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
import matplotlib.pyplot as plt
from PIL import Image
#---------------------------载入数据及预处理---------------------------
# 下载MNIST数据
# X shape(60000, 28*28) y shape(10000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#------------------------------显示图片------------------------------
def show_mnist(train_image, train_labels):
n = 6
m = 6
fig = plt.figure()
for i in range(n):
for j in range(m):
plt.subplot(n,m,i*n+j+1)
index = i * n + j #当前图片的标号
img_array = train_image[index]
img = Image.fromarray(img_array)
plt.title(train_labels[index])
plt.imshow(img, cmap='Greys')
plt.show()
show_mnist(X_train, y_train)
# 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255 # normalize
X_test = X_test.reshape(X_test.shape[0], -1) / 255 # normalize
# 将类向量转化为类矩阵 数字 5 转换为 0 0 0 0 0 1 0 0 0 0 矩阵
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
#---------------------------创建神经网络层---------------------------
# Another way to build your neural net
model = Sequential([
Dense(32, input_dim=784), # 输入值784(28*28) => 输出值32
Activation('relu'), # 激励函数 转换成非线性数据
Dense(10), # 输出为10个单位的结果
Activation('softmax') # 激励函数 调用softmax进行分类
])
# Another way to define your optimizer
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) #学习率lr
# We add metrics to get more results you want to see
# 激活神经网络
model.compile(
optimizer = rmsprop, # 加速神经网络
loss = 'categorical_crossentropy', # 损失函数
metrics = ['accuracy'], # 计算误差或准确率
)
#------------------------------训练及预测------------------------------
print("Training")
model.fit(X_train, y_train, nb_epoch=2, batch_size=32) # 训练次数及每批训练大小
print("Testing")
loss, accuracy = model.evaluate(X_test, y_test)
print("loss:", loss)
print("accuracy:", accuracy)
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~