2.1 初识神经网络
整个深度学习问题可以分为两类:
- 化繁为简:给出一堆数据,含有输入和标签,让机器自己去学习到一个规则,其中包含分类、回归两大问题。
- 化简为繁:如现在给机器一些图片,让机器自己学习然后生成一些图片或者文字,比如训练集给的是人类平时的对话,让机器能够学习生成一些文字或图像等。如(GNN等)
首先看一下Keras官方提供的数据库可以供我们做练习:
此处我们使用MNIST手写数字数据库做练习:
from keras.datases import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
Mnist数据库里的数据结构如下,稍后我们会将这些训练集加入到神经网络进行训练,让神经网络能够学出一个规则,通常我们会在训练集取一部分做验证集(Validaition set),因为假如我们在通过训练集训练一套参数的时候没有分出来验证集,然后将新的参数直接放在测试集的1000张照片上进行测试,如果此时测试集表现出来的效果不好,我们就得返回去训练集重新训练,这个时候测试集就已经受到了污染,因为测试集已经从中学到了一些信息,如果往复进行这种操作,测试集就能学到更多的信息,所以通常会在训练集里分出一部分做验证集:
通过查看训练集数据的维度,可以看到数据集由60000张28*28像素的图片组成:
下面开始导入模型:
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'))
该模型输入数据要把每一行的像素堆叠成一个列向量输入,形式如下:
网络结构如下:
结构分析:
下面开始优化:
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
加入数据之前通常要对数据进行预处理:
train_images = train_images.reshape((60000, 28 * 28))
# 0-1有小数,所以用float32
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
深度学习通常喜欢数字很小的输入,我们在这里对数据进行标准化,这里可以参考该博主文档:
数据预处理之数据无量纲化(标准化/归一化)
转换独热编码(One-hot),这个理解一下:
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
下面开始训练参数:
network.fit(train_images, train_labels, epochs=5, batch_size=128)
一个批次设定为128,就是将60000个数据,一次丢入128个进去训练,得出一个Loss,然后反向传播回来更新一次参数,然后再丢128个数据进去,得出一个Loss,然后重复,如果把60000个数据丢完叫做一个epoch,然后这里做5个epoch,所以更新参数的次数为60000/128*5次。
对测试集进行评估:
test_loss, test_acc = network.evaluate(test_images, test_labels)
这一小节只是对MNIST数据集举个例子而已,比较容易,所以笔记内容不多,理解流程即可。