科普知识
MindSpore 是一个全场景 AI 计算框架,它的特性是可以显著减少训练时间和成本(开发态)、以较少的资源和最高能效比运行(运行态),同时适应包括端、边缘与云的全场景(部署态)。
针对不同的运行环境,MindSpore 框架架构上支持可大可小,适应全场景独立部署。MindSpore 框架通过协同经过处理后的、不带有隐私信息的梯度、模型信息,而不是数据本身,以此实现在保证用户隐私数据保护的前提下跨场景协同。除了隐私保护,MindSpore 还将模型保护内建于框架中,实现模型的安全可信。
MindSpore 通过实现 AI 算法即代码,使开发态变得更加友好,可以显著减少模型开发时间。以一个 NLP(自然语言处理)典型网络为例,相比其它框架,用 MindSpore 可降低核心代码量 20%,开发门槛大大降低,效率整体提升 50% 以上。
通过 MindSpore 框架自身的技术创新及其与昇腾处理器协同优化,有效克服 AI 计算的复杂性和算力的多样性挑战,实现了运行态的高效,大大提高了计算性能。除了昇腾处理器,MindSpore 同时也支持 GPU 与 CPU 等其它处理器。
回顾
经过前面几篇文章的学习,相信大家已经学会了如何构建一个常见的图像识别(分类)的深度学习项目,然而,项目代码中的细节部分,可能大家不太熟悉,今天,我们就来对之前的一些未能详细讲解的地方进行总结,希望对大家有所帮助。
一、总结
总结主要分为以下几个环节展开:
1.数据处理
2.模型搭建
3.模型训练及保存
4.模型测试
数据处理
数据处理部分存在理由是,需要将原始的图片数据(jpg,png,灰度图或者多通道彩色图)解码为原始的矩阵数据,然后将矩阵转化为深度学习框架支持的张量(tensor)类型(浮点型数据),同时按照神经网络的训练方式,将训练集中的所有图像按照一定的批次(16,32,64等)为一批放进网络进行训练。
代码片段一:将训练集中的所有图像读取出来保存到两个列表中,分别存放图像的存储路径和对应的标签(事先预定)
代码片段二:调用tf自带的批数据处理函数,将上一步读取到的列表进行批次划分,返回批数据,然后直接传递给网络进行训练。
模型搭建
模型搭建主要负责数据传进来后处理,网络的每一层需要严格对应输入的维度变化,从而可以完成前向传播计算。
初始数据维度[B,H,W,C],这就是输入网络的数据的维度信息(shape),第一纬度B代表批数据维,也就是有多少个数据,后面三维表示每一个数据的真正维度,例如,[32,224,224,3]代表有32个3通道,且长宽为224的图像,神经网络中,图像的长宽必须是固定的,如果是不断变化的,那么网络的维度就会因为最开始是固定的而不能随机变化,导致出现维度报错,因此,通常在数据处理部分,训练集中的图像将会被设置为固定长长宽,通常会出现这行代码:
网络中卷积层自定义函数:
如上如所示,
tf.nn.con2d()函数中,weights和stride维度需要注意,weights的维度为[kernel_size,kernel_size,in_channel,out_channel],
kernel_size表示卷积核的尺寸(一般为3x3,1x1,5x5),可以根据效果进行挑选,in_channel为输入数据的维度,即上一层网络的输出的维度,如果上一次层是原始图像,按照之前的图像维度就是3,如果上一层是卷积层,那么上一层卷积层的输出维度即为现在卷积的输入维度,out_channel为当前卷积想要输出的维度,也是卷积核的数量,输出后的特征图的数量即为out_channel,因此网络卷积核维度需要格外对应设置,不然报错连连。
模型训练及保存
这一环节最为重要的就是如何将数据输入到网络,以及网络的输出结果如何进行损失函数计算,通常tf的数据是通过feed函数喂进网络的,在实际run的时候才会导入数据,模型的输出除了需要参与loss计算外,还需计算出当前的准确率,以便我们能够观察网络的学习效果,(通常在进行一个轮次的训练之后会对测试集进行测试)网络的输出通常是一个类别数目的概率分布(分布之和为1),如果是两个类别,那么网络的最终输出对每个样本的输出是[0.8,0.2],随后取最大值(0.8)的索引[0]为预测值,然后与真实标签最比较,相同则为1,否则为0,由此得出一个批数据的正确个数,所有批次计算完后,即可得出整个测试集的准确率。
模型保存为将最好的模型保存下来,以便进行后期的使用和实验。
模型测试
模型测试部分较为简单,主要是将之前保存的模型结构以及相应的权重参数进行读取,进行实际的预测,这时候只是运行的前向传播部分,即只需要得到网络的预测值,数据处理部分与训练的时候保持一致即可。
结语
本期内容为对之前的图像分类项目进行总结,完整的跑通一个深度学习项目需要大家对细节部分进行解读和调试,特别是网络搭建部分,网络参数不可以随意设置,需要考虑输入数据的实际维度进行设置。
同时对于代码的细节部分,有些地方小编没有讲解到,希望大家能去发现并去得到结果,比如说,卷积的维度输出是四维,即[B,H,W,C],最后网络的输出是[B,N],N为类别数目,即一个样本有N个输出,最大值的索引为预测标签,那么四个维度是如何转化为两个维度的呢?希望大家去发现并从中学习。
周末快乐,下期再见!
编辑:玥怡居士|审核:小圈圈居士