《Python深度学习》读书笔记(二)

2.1 初识神经网络

整个深度学习问题可以分为两类:

  1. 化繁为简:给出一堆数据,含有输入和标签,让机器自己去学习到一个规则,其中包含分类回归两大问题。
  2. 化简为繁:如现在给机器一些图片,让机器自己学习然后生成一些图片或者文字,比如训练集给的是人类平时的对话,让机器能够学习生成一些文字或图像等。如(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数据集举个例子而已,比较容易,所以笔记内容不多,理解流程即可。

发布了22 篇原创文章 · 获赞 5 · 访问量 484

猜你喜欢

转载自blog.csdn.net/RedValkyrie/article/details/105083495