人工智能学习笔记(1)——使用深度学习框架完成手写数字识别

感觉学习人工智能算法很痛苦,以前的数据结构没有好好学,因此希望通过记笔记来让自己学得好一点。

环境:AI Studio 中的notebook

注:代码示例来源于我的人工智能课老师,一些部分的解释来源于飞桨的文档中,另一些会标注出处,侵删。

分析老师给的代码示例

(1)查看当前paddlepaddle环境

查看当前paddlepaddle环境

    没什么可说的。

(2) 完成mnist数据集的加载

完成mnist数据集的加载

1、paddle.vision.transforms :飞桨框架内置图像数据集的预处理。

2、class paddle.vision.transforms.Compose(transforms):将用于数据集预处理的接口以列表的方式进行组合。

3、class paddle.vision.transforms.Normalize(mean=0.0std=1.0data_format='CHW'to_rgb=Falsekeys=None):图像归一化处理,支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。

4、class paddle.vision.datasets.MNIST:飞桨框架自带的MNIST数据集。

(3)查看其中一条信息:

查看其中一条信息

1、第五行:将图像新建为28x28的像素矩阵

2、plt.imshow(some_digmit_image, cmap = matplotlib.cm.binary):plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。其后跟着plt.show()才能显示出来。cmap即colormaps,图谱。(来源于plt.imshow() - (jianshu.com))

(4)网络构建

网络构建

1、paddle.nn 目录下包含飞桨框架支持的神经网络层和相关函数的相关API。

2、class paddle.nn.Linear(in_featuresout_featuresweight_attr=Nonebias_attr=Nonename=None):线性变换层,详见Linear-API文档-PaddlePaddle深度学习平台。

3、paddle.nn.Flatten(start_axis=1stop_axis=- 1):实现将一个连续维度的Tensor展平成一维Tensor。

4、paddle.nn.functional.relu(xname=None):relu激活层。计算公式:relu(x)=max(0,x)

5、paddle.nn.functional.softmax(xaxis=- 1dtype=Nonename=None):实现了softmax层,详见softmax-API文档-PaddlePaddle深度学习平台。

6、该步骤是为了定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层-->>隐层-->>隐层-->>输出层。

(5)基于基础API,完成模型的训练与预测

模型的训练

1、train_loader:加载训练数据。

class paddle.io.DataLoader(datasetfeed_list=Noneplaces=Nonereturn_list=Falsebatch_sampler=Nonebatch_size=1shuffle=Falsedrop_last=Falsecollate_fn=Nonenum_workers=0use_buffer_reader=Trueuse_shared_memory=Truetimeout=0worker_init_fn=None):DataLoader返回一个迭代器,该迭代器根据 batch_sampler 给定的顺序迭代一次给定的 dataset。

2、model.train()和model.eval():如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train(),在测试时添加model.eval()。其中model.train()是保证BN层用每一批数据的均值和方差,而model.eval()是保证BN用全部训练数据的均值和方差;而对于Dropout,model.train()是随机取一部分网络连接来训练更新参数,而model.eval()是利用到了所有网络连接。(来源于model.train()与model.eval()的用法_Qy1997的博客-CSDN博客)

3、epochs:定型周期,指的就是训练过程中数据将被“轮”多少次。 亦即应当完整遍历数据集多少次(一次为一个epoch)。(来源于 tensorflow学习笔记--深度学习中的epochs,batch_size,iterations详解_STHSF的地盘-CSDN博客_tensorflow中的epoch,包括其他的参数也提到了)

4、class paddle.optimizer.Adam(learning_rate=0.001beta1=0.9beta2=0.999epsilon=1e-08parameters=Noneweight_decay=Nonegrad_clip=Nonename=Nonelazy_mode=False):利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。详见Adam-API文档-PaddlePaddle深度学习平台。

5、model.parameters():Weights和Bais参数。

6、paddle.nn.functional.cross_entropy(inputlabelweight=Noneignore_index=- 100reduction='mean'soft_label=Falseaxis=- 1name=None):实现了softmax交叉熵损失函数。该函数会将softmax操作、交叉熵损失函数的计算过程进行合并,从而提供了数值上更稳定的计算。详见cross_entropy-API文档-PaddlePaddle深度学习平台。

7、paddle.metric.accuracy(inputlabelk=1correct=Nonetotal=Nonename=None):使用输入和标签计算准确率。 如果正确的标签在topk个预测值里,则计算结果加1。注意:输出正确率的类型由input类型决定,input和lable的类型可以不一样。

8、optim.clear_grad(), loss.backward(), optim.step():可以看理解optimizer.zero_grad(), loss.backward(), optimizer.step()的作用及原理_PanYHHH的博客-CSDN博客_loss.backward。

模型的检验

你可能感兴趣的:(人工智能学习笔记(1)——使用深度学习框架完成手写数字识别)