手写数字识别
MNIST数据集用于评估手写数字分类问题的数据集。
- 导入数据
import tensorflow
import keras
from keras.datasets import mnist
from matplotlib import pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
#从Keras导入mnist数据集
(X_train,y_train),(X_validation,y_validation) = mnist.load_data()
#显示4张手写数字图片
#一个Figure对象可以包含多个子图,可以使用subplot()快速绘制.
#其调用形式为subplot(行号,列号,图号)
plt.subplot(221)
plt.imshow(X_train[0],cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(X_train[1],cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(X_train[2],cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[3],cmap=plt.get_cmap('gray'))
plt.show()
- 多层感知器模型
输入层(784个输入)隐藏层(784个神经元)输出层(10个神经元)
import tensorflow
import keras
from keras.datasets import mnist
from matplotlib import pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
import numpy as np
#从Keras导入MNIST数据集
(X_train,y_train),(X_validation,y_validation) = mnist.load_data()
#设定随机数种子
seed = 7
np.random.seed(seed)
#显示4张手写数字图片
plt.subplot(221)
plt.imshow(X_train[0],cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(X_train[1],cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(X_train[2],cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[3],cmap=plt.get_cmap('gray'))
plt.show()
num_pixels = X_train.shape[1]*X_train.shape[2]
print(num_pixels)
X_train = X_train.reshape(X_train.shape[0],num_pixels).astype('float32')
x_validation = X_validation.reshape(X_validation.shape[0],num_pixels).astype('float32')
#格式化数据0-1
X_train = X_train/255
X_validation = X_validation/255
#进行one-hot编码
y_train = np_utils.to_categorical(y_train)
y_validation = np_utils.to_categorical(y_validation)
num_classes = y_validation.shape[1]
print(num_classes)
#创建基准MLP模型
def create_model():
#创建模型
model = Sequential()
model.add(Dense(input_dim=num_pixels,units=num_pixels,activation='relu',kernel_initializer='normal'))
model.add(Dense(units=num_classes,kernel_initializer='normal',activation='softmax'))
#编译模型
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']
return model
model = create_model()
model.fit(batch_size=200,epochs=10,x=X_train,y=y_train)
score = model.evaluate(x=X_validation,y=y_validation)
print('MLP:%.2f%%' %(score[1]*100))
- 简单卷积神经网络
Keras提供了可以很简单地创建卷积神经网络地API。
演示如何在Keras中实现卷积神经网络,包括卷积层、池化层和全连接层。
- 第一个隐藏层是一个称为Conv2D的卷积层。该层使用5×5的感觉野,输出具有32个特征图,输入的数据具有input_shape参数所描述的特征,并采用ReLU作为激活函数。
- 定义一个采用最大值MaxPooling2D的池化层,并配置它在纵向和横向两个方向的采样因子(pool_size)为2×2,这表示图片在两个维度均变为原来的一半。
- 下一层是使用名为Dropout的正则化层,并配置为随机排除层中20%的神经元,以减少过度拟合。
- 将多维数据转换为一维数据的Flatten层。它的输出便于标准的全连接层的处理。
- 具有128个神经元的全连接层,采用ReLU作为激活函数。
- 输出层有10个神经元,在MNIST数据集的输出具有10个分类,因此采用softmax函数,输出每张图片在每个分类上的得分。
import tensorflow
import keras
from keras.datasets import mnist
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras import backend
backend.set_image_data_format('channels_first')
#设定随机数种子
seed = 7
np.random.seed(seed)
#从Keras导入MNIST数据集
(X_train,y_train),(X_validation,y_validation) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0],1,28,28).astype('float32')
X_validation = X_validation.reshape(X_validation.shape[0],1,28,28).astype('float32')
#格式化数据0-1
X_train = X_train / 255
X_validation = X_validation / 255
#进行one-hot编码
y_train = np_utils.to_categorical(y_train)
y_validation = np_utils.to_categorical(y_validation)
#创建模型
def create_model():
model = Sequential()
model.add(Conv2D(32,(5,5),input_shape=(1,28,28),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
#编译模型
model.compile(loss='categorical_crossentropy',optimizer = 'adam',metrics = ['accuracy'])
return model
model = create_model()
model.fit(X_train,y_train,epochs = 10,batch_size = 200,verbose = 2)
score = model.evaluate(X_validation,y_validation,verbose = 0)
print('CNN_Small:%.2f%%' %(score[1]*100))
复杂卷积神经网络
在卷积神经网络中可以有多个卷积层。网络拓扑结构如下:
- 卷积层:具有30个特征图,感受野大小为5×5
- 采样因子(pool_size)为2×2的池化层
- 卷积层:具有15个特征图,感受野大小为3×3
- 采样因子(pool_size)为2×2的池化层
- Dropout概率为20%的Dropout层
- Flatten层
- 具有128个神经元和ReLU激活函数的全连接层
- 具有50个神经元和ReLU激活函数的全连接层
- 输出层
只有模型层发生变化
#创建模型
def create_model():
model = Sequential()
model.add(Conv2D(32,(5,5),input_shape=(1,28,28),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(15,(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=50,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
#编译模型
model.compile(loss='categorical_crossentropy',optimizer = 'adam',metrics = ['accuracy'])
return model
从结果可以看出,识别准确度有一定程度的提升。