Keras搭建CNN(手写数字识别Mnist)

MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的。
我们使用卷积神经网络对这些手写数字进行识别,步骤大致为:

  1. 导入库和模块
    我们导入Sequential模型(相当于放积木的桌子)

    from keras.models import Sequential
    

    接下来,导入各种层(相当于形状各异的积木)

    from keras.layers import Conv2D, MaxPool2D
    from keras.layers import Dense, Flatten
    
  2. 加载数据集
    Mnist数据集可以使用keras直接加载。

    from keras.datasets import mnist
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    

    查看数据集大小

    print(X_train.shape)
    
    #(60000, 28, 28)
    

    可以看出有60000个样本,每个样本是28*28像素的。

  3. 数据预处理
    使用Keras是必须显式声明输入图像深度的尺寸。例如,具有所有3个RGB通道的全色图像的深度为3。

    我们的MNIST图像的深度为1,但我们必须明确声明。

    也就是说,我们希望将数据集从形状(n,rows,cols)转换为(n,rows,cols,channels)。

    img_x, img_y = X_train.shape[1], X_train.shape[2]
    X_train = X_train.reshape(X_train.shape[0], img_x, img_y, 1)
    X_test = X_test.reshape(X_test.shape[0], img_x, img_y, 1)
    

    除此之外,我们将数据标准化一下:

    X_train = X_train.astype('float32')
    X_test = X_test.astype('float32')
    X_train /= 255
    X_test /= 255
    
    y_train = keras.utils.to_categorical(y_train, num_classes=10)
    y_test = keras.utils.to_categorical(y_test, num_classes=10)
    
  4. 构建网络

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
    model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
    model.add(Flatten())
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    

模型图示
6. 编译
现在,只需要编译模型,就可以开始训练了。当编译模型时,我们声明了损失函数和优化器(SGD,Adam等)。
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

  1. 训练
    接下来,我们传入训练集进行训练

    model.fit(X_train, y_train, batch_size=128, epochs=10)
    
  2. 评估模型
    最后,传入测试集对模型模型进行评估

    score = model.evaluate(X_test, y_test)
    print('acc', score[1])
    
    # acc 0.9927
    

    准确率达到99%以上。

完整代码如下:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D
from keras.layers import Dense, Flatten
import keras
from keras.datasets import mnist

#加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
img_x, img_y = X_train.shape[1], X_train.shape[2]

#数据预处理
X_train = X_train.reshape(X_train.shape[0], img_x, img_y, 1)
X_test = X_test.reshape(X_test.shape[0], img_x, img_y, 1)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

y_train = keras.utils.to_categorical(y_train, num_classes=10)
y_test = keras.utils.to_categorical(y_test, num_classes=10)

#构建模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(5,5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(1000, activation='relu'))
model.add(Dense(10, activation='softmax'))

#模型编译
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

#训练
model.fit(X_train, y_train, batch_size=128, epochs=10)

#评估模型
score = model.evaluate(X_test, y_test)
print('acc', score[1])

原文地址:https://zhuanlan.zhihu.com/p/53790130
非常好一篇keras入门文章(有很多例子):https://xiaosheng.me/2017/07/04/article77/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值