Keras入门例子:cnn实现手写识别

来源:互联网 发布:最优化方法第四章答案 编辑:程序博客网 时间:2024/05/23 11:43
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras import backend as K


#参数初始化

batch_size = 128

nb_classes = 10

nb_epoch = 12

np.random.seed(1337)


# 图像维度
img_rows, img_cols = 28, 28
# 卷积核个数
nb_filters = 32
# 池化层大小
pool_size = (2,2)
# 卷积核大小
kernel_size = (3,3)
# 加载keras中的mnist数据集 分为60,000个训练集,10,000个测试集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将100张RGB三通道的16*32彩色图表示为(100,16,32,3),
# 第一个维度是样本维,表示样本的数目,
# 第二和第三个维度是高和宽,
# 最后一个维度是通道维,表示颜色通道数
X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
# 将X_train, X_test的数据格式转为float32
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
# 归一化
X_train /= 255
X_test /= 255
# 将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵,
# 相当于将向量用one-hot重新编码
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
# 建立序贯模型
model = Sequential()

# 卷积层,对二维输入进行滑动窗卷积
# 当使用该层为第一层时,应提供input_shape参数,在tf模式中,通道维位于第三个位置
# border_mode:边界模式,为"valid","same"或"full",即图像外的边缘点是补0
# 还是补成相同像素,或者是补1
model.add(Convolution2D(nb_filters, kernel_size[0] ,kernel_size[1],
                        border_mode='valid',
                        input_shape=input_shape))
model.add(Activation('relu'))

# 卷积层,激活函数是ReLu
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))

# 池化层,选用Maxpooling,给定pool_size,dropout比例为0.25
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Dropout(0.25))

# Flatten层,把多维输入进行一维化,常用在卷积层到全连接层的过渡
model.add(Flatten())

# 包含128个神经元的全连接层,激活函数为ReLu,dropout比例为0.5
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))

# 包含10个神经元的输出层,激活函数为Softmax
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

# 输出模型参数信息
model.summary()
# 编译
model.compile(loss='categorical_crossentropy',
              optimizer='adadelta',
              metrics=['accuracy'])
# 开始训练
model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
          verbose=1, validation_data=(X_test, Y_test))

# 误差计算
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])

print('Test accuracy:', score[1])


原创粉丝点击