目录
2.1 初始神经网络
1.加载Mnist数据集
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
>>> test_images.shape
(10000, 28, 28)
>>> len(test_labels)
10000
>>> test_labels
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
train_images 和train_labels 组成了训练集(training set),模型将从这些数据中进行学习。然后在测试集(test set,即test_images 和test_labels)上对模型进行测试。接下来的工作流程如下:首先,将训练数据(train_images 和train_labels)输入神经网络;其次,网络学习将图像和标签关联在一起;最后,网络对test_images 生成预测,而我们将验证这些预测与test_labels 中的标签是否匹配。
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'))
3.编译步骤
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
损失函数(loss function):网络如何衡量在训练数据上的性能,即网络如何朝着正确的
方向前进
优化器(optimizer):基于训练数据和损失函数来更新网络的机制
在训练和测试过程中需要监控的指标(metric):本例只关心精度,即正确分类的图像所
占的比例。
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
在开始训练之前,我们将对数据进行预处理,将其变换为网络要求的形状,并缩放到所有值都在[0, 1] 区间。比如,之前训练图像保存在一个uint8 类型的数组中,其形状为(60000, 28, 28),取值区间为[0, 255]。我们需要将其变换为一个float32 数组,其形状为(60000, 28 * 28),取值范围为0~1。
5.准备标签
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
6.训练网络
network.fit(train_images, train_labels, epochs=5, batch_size=128)
2.2 数据表示
神经网络数据存储在多维Numpy数组中,也叫张量。
1.标量
仅包含一个数字的张量,可以使用ndim查看numpy轴的个数
>>> import numpy as np
>>> x = np.array(12)
>>> x
array(12)
>>> x.ndim
0
2.向量
数字组成的数组叫做向量或一维张量
3.矩阵
向量矩阵的数组叫矩阵或二维张量
4.高维张量
多个将矩阵组合成新的数组可以得到3D张量,以此类推,一般处理0D到4D的张量
5.关键属性
包括轴的个数(ndim),形状(shape)以及数据类型(dtype)
6.操作张量
使用张量切片
7.数据批量
深度学习不会同时处理整个数据集,而是将数据拆分成小批量。
8.常用数据张量
向量数据:2D张量形状为 (samples, features)
时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features)。
图像:4D张量,形状为(samples, height, width, channels)或(samples, channels,
height, width)。
9.时间序列数据
当时间(或序列顺序)对于数据很重要时,应该将数据存储在带有时间轴的3D 张量中。
每个样本可以被编码为一个向量序列(即2D 张量),因此一个数据批量就被编码为一个3D 张
量
2.3 张量运算
keras.layers.Dense(512, activation='relu')
output = relu(dot(W, input) + b)
1.逐元素运算
relu 运算和加法都是逐元素(element-wise)的运算,即该运算独立地应用于张量中的每
个元素
2.广播
将两个形状不同的张量相加,若没有歧义的话,较小的张量会被广播(broadcast),以匹配较大张量的形状。
3.张量点积
用* 实现逐元素乘积;Numpy 和Keras 中,都是用标准的dot 运算符来实现点积
4.张量变形
张量变形是指改变张量的行和列,以得到想要的形状。变形后的张量的元素总个数与初始
张量相同
5.几何解释
6.深度学习的几何解释
它将复杂的几何变换逐步分解为一长串基本的几何变换
2.4 梯度优化
output = relu(dot(W, input) + b)
在这个表达式中,W 和b 都是张量,均为该层的属性。它们被称为该层的权重(weight)或可训练参数。一开始,这些权重矩阵取较小的随机值,这一步叫作随机初始化,下一步则是根据反馈信号逐渐调节这些权重。这个逐渐调节的过程叫训练。
训练循环:
梯度优化的训练循环:
优化器:带动量的SGD、Adagrad、RMSProp