欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用

程序员文章站 2022-07-14 21:38:34
...

实验环境

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)。

运行时会先下载数据集。
深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用
结果打印如下:
深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用

构建一个网络

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)模型。
深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用
深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用
可以看到两个数字,损失(loss)和精度(acc)。在训练集上打到了98.88%的准确度。

在测试集检测

test_loss,test_acc = network.evaluate(test_images,test_labels)
print('test_acc: ',test_acc)

深度学习 从零开始 —— 神经网络数学基础(一),学习Keras库的使用,神经网络简单流程,MNIST数据集使用
测试集精度为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)