python深度学习——知识总结与整理
知识点1:基于keras的手写数字识别
最近在看基于python的深度学习,首先是一个入门程序,基于keras框架的手写数字识别。手写数字的数据集由60000张训练数据和10000张测试数据组成。这些数据都是一个由8位整数组成的3D张量(当然要想查看数据的属性,可以使用shape/ndim/dtype等属性查看),更确切地说,它是60000个矩阵组成的数组,每个矩阵由28*28个整数组成,每个这样的矩阵都是一个灰度图像,在灰度图像中每一个元素的取值范围都是0~255。
本文采用两层全连接神经网络进行训练,由训练结果可以看到,训练数据集的准确率是98.89%,而测试数据集的准确率是98.1%,这是因为训练时的过拟合造成的,这在之后的博文中会详细分析。
代码如下,python3.7.3,IDE是pycharm专业版
'''
@author: liuyunsheng
@file: handwriting.py
@time: 2019/5/16 19:49
@desc:
'''
from keras import models
import matplotlib.pyplot as plt
from keras import layers
from keras.utils import to_categorical
# 提取数据
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 当然你也可以用matplotlib库来显示每一个数据
digit = train_images[4]
plt.imshow(digit, cmap=plt.cm.binary)
plt.show()
# 搭建神经网络;神经网络的核心组件是层(layer),可以看做是进去一些数据,出来的数据更加有用
# 下面的神经网络包含两个层,两个全连接层,第二个是一个softmax层,将会返回一个由10个概率值组成的数组
# 每个概率表示当前数字图像属于10个数字类别中某一个的概率
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
# 编译,选择损失函数,优化器和训练以及测试过程中需要监控的指标,本案例只关注精度,即正确分类的图像所占的比例
network.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
# 训练之前,需要对数据进行预处理,将其变换为网络要求的形状,并缩放到所有值都在[0,1]之间
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
# 还需要对标签进行分类编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 训练网络,调用fit方法
network.fit(train_images, train_labels, epochs=5, batch_size=128)
# 检查模型在测试集的性能
test_loss, test_acc = network.evaluate(test_images, test_labels)
print(test_acc)
使用matplotlib显示其中一个数据: