Keras学习教程一

     现在我们来看一个神经网络的第一个具体例子,它使用Python库Keras来学习分类手写数字。除非你已经有Keras或类似的图书馆的经验,否则你不会马上理解关于这个第一个例子的一切。你可能还没有安装Keras。别担心,那很好。在下一章中,我们将回顾我们示例中的每个元素并详细解释它们。所以不要担心,如果某些步骤看起来是任意的,或者对你来说看起来像是魔法!我们必须从某个地方开始。

     我们在这里试图解决的问题是将手写数字(28像素×28像素)的灰度图像分类为10个类别(0到9)。我们将使用的数据集是MNIST数据集,这是机器学习社区中的一个经典数据集,它几乎与该领域本身一样长,并且已经进行了非常深入的研究。这是一套60,000张训练图像,外加10,000张测试图像,由美国国家标准与技术研究院(NIST)于20世纪80年代组装而成。你可以将“解决”MNIST想象成深度学习的“Hello World” - 这就是你如何验证你的算法是否按预期工作。当你成为一名机器学习实践者时,你会看到MNIST一次又一次地在科学论文,博客文章等等中出现 

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    train_images和train_labels构成了“训练集”,即模型将学习的数据。 然后模型将在“测试集”,test_images和test_labels上进行测试。 我们的图像被编码为Numpy数组,标签只是一个数字数组,范围从0到9.图像和标签之间存在一一对应的关系。

    我们来看看训练数据:

train_images.shape
OUT:(60000, 28, 28)
len(train_labels)
Out[4]:60000
train_labels
Out[5]:array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

    我们来看看测试数据:

In[6]:test_images.shape
Out[6]:(10000, 28, 28)
In [7]:len(test_labels)
Out[7]:10000
In [8]:test_labels
Out[8]:array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    我们的工作流程如下:首先,我们将向我们的神经网络提供训练数据,train_images和train_labels。 网络将学习将图像和标签关联起来。 最后,我们将要求网络为test_images生成预测,并且我们将验证这些预测是否与test_labels中的标签匹配。

    让我们建立我们的网络 - 再一次记住,你不应该理解这个例子的一切。

    

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'))
    神经网络的核心构建块是“层”,这是一个数据处理模块,您可以将其视为数据的“过滤器”。一些数据进入,并以更有用的形式出现。准确地说,图层从提供给它们的数据中提取表示 - 希望对于手头问题更有意义的表示。大多数深度学习实际上是将简单的层连接在一起,这些层将实现一种渐进的“数据蒸馏”形式。深度学习模式就像是一个数据处理筛选器,由一系列越来越精细的数据过滤器 - “层”组成。
    在这里,我们的网络由一系列密集连接(也称为“完全连接”)神经层的密集层组成。第二层(也是最后一层)是10路“softmax”层,这意味着它将返回10个概率分数的数组(总计为1)。每个分数将是当前数字图像属于我们的10位数类别之一的概率。
    为了让我们的网络准备好接受培训,我们需要选择另外三件事,作为“编译”步骤的一部分:
            损失函数:网络将如何衡量其在训练数据上的工作性能,以及如何能够在正确的方向上引导自己。
            优化器:这是网络根据其看到的数据及其丢失功能自行更新的机制。
            指标在培训和测试期间进行监控。在这里,我们只关心准确度(被正确分类的图像部分)。

    损失函数和优化器的确切目的将在接下来的两章中阐明。

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])

    在训练之前,我们将通过将数据重塑为网络预期的形状来预处理数据,并对其进行缩放,以使所有值都处于[0,1]区间。 以前,我们的训练图像例如存储在类型为uint8的形状数组(60000,28,28)中,值为[0,255]间隔。 我们将它转换为一个形状为float32的数组(数组在0到1之间)(60000,28 * 28)。

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

    我们还需要对标签进行分类编码,这是我们在第3章中解释的一个步骤:

from keras.utils import to_categorical

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

    我们现在准备好培训我们的网络,Keras网络是通过调用网络的拟合方法完成的:我们将模型“拟合”到训练数据中。

network.fit(train_images, train_labels, epochs=5, batch_size=128)
Epoch 1/5
60000/60000 [==============================] - 2s - loss: 0.2577 - acc: 0.9245     
Epoch 2/5
60000/60000 [==============================] - 1s - loss: 0.1042 - acc: 0.9690     
Epoch 3/5
60000/60000 [==============================] - 1s - loss: 0.0687 - acc: 0.9793     
Epoch 4/5
60000/60000 [==============================] - 1s - loss: 0.0508 - acc: 0.9848     
Epoch 5/5
60000/60000 [==============================] - 1s - loss: 0.0382 - acc: 0.9890   
    训练期间显示两个数量:网络在训练数据上的“损失”以及网络在训练数据上的准确性。

    我们很快就达到了训练数据的0.989(即98.9%)的准确度。 现在让我们来检查一下我们的模型在测试集上的表现也很好:

print('test_acc:', test_acc)
 9536/10000 [===========================>..] - ETA: 0s
test_loss, test_acc = network.evaluate(test_images, test_labels)

 test_acc: 0.9777
    我们的测试集精度为97.8% - 这比训练集精度要低很多。 训练准确性和测试准确性之间的这种差距是“过度拟合”的一个例子,机器学习模型往往对新数据的表现比对训练数据的差。 过度拟合将成为第3章的中心话题。


这就是我们第一个例子的结束 - 您刚刚看到我们如何构建并训练一个神经网络来对少于20行的Python代码中的手写数字进行分类。 在下一章中,我们将详细介绍我们刚才预览的每一个动态片段,并阐明幕后真正发生的事情。 您将学习“张量”,进入网络的数据存储对象,张量操作,层构成以及梯度下降,这使得我们的网络可以从其训练示例中学习。

猜你喜欢

转载自blog.csdn.net/qq_40716944/article/details/80627436