《Python深度学习》第二章笔记
1.第一个神经网络示例
我们来看一个具体的神经网络示例,使用Python的Keras库来学习手写数字分类。
这里要解决的问题是,将手写数字的灰度图像(28像素x28像素)划分到10个类别中(0~9)。我们将使用MNIST数据集(MNIST数据集预先加载在Keras库中,包括4个Numpy数组),它是机器学习领域的一个经典数据集,包含60000张训练图像和10000张测试图像。
接下来的工作流程如下:
- 首先,加载Keras中的MNIST数据集,得到训练集和测试集。
- 其次,将训练数据输入神经网络。
- 然后,网络学习将数据和标签(数据对应的类别)关联在一起。
- 最后,网络对输入的测试数据生成预测,并验证这些预测值与真实值是否匹配。
#加载keras中的MNIST数据集
from keras.datasets import mnist
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()
# print(train_images.shape)
# print(len(train_labels))
# print(train_labels)
本例的网络包含2个Dense层,它们是密集连接的神经层。第二层是一个10路的softmax层,它将返回一个由10个概率值(总和为1)组成的数组。每个概率值表示当前数字图像属于10个数字类别中某一个的概率。
Dense层完成的具体操作后续会介绍到。
#搭建网络架构
from keras import models
from keras import layers
network = models.Sequential()
#该网络包含2个Dense层(全连接层)
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
network.add(layers.Dense(10,activation='softmax'))
编译时需要人为设置的三个参数:
- 损失函数loss
- 优化器optimizer
- 在训练和测试过程中需要监控的指标metric
后续两章会详细解释损失函数和优化器的确切用途。
#编译
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
#准备图像数据
#数据预处理,将unit8类型的图像变换为float32数组类型
#取值区间[0,255]→[0,1],形状(60000,28,28)→(60000,28*28)
train_images = train_images.reshape