Keras入门程序——mnist数字识别

Keras 是用python语言编写的高级神经网络 API ,使用keras 可以快速的构建你想要的神经网络模型。既然入门,自然选取 mnist 例程了。关于 keras的相关信息,请参考 keras 的中文文档https://keras.io/zh/。mnist 例程也被开源到了GitHub,链接https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py。我们只是在这里将这个例程复现,其中将网络结构进行了简单的修改。

下面是代码,重要的地方我会进行解释。但是建议初学者先浏览一下 官方中文文档。代码可以直接复制运行,但需要将数据集的路径进行修改,或者直接使用

(x_train, y_train), (x_test, y_test) = mnist.load_data()
import keras
#keras 有两种网络结构,Sequential 顺序模型以及Model式模型
#顺序模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉。
from keras import Sequential
from keras.datasets import mnist
#Dense用于构建全连接神经网络,Dropout防止过拟合,Flatten用于压缩网络
from keras.layers import Dense, Dropout, Flatten
#Conv2D用于创建卷积层, Maxpool2D用于创建池化层
from keras.layers import Conv2D, MaxPool2D
#用于判断是channel_fisr还是channel_last
from keras import backend as K


batch_size = 128
num_classes = 10
#迭代次数,官网说原网络可以达到99.25%,但我只达到了99.1%,不过更改网络结构后可以达到99.43%
epochs = 12
#图片的尺寸
img_rows, img_cols = 28, 28
#加载mnist数据集,我是已经下载了,然后加载数据集,如果没有下载数据集,那么可以使用下面的命令
# #(x_train, y_train), (x_test, y_test) = mnist.load_data()  数据集会被保存在c:\user\.keras下面
(x_train, y_train), (x_test, y_test) = mnist.load_data(path='E:\\Exercise\\Keras_Exercise\\one\\mnist\\datasets\\mnist.npz')

"""
tensorflow的数据格式是(batch_size, img_rows, img_cols, channels)即channels_last
但在Theano上是(batch_size, channels,img_rows, img_cols)即channels_fist
为了在上述两个框架下通用,我们需要判断我们的数据集是否为channels_last,并将其进行相应的转化
"""

if K.image_data_format() == "channels_first":
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    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_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

#标签进行独热编码,即数字 1 的标签(0,1,0,0,0,0,0,0,0,0)
#数字 3 的标签(0,0,0,1,0,0,0,0,0,0)
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

#选用顺序模型
model = Sequential()
#卷积层 conv1
model.add(Conv2D(filters=32, kernel_size=(3, 3),
                 padding='same',
                 activation='relu',
                 input_shape=input_shape))
#卷积层 conv2
model.add(Conv2D(filters=64, kernel_size=(3, 3),
                 padding='same',
                 activation='relu'))
#池化层 pool3
model.add(MaxPool2D(pool_size=(2, 2)))
#卷积层 conv4 ,这一层是我自己加的
model.add(Conv2D(128, kernel_size=(3, 3),
                 padding='same',
                 activation='relu'))
#池化层 pool5,这一层是我加的
model.add(MaxPool2D(pool_size=(2, 2)))
#正则化防止过拟合
model.add(Dropout(0.25))
#将上面的网络维度压缩为 1 维数据
model.add(Flatten())
#全连接层, 输出为 128,采用 relu函数进行激活
model.add(Dense(units=128, activation='relu'))
model.add(Dropout(0.25))
#分类层,输出为类别数目,采用softmax激活
model.add(Dense(units=num_classes, activation='softmax'))

#模型构建完后,使用compile来配置学习过程
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])
#对模型进行迭代
model.fit(x=x_train, y=y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
#评估模型性能
score = model.evaluate(x=x_test, y=y_test, verbose=0)
print('Test loss: {0}'.format(score[0]))
print('Test accuracy: {0}'.format(score[1]))

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值