深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用
实验环境
PyCharm Community Edition 2019
python 3.6
Keras库及相关引用库(numpy,scipy)
(官网https://keras.io/)
(配置环境参照RNN & LSTM 学习笔记 —— Anaconda安装,Python安装,PyTorch,Tensorflow配置)
开坑~
MNIST数据集
先来看一下机器学习领域中经典的MNIST数据集,这个数据集包括60000张训练图和10000张测试图,均为手写数字的灰度图(28像素*28像素),划分到10个类别中(0~9)。
from keras.datasets import mnist
#加载Keras中的MNIST数据集
(train_image,train_labels),(test_images,test_labels) = mnist.load_data()
#打印训练集相关
print(train_image.shape)
print(len(train_labels))
print(train_labels)
#打印测试集相关
print(test_images.shape)
print(len(test_labels))
print(test_labels)
train_image和train_labels组成了训练集 training set
test_images和test_labels组成了测试集 test set
图像被编码为Numpy数组,标签是数字数组,取值0~9
分类问题中,某个 类别 叫做 类(class),数据点叫做 样本(sample),某个样本对应的类叫做 标签(label)。
运行时会先下载数据集。
结果打印如下:
构建一个网络
from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
network.add(layers.Dense(10,activation='softmax'))
神经网络的核心组件——层(layer),可以看成是数据的过滤。将大量的简单层链接起来,实现渐进式的数据蒸馏(data distillation)
上面的代码包含两个Dense层,是全连接的神经层。
第二层(也就是最后一层)是一个10路softmax层,它将返回由10个概率值(和为1)组成的数组。
选择编译参数
训练网络还需要选择编译(compile)的三个参数
损失函数(loss function):如何衡量训练数据的性能,即朝着正确的方向
优化器(optimizer):基于训练数据和损失函数,更新网络
训练和测试过程中需要监控的指标(metric):正确的比例,例子里面只关心精度
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
准备图像数据
训练前,需要数据预处理,变成网络要求的形状。
缩放到所有值都在[0, 1]区间,默认MNIST的图数据都是[0, 255]。
转换为float32的数组,形状为(60000,28*28)。默认为uint8类型的(60000,28,28)。
train_image = train_image.reshape((60000,28*28))
train_image = train_image.astype('float32')/255
test_images = test_images.reshape((10000,28*28))
test_images = test_images.astype('float32')/255
对标签进行分类编码
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
开始训练网络
Keras中是通过调用 fit方法。完成训练集上拟合(fit)模型。
可以看到两个数字,损失(loss)和精度(acc)。在训练集上打到了98.88%的准确度。
在测试集检测
test_loss,test_acc = network.evaluate(test_images,test_labels)
print('test_acc: ',test_acc)
测试集精度为97.97%,比训练集低。
训练精度和测试精度之间的这种差距是过拟合(overfit)造成的。
过拟合:机器学习模型在新数据上的性能往往比在训练数据上要差。
具体之后在深入学习。
总结
以上是神经网络的构建和训练,对手写字的分类。
完整代码如下:
from keras.datasets import mnist
from keras import models
from keras import layers
from keras.utils import to_categorical
#加载Keras中的MNIST数据集
(train_image,train_labels),(test_images,test_labels) = mnist.load_data()
#打印训练集相关
print(train_image.shape)
print(len(train_labels))
print(train_labels)
#打印测试集相关
print(test_images.shape)
print(len(test_labels))
print(test_labels)
#网络结构
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'])
#准备图像数据
train_image = train_image.reshape((60000,28*28))
train_image = train_image.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)
#训练集拟合模型
network.fit(train_image,train_labels,epochs=5,batch_size=128)
#测试集上测试
test_loss,test_acc = network.evaluate(test_images,test_labels)
print('test_acc: ',test_acc)
上一篇: 如何获取MIPS汇编对应的机器码
下一篇: 二、计算机视觉与卷积神经网络