Shu's Garden - PaddlePaddle
type: channel
link: https://www.sitstars.com/tag/PaddlePaddle/
items: PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN
items: PaddlePaddle飞桨课程学习Day2：波士顿房价模型改写
items: PaddlePaddle飞桨课程学习Day1：深度学习简介与入门模型

PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN
type: item
date: 2020-08-16T15:05:10+08:00
description: 前言：手写数字识别如果说波士顿房价预测是机器学习中的hello world,，那么手写数字识别就是深度学习中的hello world。在处理如下图所示的手写邮政编码的简单图像分类任务时，可以使用基于MNIST数据集的手写数字识别模型。MNIST是深度学习领域标准、易用的成熟数据集，包含60000条训练样本和10000条测试样本。 任务输入：一系列手写数字图片，其中每张图片都是28x28的像素矩阵。任务输出：经过了大小归一化和居中处理，输出对应的0~9的数字标签。本次任务使用的网络模型为卷积神经网络（CNN），它被广泛应用于图像识别，自然语言等领域。该任务同样遵循五步走战略，即数据处理—模型设计—训练配置—训练过程—模型保存 极简版本的实现代码import paddle import paddle.fluid as fluid from paddle.fluid.dygraph.nn import Linear import numpy as np import os from PIL import Image class MNIST(fluid.dygraph.Layer): def __init__(self): super(MNIST,self).__init__() # 定义一层全连接层，输出维度1，激活函数None self.fc = Linear(input_dim = 784,output_dim=1) # 前向计算 def forward(self,inputs): outputs = self.fc(inputs) return outputs # 创建动态图工作环境 with fluid.dygraph.guard(): # 声明网络结构 model = MNIST() # 启动训练模式 model.train() # 定义读取函数 train_loader = paddle.batch(paddle.dataset.mnist.train(),batch_size=16) # 定义优化器，使用SGD，学习率设置为0.001 optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001,parameter_list=model.parameters()) epoch_num = 10 # 10次大循环 for epoch in range(epoch_num): for batch_id,data in enumerate(train_loader()): # 数据格式转换 img_data = np.array([x[0] for x in data]).astype("float32") label_data = np.array([x[1] for x in data]).astype("float32").reshape(-1,1) # 为了loss计算，最后一维要是1。-1是占位符，这个位置是为了batch_size预留的 # 将数据转为飞桨动态图格式 img = fluid.dygraph.to_variable(img_data) label = fluid.dygraph.to_variable(label_data) # 前向计算 predict = model.forward(img) # 计算损失 loss = fluid.layers.square_error_cost(predict,label) avg_loss = fluid.layers.mean(loss) # 每训练1000次数据就打印一次 if batch_id != 0 and batch_id % 1000 == 0: print("epoch is {},batch is {}, loss is {}".format(epoch,batch_id,avg_loss.numpy())) # 后向传播 avg_loss.backward() # 更新参数 optimizer.minimize(avg_loss) # 最小化损失 model.clear_gradients() # 清除梯度 # 保存模型 fluid.save_dygraph(model.state_dict(), 'mnist')说明：飞桨提供了多个封装好的数据集API，涵盖计算机视觉、自然语言处理、推荐系统等多个领域，帮助读者快速完成深度学习任务。如在手写数字识别任务中，通过paddle.dataset.mnist可以直接获取处理好的MNIST训练集、测试集。飞桨将维度是28*28的手写数字图像转成向量形式存储，因此使用飞桨数据加载器读取到的手写数字图像是长度为784（28*28）的向量。pa…

PaddlePaddle飞桨课程学习Day2：波士顿房价模型改写
type: item
date: 2020-08-13T17:37:00+08:00
description: 课程链接：https://aistudio.baidu.com/aistudio/education/group/info/1297深度学习框架介绍在构建模型的过程中，每一步所需要完成的任务均可以拆分成个性化和通用化两个部分。个性化部分：往往是指定模型由哪些逻辑元素组合，由建模者完成。通用部分：聚焦这些元素的算法实现，由深度学习框架完成。 用飞桨重写房价预测模型首先说明一下，代码是我看官方教程一点点手打的，可能有部分地方是按我的想法写的，与官方教程不一致，不过测试是成功运行的。导入库首先加载相关库#加载飞桨、Numpy和相关类库 import paddle import paddle.fluid as fluid import paddle.fluid.dygraph as dygraph from paddle.fluid.dygraph import Linear import numpy as np import os import random代码中参数含义如下：paddle/fluid：飞桨的主库，目前大部分的实用函数均在paddle.fluid包内。dygraph：动态图的类库。Linear：神经网络的全连接层函数，即包含所有输入权重相加和激活函数的基本神经元结构。在房价预测任务中，使用只有一层的神经网络（全连接层）来实现线性回归模型。说明：飞桨支持两种深度学习建模编写方式，更方便调试的动态图模式和性能更好并便于部署的静态图模式。静态图模式（声明式编程范式，类比C++）：先编译后执行的方式。用户需预先定义完整的网络结构，再对网络结构进行编译优化后，才能执行获得计算结果。（写完所有代码，才能编译并执行）动态图模式（命令式编程范式，类比Python）：解析式的执行方式。用户无需预先定义完整的网络结构，每写一行网络代码，即可同时获得计算结果。（写一行代码就可执行）为了学习模型和调试的方便，本教程均使用动态图模式编写模型。在后续的资深教程中，会详细介绍静态图以及将动态图模型转成静态图的方法。仅在部分场景下需要模型转换，并且是相对容易的。数据处理和上一篇文章是一样的，拆分测试集，随机抽样，归一化，这里不细说了。def load_data(): # 数据处理 data = np.fromfile('housing.data',sep = ' ') feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ] feature_num = len(feature_names) data = data.reshape([data.shape[0]//feature_num,feature_num]) # 拆分训练集 ratio = 0.8 training_data = data[:int(data.shape[0]*ratio),:] # 归一化 maximums, minimums, avgs = np.max(training_data,axis = 0),np.min(training_data,axis = 0),\ np.average(training_data,axis = 0) global range_value # 定义全局变量，以便预测时仍然可以用归一化参数 global avgs_value range_value = maximums - minimums avgs_value = avgs data = (data - avgs) / range_value # 把归一化的数据重新划分为训练集和测试集 training_data = data[:int(data.shape[0]*ratio),:] test_data = data[int(data.shape[0]*ratio):,:] return training_data, test_data模型设计模型定义的实质是定义线性回归的网络结构，飞桨建议通过创建Python类的方式完成模型网络的定义，即定义init函数和forward函数。forward函数是框架指定实现前向计算逻辑的函数，程序在调用模型实例时会自动执行forward方法。在forward函数中使用的网络层需要在init函数中声明。实现过程分如下两步：定义init函数：在类的初始化函数中声明每一层网络的实现函数。在房价预测模型中，只需要定义一层全连接层。定义forward函数：构建神经网络结构，实现前向计算过程，并返回预测结果，在本任务中返回的是房价预测结果。class Regressor(fluid…

PaddlePaddle飞桨课程学习Day1：深度学习简介与入门模型
type: item
date: 2020-08-12T08:10:00+08:00
description: 前言笔记来自百度架构师手把手带你零基础实践深度学习课程，第一天听下来，我感觉老师讲得还是非常深入浅出，通俗易懂的。推荐大家学一下。课程链接：https://aistudio.baidu.com/aistudio/education/group/info/1297虽然课程标题里说是零基础，但就和之前介绍过的零基础实现神经网络系列文章一样，这里的零基础指的是深度学习零基础。至少你要熟悉python编程，了解基本的数学原理（主要是线性代数和微积分），和部分库（比如Numpy）。博主在学习python和numpy的时候做了一点笔记，可以参考一下：[post url="https://econ.wiki//wiki//编程语言//python//01 基础 Python笔记//" title="python基础语法" intro="雁陎做的关于python语法的笔记"][post url="https://econ.wiki//wiki//编程语言//python//02 numpy库//" title="numpy基础语法" intro="雁陎做的关于numpy语法的笔记"]综述人工智能、机器学习、深度学习的关系概括来说，人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的。人工智能是最宽泛的概念。机器学习是当前比较有效的一种实现人工智能的方式。深度学习是机器学习算法中最热门的一个分支。如下图 机器学习机器学习的实现机器学习的实现可以分成两步：训练和预测，类似于我们熟悉的归纳和演绎。训练即从样本中抽样出输入和输出的关系，预测即给定新的输入，计算输出。机器学习的方法论图3 是以$H$为模型的假设，它是一个关于参数$W$和输入$X$的函数，用$H(W, X)$ 表示。模型的优化目标是$H(W, X)$的输出与真实输出$Y$尽量一致，两者的相差程度即是模型效果的评价函数（相差越小越好）。那么，确定参数的过程就是在已知的样本上，不断减小该评价函数（$H(W, X)$ 和$Y$相差）的过程，直到学习到一个参数$W$，使得评价函数的取值最小。这个衡量模型预测值和真实值差距的评价函数也被称为损失函数（损失Loss）。 最小化损失是模型的优化目标，实现损失最小化的方法称为优化算法，也称为寻解算法（找到使得损失函数最小的参数解）。参数$W$和输入$X$组成公式的基本结构称为假设。由此可见，模型假设、评价函数（损失/优化目标）和优化算法是构成模型的三个部分。那么这三个部分是如何支撑机器学习流程的呢？如下图 所示： 模型假设：预先圈定好Y~X可能的关系（函数）集（篮圈），以提高训练效率。评价函数：如何确定该函数就是我们要找的？定义一个评价函数，同样将拟合的误差最小作为优化目标。优化算法：在关系可能性集中，寻找使得评价指标最优（损失函数最小/最拟合已有观测样本）的参数，这个寻找的方法即为优化算法。最笨的优化算法即按照参数的可能，穷举每一个可能取值来计算损失函数，保留使得损失函数最小的参数作为最终结果。机器执行学习的框架体现了其学习的本质是“参数估计”（Learning is parameter estimation）。在此基础上，许多看起来完全不一样的问题都可以使用同样的框架进行学习，如科学定律、图像识别、机器翻译和自动问答等，它们的学习目标都是拟合一个“大公式”，如 图5 所示。 深度学习深度学习与机器学习在理论结构上是一致的，即：模型假设、评价函数和优化算法，其根本差别在于假设的复杂度，如下图所示。 这种复杂程度已经无法单纯用数学公式表达，因此研究者设计了神经网络的模型。神经网络人工神经网络包括多个神经网络层，如卷积层、全连接层、LSTM等，每一层又包括很多神经元，超过三层的非线性神经网络都可以被称为深度神经网络。通俗的讲，深度学习的模型可以视为是输入到输出的映射函数，如图像到高级语义（美女）的映射，足够深的神经网络理论上可以拟合任何复杂的函数。因此神经网络非常适合学习样本数据的内在规律和表示层次，对文字、图像和语音任务有很好的适用性。因为这几个领域的任务是人工智能的基础模块，所以深度学习被称为实现人工智能的基础也就不足为奇了。神经网络结构如 图7 所示。 一些基本概念：神经元： 神经网络中每个节点称为神经元，由两部分组成：加权和：将所有输入加权求和。非线性变换（激活函数）：加权和的结果经过一个非线性函数变换，让神经元计算具备非线性的能力。多层连接： 大量这样的节点按照不同的层次排布，形成多层的结构连接起来，即称为神经网络。前向计算： 从输入计算输出的过程，顺序从网络前至后。计算图： 以图形化的方式展现神经网络的计算逻辑又称为计算图。我们也可以将神经网络的计算图以公式的方式表达如下：$$Y =f_3 ( f_2 ( f_1 ( w_1\cdot x_1…