感觉学习人工智能算法很痛苦,以前的数据结构没有好好学,因此希望通过记笔记来让自己学得好一点。
环境:AI Studio 中的notebook
注:代码示例来源于我的人工智能课老师,一些部分的解释来源于飞桨的文档中,另一些会标注出处,侵删。
分析老师给的代码示例
(1)查看当前paddlepaddle环境
没什么可说的。
(2) 完成mnist数据集的加载
1、paddle.vision.transforms :飞桨框架内置图像数据集的预处理。
2、class paddle.vision.transforms.Compose(transforms):将用于数据集预处理的接口以列表的方式进行组合。
3、class paddle.vision.transforms.Normalize(mean=0.0, std=1.0, data_format='CHW', to_rgb=False, keys=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_features, out_features, weight_attr=None, bias_attr=None, name=None):线性变换层,详见Linear-API文档-PaddlePaddle深度学习平台。
3、paddle.nn.Flatten(start_axis=1, stop_axis=- 1):实现将一个连续维度的Tensor展平成一维Tensor。
4、paddle.nn.functional.relu(x, name=None):relu激活层。计算公式:relu(x)=max(0,x)
5、paddle.nn.functional.softmax(x, axis=- 1, dtype=None, name=None):实现了softmax层,详见softmax-API文档-PaddlePaddle深度学习平台。
6、该步骤是为了定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层-->>隐层-->>隐层-->>输出层。
(5)基于基础API,完成模型的训练与预测
1、train_loader:加载训练数据。
class paddle.io.DataLoader(dataset, feed_list=None, places=None, return_list=False, batch_sampler=None, batch_size=1, shuffle=False, drop_last=False, collate_fn=None, num_workers=0, use_buffer_reader=True, use_shared_memory=True, timeout=0, worker_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.001, beta1=0.9, beta2=0.999, epsilon=1e-08, parameters=None, weight_decay=None, grad_clip=None, name=None, lazy_mode=False):利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。详见Adam-API文档-PaddlePaddle深度学习平台。
5、model.parameters():Weights和Bais参数。
6、paddle.nn.functional.cross_entropy(input, label, weight=None, ignore_index=- 100, reduction='mean', soft_label=False, axis=- 1, name=None):实现了softmax交叉熵损失函数。该函数会将softmax操作、交叉熵损失函数的计算过程进行合并,从而提供了数值上更稳定的计算。详见cross_entropy-API文档-PaddlePaddle深度学习平台。
7、paddle.metric.accuracy(input, label, k=1, correct=None, total=None, name=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。