过生日和同学出去断了两天!迅速恢复进度!
代码片段2-1 导入数据集
from tensorflow.keras.datasets import mnist
(train_images,train_labels), (test_images,test_labels) = mnist.load_data()
train_images和train_labels组成了训练集,模型从这些数据中进行学习
test_xxx则组成了测试集,在这一部分数据上对模型进行测试
此后我们的一般工作流程为:
将训练数据输入网络 -> 神经网络学习将图像和标签关联在一起 -> 神经网络对test_images进行对应的预测,我们来验证这些预测和test_labels中的标签(即:该图像是啥,数字几)是否能够正确匹配
代码片段2-2 构建神经网络
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(512,activation = "relu"),
layers.Dense(10,activation = "softmax")
])
神经网络利用“层”结构对数据进行过滤,在不断的过滤过程中得到更加有用的数据。
准确的描述为:层从数据中提取“表示”
上述代码部分中包含两个密集连接的神经层,第二层返回的值由十个总和为1的概率值构成的向量
训练前我们还需要指定一些参数:
优化器:基于训练数据自我更新的机制,目的是提高模型性能
损失函数:模型如何衡量在训练数据上的性能,从而引导自己朝着正确方向前进
指标:在训练测试过程中需要查看的指标
代码片段2-3 编译部分
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
训练前还要对数据进行变换预处理,变换为模型能够使用的状态,并把所有值都缩放到【0,1】区间
代码片段2-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
由此我们可以将图像数据转换为28*28的矩阵格式,并通过/255(像素点255)的方式将值的区间缩小到【0,1】
最终得到了60000(10000)个格式为28*28矩阵且值的区间在【0,1】之间的图像数组
代码片段2-5 拟合模型
model.fit(train_images,train_labels,epochs=5,batch_size=128)
最终通过该步我们就得到了一个能够预测新数字图像的类别概率的模型
代码片段2-6 预测
test_digits = test_images[0:10]
predictions = model.predict(test_digits)
predictions[0].argmax()
test_labels[0]
对应输出predictions数组就可以得到在0-9数字区间内,每个位置的数字代表预测内容为对应数字的概率大小
最后输出每个predictions数组的最大值索引,并将其与test_labels中该图像的标签值作比对即可检验预测的正误
代码片段2-7 在新数据上评估模型
test_loss, test_acc = model.evaluate(test_images,test_labels)
最后根据测试精度和训练精度的对比我们可以进一步判断模型是否存在过拟合等现象
通过以上简单的代码段再次回顾了一个简单的深度学习工作流程
张量(vector)属于一个基本核心概念,矩阵为2阶张量,一个数字叫做标量张量
张量的维度叫做“轴”,“轴”的个数也叫做阶
1 向量
数字组成的数组叫做向量,也叫一阶张量或一维张量。一阶张量只有一个轴
而一个向量包含的几个元素,就被叫做“几维向量”
维度和轴要区分开来!五维张量!=五维向量
2 矩阵(2阶张量 或 2维张量)
第一个轴上的元素叫做行
第二个轴上的元素叫做列
3 3阶张量与更高阶的张量
将多个矩阵打包为一个新的数组,就能得到一个3阶张量(可以理解为数字组成的立方体)
以此类推,可以通过3阶张量打包得到4阶张量
(处理视频数据时可能就会碰到5阶张量)
定义张量的3个属性:
轴的个数,数组形状(像是【5,】【3,3】【3,3,5】分别表示五维向量,二维张量,三维张量),数据类型
张量切片:可以选择张量特定区域中的数据
例如下方,选择了后90个元素,且从右下角中裁出了14*14像素的区域
my_slice = train_images[10:100,14:,14:]
再比如下列代码,负数代表的是与当前轴终点的相对位置,由此从图像中心裁剪出14*14像素的区域
my_slice = train_images[:, 7:-7, 7:-7]
数据批量:决定了每次处理的数据集规模大小,例如128
时间序列数据:
每个样本都会包含一个时间轴,为3阶张量(samples,timesteps,features)
例:股票价格数据集
有3个价格作为每个样本的features,有390分钟的交易时间,取1分钟为时间步,那么可以得到390*3的数据矩阵,又因为多个工作日会有多个样本存在,我们最终得到的便是3阶张量,其形状为(1000,390,3)--- 1000个390*3矩阵构成的数据集
广播:在没有歧义且可行时,计算较小张量和较大张量的计算时,会给较小张量添加轴以匹配较大张量
张量变形:也就是利用reshape进行操作,输入对应的形状即可实现
relu激活函数的意义:没有激活函数构成的dense层组成的模型,多层叠加也和一层一样,添加了relu以后,经过dense层的数据就会发生变化等