跟我一起学Keras之实例篇(2)
来源:互联网 发布:南京奥派软件 编辑:程序博客网 时间:2024/05/17 07:31
这次我们要执行的任务和《 基于Softmax实现手写数字识别 》中所描述的基本一致,也就是设法对MINST数据集中的手写数字图片进行识别。如果你通过阅读之前的文章已经对当前问题有所了解,那么也应该知道这其实是一个分类任务,也就是将每张图片分入0~9这个十个类别中。当然首先还是导入各种所需的package以及数据集:
import numpy as npimport randomimport kerasimport matplotlib.pyplot as plt%matplotlib inlinefrom keras.datasets import mnistfrom keras.models import Sequential, Modelfrom keras.layers.core import Dense, Dropout, Activationfrom keras.optimizers import RMSpropfrom keras.utils import np_utils(X_train, y_train), (X_test, y_test) = mnist.load_data()print(X_train.shape, y_train.shape)print(X_test.shape, y_test.shape)上述程序的输出如下:
(60000, 28, 28) (60000,)(10000, 28, 28) (10000,)其中,60000是训练数据集中图像之数量,10000是测试数据集中图像之数量,28×28是图片的大小。
接下来,要对输入的数据做一些预处理。将每个二维的图像矩阵转换成一个一维的向量,然后再将像素值做归一化,也就是从0~255的取值压缩到0~1之间。
X_train = X_train.reshape(X_train.shape[0], -1) # 等价于X_train = X_train.reshape(60000,784)X_test = X_test.reshape(X_test.shape[0], -1) # 等价于X_test = X_test.reshape(10000,784)X_train = X_train.astype("float32")X_test = X_test.astype("float32")X_train /= 255X_test /= 255
然后再对标签数据也做一些处理。下面这个函数的意思是把原来0~9这样的标签,变成长度为10的one-hot向量表示。
y_train = np_utils.to_categorical(y_train, num_classes=10)y_test = np_utils.to_categorical(y_test, num_classes=10)
接下来我们便可以开始构建NN了,回忆《跟我一起学Keras之实例篇(1) 》,第一步是定义模型:
model = Sequential()model.add(Dense(512, input_shape=(784,)))model.add(Activation('relu'))model.add(Dropout(0.2))model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.2))model.add(Dense(10))model.add(Activation('softmax'))对于已经定义好的模型,你也可以用下面的语句来展示或者总结一下:
model.summary()上述代码的输出结果如下:
model.compile(loss = 'categorical_crossentropy', optimizer = 'rmsprop', #RMSprop() metrics=['accuracy'])此外,之前也曾经讲过,你可以使用默认参数的优化器,那么你只需要传递一个字符串即可。而你也可以自定义优化器中的参数,例如:
rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)# metrics means you want to get more results during the training processmodel.compile(optimizer=rmsprop, loss='categorical_crossentropy', metrics=['accuracy'])
然后就可以进入模型训练阶段了。
history = model.fit(X_train, y_train, epochs=10, batch_size=128, verbose = 1, validation_data=[X_test, y_test])你可以看到模型的准确率已经达到了98%以上。
如果你想查看一下模型中设定的参数,可以使用:
history.params输出如下:
{'batch_size': 128, 'do_validation': True, 'epochs': 10, 'metrics': ['loss', 'acc', 'val_loss', 'val_acc'], 'samples': 60000, 'steps': None, 'verbose': 1}
最后我们来做一下Evaluation and Prediction。下面是评估的部分:
score = model.evaluate(X_test, y_test, verbose = 0)print('Test score:', score[0])print('Test accuracy:', score[1])输出如下:
Test score: 0.0857994918345Test accuracy: 0.9815
准确率为98.15%,其实这个值与在之前训练过程最终输出的val_acc是一致的。下面来看预测的部分,为此先输出一张测试图像:
X_test_0 = X_test[0,:].reshape(1,784)y_test_0 = y_test[0,:]plt.imshow(X_test_0.reshape([28,28]))
输出的图像如下:
接下来看看模型预测的结果如何:
pred = model.predict(X_test_0[:])print('Label of testing sample', np.argmax(y_test_0))print('Output of the softmax layer', pred[0])print('Network prediction:', np.argmax([pred[0]]))程序的输出如下,可见模型的label是7,经过softmax后的输出向量中7位置的概率也最大,因此神经网络也据此预测出了正确的结果为7。
Label of testing sample 7Output of the softmax layer [ 8.34779236e-24 8.63253248e-20 4.66306196e-16 7.04745600e-16 2.07757194e-25 1.96880282e-22 4.68332635e-33 1.00000000e+00 4.69165211e-21 4.72258688e-15]Network prediction: 7
参考文献:
【1】这个例子主要取材自 https://www.youtube.com/watch?v=OUMDUq5OJLg (需要自备梯子)
【2】你可以从链接https://pan.baidu.com/s/1o8E96Uu中获取到本文中所用之完整程序代码的jupyter notebook文件
(本文完)
阅读全文
4 0
- 跟我一起学Keras之实例篇(2)
- 跟我一起学Keras之实例篇(1)
- 跟我一起学C++之重载
- 跟我一起学Makefile (2)
- 跟我一起学java
- 跟我一起学摄影
- 跟我一起学makefile
- 跟我一起学Makefile
- 跟我一起学Makefile
- 《跟我一起学C++》
- 跟我一起学makefile
- 跟我一起学CMake
- 跟我一起学Makefile
- 跟我一起学Kubernetes
- 跟我一起学Makefile
- 跟我一起学Makefile
- 跟我一起学thinkPHP
- 跟我一起学Makefile
- UVa1637
- R语言之函数与包
- u-boot-2017.07移植到S5PV210单板
- GIT学习笔记(3)
- git add -u与-A .三者的区别
- 跟我一起学Keras之实例篇(2)
- WebView基础三:WebView优化
- 深入理解java虚拟机—虚拟机字节码执行引擎
- bzoj 3036(期望dp)
- spring不使用插件进行文件上传返回数据
- 算法(三):动态规划
- CodeForces
- 区间DP code forces 245H
- IT 与OT