注:关于类和标签的说明。在机器学习中,分类问题中的某个类别叫做类(class)。数据点叫做样本(Sample)。某个样本对应的类叫做标签(lable)。
from keras.datasets import mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
注:train_images和train_labels组成了训练集(training set),模型将从这些数据中进行学习。然后在测试集(test set,即test_images,test_labels)上对模型进行测试
图像被编码为Numpy数组,而标签是数字数组。取值范围为0-9.图像和标签一一对应。
训练数据:
>>>train_images.shape
(60000,28,28)
>>>len(train_labels)
60000
>>>train_labels
array([5,0,4...5,6,8],dype=unit8)
测试数据:
>>>test_images.shape
(10000,28,28)
>>>len(test_labels)
10000
>>>test_labels
array([7,2,1...4,5,6],dtype=unit8)
接下来,首先将训练数据(train_images和train_labels)输入神经网络,其次,网络学习 将图像和标签关联在一起,最后,网络对test_images生成预测
from keras import models
from keras imort layers
network =models.Sequential()
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
network.add(layers.Dense(10,activation='softmasx'))
注:层是一种数据处理模块,你可以将它看成数据过滤器。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的数据过滤器。
注:本例中的网络包含两个Dense层,他们是密集连接的神经层,第二层是一个10路的softmax层。它将返回一个由10个概率值(总和为1)组成的数组,每个概率值表示当前数字图属于10个数字类别中某一个的概率。
注:要想训练网络,我们还需要选择编译步骤的三个参数。
1.损失函数(loss function)
网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进
2.优化器(optimizer)
基于训练数据和损失函数来更新网络的机制
3.在训练和测试过程中需要的监控的指标(metric)
本例只关心精度,即正确分类的图像所占得比例
network.compile(optimizer='rmsprop',
loss='Categorical_crossentropy',
metrics=['accuracy'])
注:在开始训练之前,我们将对数据进行预处理,将其变换为网络要求的形状,并缩放到所有值都在[0,1]区间。
train_images=train_images.reshape((6000,28*28))
train_images=train_images.astype(''float32)/255
train_images=test_images.reshape((10000,28*28))
train_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方法来完成的-我们在训练数据上拟合模型。
>>>test_loss,test_acc=network.evaluate(test_images,test_labels)
>>>print('test_acc:',test_acc)
test_acc:0.9785
注:训练过程中显示了两个数字:一个是网络在训练数据上的损失(loss),另一个是网络在训练数据上的精度(acc)
注:训练数据达到98.9%的精度,而测试集精度为97.8。训练精度和测试精度之间的这种差距是过拟合造成的。过拟合是指机器学习模型在新数据上的性能往往比在训练数据上要差。