神经网络基础篇八

100 阅读6分钟

深度学习框架哪家强?

image.png

  • Keras把TensorFlow中一些复杂的API封装成非常简单便捷的形式。无论用什么样的工具包,它们在完成相同的算法上得到的结果不会有什么差异即得到的效果和准确度相同,只是在构建代码中使用的API用法有些不同。用Keras做任务的时候,整体的感觉就是便捷快速。
  • Caffe做任务的时候只需要写配置文件即可,相当于不用写代码就可以把任务做出来,但Caffe更新的比较慢,实现的模型也没有那么多,只有一些卷积神经网络,只适合做图像识别,不太适合做自然语言处理。
  • TensorFlow所有事情都要“亲力亲为”,比如先构建session,再初始化全局变量,再把所有模型加载进来,有些麻烦。

image.png

TensorFlow用的比较广,更新比较频繁。Keras用起来简单,入门容易,上手快。Keras的后端不仅仅支持TensorFlow,还有很多其他的后端。

安装keras

image.png

举例说明

image.png

dataset目录下是三个类别的数据集,共有3000张图片数据。

image.png每一张图片都有一个path

image.png

读取dataset目录下的3000张图片,然后指定一个随机种子。

为什么要指定随机种子

如果每次数据集的切分不一样,调的参数也不一样,最终的结果就不能确定是数据集的影响还是参数的影响,所以需要保持随机种子(随便指定一个值)一样,方便做对比实验。

image.png

遍历每一张图片,得到一个三维的ndarray数据结构,

image.png

然后再进行数据的预处理。用传统的神经网络去训练任务,数据输入进来之后,先绘制一个全连接层。

image.png

比如中间隐层有128个神经元,w1是权重参数矩阵,左边连接的是输入数据,右边连接的是隐层特征变换的结果。比如所有图片的规格都是固定的即每张图都有32x32x3=3072个像素。神经网络处理不了三维立体的,需要拉长成3072个特征列。

image.png

数据预处理之后,从三维数据变成了一维数据

image.png

此时就得到了一张图片数据,遍历之后,就得到了3000张图片数据。

有了数据之后,再设置下标签,文件夹的名称就代表一类标签。

image.png

这个是panda标签的数据。

image.png通过\符号切分下,-2表示倒数第二个即panda,得到标签数据。

image.png

数据和标签分别放入数组中,数据和标签是一一对应的。

image.png

把标签和数据全部取出来,

image.png

数据是一维3072个特征数据,像素点都是0~255之间的数值。一般情况下都需要对数据进行预处理。对图像数据预处理就像对数值数据预处理一样,数值数据做预处理的时候,希望把它压缩到0~1之间即做标准化或归一化。

这里做一个归一化即除以255

image.png

所有数据除以255之后,就是0~1范围上的一个值。转换成float类型,因为float更适合做cpu或gpu计算。

image.png

将数组转换成ndarray,因为ndarray工具包可调用的函数多一些。

image.png

75%的训练集,25%的测试集。

数据经过神经网络,得到的最终结果是3个类别的概率值,

image.png

一般图像数据One-Hot Encoding做编码,比如cat为100,dog是001...

image.png

训练数据是ndarray,经过转换之后,image.png

变成了One-Hot Encoding格式了。训练和测试数据都做了这样的操作。至此就得到了数据和标签了。

接下来构建网络模型,构建网络模型最实用的工具是keras.io/

image.png

参考代码示例进行代码编写,先创建一个序列结构(最简单的搭建网络的方法),然后一层一层的添加。

image.png

3072个像素点,相当于输入3072个特征,

image.png

第一层用512个神经元做特征转换,第二层用256个神经元做特征转换,最后的3是希望得到的3个概率值。

第一层是全连接层512个神经元,第一层需要告诉当前连的输入层里面有多少个神经元,这个神经元相当于输入的特征的个数。3072是三维32x32x3拉长之后的数据,后面的每一层就可以省略这个参数。然后指定relu激活函数,一般情况下,带有参数的层之后都会连接一个激活函数。

因为有3个标签数据,所以第三层lb.classes_的长度是3,最后的结果要做一个softmax,相当于得到每个类别的概率值,做一个归一化的操作。

image.png

然后指定一些超参数,第一个参数是学习率。第二个参数EPOCHS,图片数据有3000张,所以1EPOCHS=3000张,1EPOCHS相当于迭代了3000张图片,比如1BATCH=100张图片即1个BATCH相当于同时训练100张图片,1EPOCHS=30个BATCH,30个BATCH才能把整个数据集遍历一遍,200个EPOCHS的意思是把整个数据集3000张图片遍历200次。

还差目标函数没有指定,神经网络的灵魂就是目标函数,目标函数即损失函数就是指定一个目标就朝着这个目标的方向去训练,各种各样的神经网络做的事情也不同,规定了什么样就做什么样的事情。

image.png

设置分类任务的损失函数,用对数计算概率值,计算损失。指定一个梯度下降的优化器,需要设置一个学习率。分类任务用分类任务的损失函数,回归任务用回归任务的损失函数,回归任务看损失值就可以,分类任务不仅要看损失,还要看概率值。所以从训练结果中需要把准确率值拿出来。TensorFlow的accuracy需要自己判断自己指定,Keras都封装好了,直接调用就行了。

image.png

进行模型训练,每次EPOCH完之后,都会打印验证集的结果数据。

image.png

测试网络模型,训练完之后,做一次测试。3000张数据的25%即750个测试数据作为测试的结果。

image.png

将测试的结果用4个折线图展现出来。