deep learning with Python(弗朗索瓦·肖莱) 笔记(二)
第二章:神经网络的数学基础
使用keras进行MNIST手写体进行分类:
1.加载数据集:
from keras.datasets import mnist
(train_images,train_labels), (test_images,test_labels)=mnist.load_data()
查看数据;
train_images.shape
(60000,28,28)
2.网络架构:
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'))
Dense为全连接层,512表示输入数据大小,**函数增加非线性能力。
10路softmax将返回一个由10个概率值组成的数组,每个概率值表示当前图像属于某一个类别的概率。
3.编译步骤:(损失函数,优化器监控指标metric(比如精度))
network.compile(optimizer='rmsprop',
loss='cattegorical_crossentropy'
metrics=['accuracy'])
4.准备图像数据
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
将数据转换为float32数组,取值在0·1之间。
5.对标签进行编码分类
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
6.训练(keras调用拟合(fit)实现)
network.fit(train_images,train_labels,epochs=5,batch_size=128)
显示训练的loss和acc,精度很快达到98.9%。
7.测试
test_loss,test_acc=network.evaluate(test_images,test_labels)
print('test_acc:',test_acc)
测试精度低于训练精度是因为:overfit过拟合。
8.显示某个数字
import matplotlib.pyplot as plt
plt.imshow(train_images[4],cmap=plt.cm.binary)
plt.show()
9.取出张量切片
my_slice=train_images[10:100] 形状为:
10.BATCH:
batch=train_images[:128]
神经网络的数据表示;
数据存于多维Numpy中,也叫做张量Tensor。
包含一个数字的张量叫做标量,有0个轴(维度)(阶)。
数字组成的数组叫做向量,或者一维张量。
一维张量,五个维度,五维向量。维度表示沿某个轴上的元素个数。
向量组成的数组叫矩阵,为2D张量,或者2维张量。
行列。
多个矩阵组成数组为3D张量。(立方体)
轴(阶)(ndim)
形状:(5,)(3,5)(3,3,5)
实际的数据张量:
向量数据:2D
时间序列:3D
图像:4D
视频:5D
基于梯度的优化
梯度是张量运算的导数,也是多元导数。
要找到损失函数的最小值时候的参数值(权重)。
进行反向传播,优化权重。
小批量SGD:随机梯度下降:随机:每批数据选取随机,逐个更新权重。
图为一维情况。
网络只有一个参数,只有一个训练样本。
优化方法:动量,解决了收敛速度和局部极小点。
动量:考虑当前的梯度值也考虑上一次的参数更新。
反向传播算法:使用链式求导法则的算法。
链式求导法则:
梯度下降::例如:batch_size=128, epoch=5
1个数据输入一次,得到一个梯度,128个数据可以求损失函数的和的平均值,然后在求梯度,在更新权重,也就是更新了一次权重,这为一轮,总共进行5轮。
随机梯度下降:
1个数据输入一次,得到一个梯度,然后在求梯度,在更新权重,完成128次,也就是更新了128次权重,这为一轮,总共进行5轮。
随机为为什么会收敛更快:相当于每一轮更新128次参数,而梯度下降(求平均再更新)只是更新了一次。