百度paddlepaddle入门讲解第一周内容

Baidu AI Studio

相关网站:https://aistudio.baidu.com/aistudio/education/group/info/1297

day0 0810

两个课程推荐:零基础实践深度学习 机器学习的思考故事

传统的课程:线性回归 感知机 逻辑回归

实际应该的思考流程:假设空间:设计网络,优化目标:评价或损失函数Loss,寻解算法:优化/求解算法

day1 0811

Q1 深度学习与机器学习与人工智能

Subject 1 Overview

人工智能 > 机器学习 > 深度学习

深度学习是机器学习算法中最热门的一个分支,近些年取得了显著的进展,并替代了大多数传统机器学习算法。

If it is written by Python, it’s probably machine learning. If it is written by PPT, it’s probably AI

Subject2 Define Machine Learning

Official Definition

机器学习是专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构,使之不断改善自身的性能。

类比人的学习过程,观察现象进行归纳,推到一般规律演绎具体案例。

计算机学习过程:①假设空间,②优化目标,③寻解算法。

  1. Define a Hypothesis Space to fit the relation between INPUT X and OUTPUT Y,which we call the Hypothesis Space Model.
  2. 定义一个衡量标准,用数字化的形式表达参数的好坏,which we call Loss Function.
  3. iterate all the 观察样本 until get the most apporporiate parameters, which we called 优化/巡检 optimization.

在这里插入图片描述

Subject3 Define Deep Learning

THEN How about Deep Learning?

The Hypothesis of DL is much more complicated than the ML, so we introduce Deep Neural Network to help describe it.

假设变得非常非常难的时候就不得不引入深度学习网络帮忙构造这个假设空间。

In fact, it is because the there are so many layes in Neural Network that we call it DEEP LEARNING

DL consists of ①计算节点/神经元 ②多层连接 ③前向计算

  • 神经元:

    神经网络中每个节点称为神经元,由两部分组成:

    • 加权和:将所有输入加权求和。
    • 非线性变换(激活函数):加权和的结果经过一个非线性函数变换,让神经元计算具备非线性的能力。
  • 多层连接: 大量这样的节点按照不同的层次排布,形成多层的结构连接起来,即称为神经网络。

  • 前向计算: 从输入计算输出的过程,顺序从网络前至后。

  • 计算图: 以图形化的方式展现神经网络的计算逻辑又称为计算图。我们也可以将神经网络的计算图以公式的方式表达如下: Y = f 3 ( f 2 ( f 1 ( w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b ) + … ) … ) … ) Y =f_3 ( f_2 ( f_1 ( w_1\cdot x_1+w_2\cdot x_2+w_3\cdot x_3+b ) + … ) … ) … ) Y=f3(f2(f1(w1x1+w2x2+w3x3+b)+)))

P1 Boston House Price Prediction Model

13个输入变量x,一层神经网络: y = ∑ j = 1 M x j ω j + b , M = 13 y=\sum_{j=1}^{M}x_j\omega_j+b_, M=13 y=j=1Mxjωj+b,M=13

损失函数MSE: m s e = 1 n ∑ i = 1 n ( Y ^ i − Y i ) 2 mse = \frac{1}{n}\sum_{i=1}^n(\hat Y _i - Y_i)^2 mse=n1i=1n(Y^iYi)2,n为样本数量,预测-真实值

在这里插入图片描述

  1. 数据处理: 把数据处理成想要的格式 + 初步划分训练集测试集 + 数据集根据训练集归一化 + 重新划分训练集数据集,注意最好最后封装成一个函数load_data()

  2. 模型设计:定义一个类,这个类中包含八个函数,

    class Network(object):
        def __init__(self, num_of_weights):
            # 随机产生w的初始值
            # 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
            np.random.seed(0)
            self.w = np.random.randn(num_of_weights, 1)
            self.b = 0.
            
        def model(self.x):
        	z = np.dot(x, self.w) + self.b
            return z
            
        def forward(self, x):
            
            return self.model(x)
        
        def loss(self, z, y):
            error = z - y
            num_samples = error.shape[0]
            cost = error * error
            cost = np.sum(cost) / num_samples
            return cost
        
        def gradient(self, x, y):
            z = self.forward(x)
            gradient_w = (z-y)*x
            gradient_w = np.mean(gradient_w, axis=0)
            gradient_w = gradient_w[:, np.newaxis]
            gradient_b = (z - y)
            gradient_b = np.mean(gradient_b)        
            return gradient_w, gradient_b
        
        def update(self, gradient_w, gradient_b, eta = 0.01):
            self.w = self.w - eta * gradient_w
            self.b = self.b - eta * gradient_b
            
        def train(self, x, y, iterations=100, eta=0.01):
            losses = []
            for i in range(iterations):
                z = self.forward(x)
                L = self.loss(z, y)
                gradient_w, gradient_b = self.gradient(x, y)
                self.update(gradient_w, gradient_b, eta)
                losses.append(L)
                if (i+1) % 10 == 0:
                    print('iter {}, loss {}'.format(i, L))
            return losses
    
  3. 训练配置:其实就是选择合适的loss function(MSE)和合适的优化器(梯度下降法/随机梯度下降法),优化过程注意一下广播机制和epoch,batchsize这些关系

总结,训练过程:

for epoch:
	for batchsize:
		forward
		compute loss
		backward propagation
		update weights

day2 0812

开发paddlepaddle飞桨模型,通用:底层模型,loss函数,优化器配置。

同时包含很多已经封装好的模型库。

Q1 动态图与静态图

tensorflow应该是支持静态图,pytorch支持动态图,

类比C++和Python

C++在写完代码以后,编译器统一编译为一个可执行文件去运行,这种方法称之为静态图方法。

优点:全局编译性能更好。

Python每写一行,动态执行该行指令,这种方法称之为动态图方法。

飞桨采用Python原生的控制流。

优点:调试方便,实时查看结果,可以转换成静态图,推荐使用。

Q2 飞桨处理数据

np.array
dygraph.to_variable
srcdata
np.array
paddle.variable

day3 0813

Q1 Overview

从单层的特征层转至图像的处理,手写数字识别

房价预测相当于是机器学习中的’HelloWorld’,手写数字识别相当于是深度学习中的’HelloWorld’

数据集了解:MNIST

60000个训练集,10000个测试集,28 * 28的图像大小

依然是五个步骤,

  1. 数据处理:读取数据,转换格式,初步分类训练集测试集,归一化,分类训练集和测试集。现在应该改一下了,应该是读取数据集,划分数据集,shuffle,batch,验证
  2. 模型设计:定义网络,定义损失函数。
  3. 训练配置:定义优化器,定义在CPU还是在GPU上训练。
  4. 开始训练:for epoch for batchsize 前向传播,损失计算,后向传播,更新权重。
  5. 训练结束:保存模型。

在这里插入图片描述

Q2 同步读取和异步读取

通过建立仓库使数据读取和训练模型相互解耦

yeild函数的作用:返回batch,下次还从停止的位置开始计数,根据老师的解释是用python生成器的模式保证我们减少内存的占用,就是只有当我们用到一批数据的时候,才会执行这样一个循环,它并不会占用很大的一个内存把数据全部读入。

day4 0814

上节课学的是处理数据:读取文件,划分数据集,shuffle,batch,验证。异步处理

这节课学CNN的搭建。

Q1 CNN的设计核心

局部视野:视觉信息的有效信号是局部的,无论其在什么位置都可以用相同的方法识别出来。

参数共享:

Q2 损失函数

MSE均方误差,对于输出是一个实数的情况下,专业术语叫做回归问题,很好用。

处理分类问题第一步,softmax标准化,

问题:为什么不直接求和做分母,还要指数次方?

期望该问题的输出集中在某一个特定的区域间,这一个小的区域包含临界值的变化点,而不可以采用线性的输出,对每一个区域都有相同的变化率。

恶补随机过程,最大似然估计,还是用到贝叶斯后验概率, P ( H ∣ A ) > P ( H ∣ B ) P(H|A) > P(H|B) P(HA)>P(HB),得到H,就认为这是A的情况。因此可以推导出分类问题专用的交叉熵损失函数。

飞桨默认的标签的数据类型是int64

Q3 优化器选择

梯度下降(不带batch的那种),随机梯度下降SGD(带batch的那种)

还有Momentum,AdaGrad,Adam等其他的优化方法。

  • SGD: 随机梯度下降算法,每次训练少量数据,抽样偏差导致参数收敛过程中震荡。
  • Momentum: 引入物理“动量”的概念,累积速度,减少震荡,使参数更新的方向更稳定。

每个批次的数据含有抽样误差,导致梯度更新的方向波动较大。如果我们引入物理动量的概念,给梯度下降的过程加入一定的“惯性”累积,就可以减少更新路径上的震荡,即每次更新的梯度由“历史多次梯度的累积方向”和“当次梯度”加权相加得到。历史多次梯度的累积方向往往是从全局视角更正确的方向,这与“惯性”的物理概念很像,也是为何其起名为“Momentum”的原因。类似不同品牌和材质的篮球有一定的重量差别,街头篮球队中的投手(擅长中远距离投篮)喜欢稍重篮球的比例较高。一个很重要的原因是,重的篮球惯性大,更不容易受到手势的小幅变形或风吹的影响。

  • AdaGrad: 根据不同参数距离最优解的远近,动态调整学习率。学习率逐渐下降,依据各参数变化大小调整学习率。

通过调整学习率的实验可以发现:当某个参数的现值距离最优解较远时(表现为梯度的绝对值较大),我们期望参数更新的步长大一些,以便更快收敛到最优解。当某个参数的现值距离最优解较近时(表现为梯度的绝对值较小),我们期望参数的更新步长小一些,以便更精细的逼近最优解。类似于打高尔夫球,专业运动员第一杆开球时,通常会大力打一个远球,让球尽量落在洞口附近。当第二杆面对离洞口较近的球时,他会更轻柔而细致的推杆,避免将球打飞。与此类似,参数更新的步长应该随着优化过程逐渐减少,减少的程度与当前梯度的大小有关。根据这个思想编写的优化算法称为“AdaGrad”,Ada是Adaptive的缩写,表示“适应环境而变化”的意思。RMSProp是在AdaGrad基础上的改进,AdaGrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的梯度平均值,因而可以解决AdaGrad学习率急剧下降的问题。

  • Adam: 由于动量和自适应学习率两个优化思路是正交的,因此可以将两个思路结合起来,这就是当前广泛应用的算法。

在这里插入图片描述

day5 0815

回顾

数据处理

模型定义:定义CNN,定义loss MSE/交叉熵

训练配置:优化器,用CPU还是GPU以及多GPU

多GPU配置,这个距离我太遥远了

训练过程优化思路主要有如下五个关键环节:

1. 计算分类准确率,观测模型训练效果。

交叉熵损失函数只能作为优化目标,无法直接准确衡量模型的训练效果。准确率可以直接衡量训练效果,但由于其离散性质,不适合做为损失函数优化神经网络。

2. 检查模型训练过程,识别潜在问题。

如果模型的损失或者评估指标表现异常,通常需要打印模型每一层的输入和输出来定位问题,分析每一层的内容来获取错误的原因。

3. 加入校验或测试,更好评价模型效果。

理想的模型训练结果是在训练集和验证集上均有较高的准确率,如果训练集上的准确率高于验证集,说明网络训练程度不够;如果验证集的准确率高于训练集,可能是发生了过拟合现象。通过在优化目标中加入正则化项的办法,解决过拟合的问题。

4. 加入正则化项,避免模型过拟合。

飞桨框架支持为整体参数加入正则化项,这是通常的做法。此外,飞桨框架也支持为某一层或某一部分的网络单独加入正则化项,以达到精细调整参数训练的效果。

5. 可视化分析。

用户不仅可以通过打印或使用matplotlib库作图,飞桨还提供了更专业的可视化分析工具VisualDL,提供便捷的可视化分析方法。

Q1 过拟合的成因

存在噪音

模型太大数据太少

day7 课程答疑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值