学习笔记-第二章 深度学习概论与PaddlePaddle入门

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

1 人工智能 Artificial Intelligence

*达特茅斯学院 - 1956 -
一门交叉学科,涉及数学、计算机科学、控制论、信息论、心理学、哲学等学科的边缘学科

2 机器学习

*卡耐基梅隆大学-1997 -

如果一个程序可以在任务T上,随着经验E的增加,效果P也可以随之增加,则这个程序可以从经验中学习
机器学习的传统算法包括决策树学习、推到逻辑规划、聚类、分类、回归、贝叶斯网络、神经网络

3 深度学习

深度学习系统是输入层,隐层,输出层的多层网络
深度学习不是万能的,像很多方法一样,他需要结合特定领域的先验知识

深度学习是大脑,机器学习是脑壳,人工智能就是四肢

深度学习的发展历程

1 神经网络的第一次高潮

1957-Frank-感知机

2 神经网络的第一次寒冬

1969-Marvin 能力有限只能分析线性问题,对于异或问题束手无策-多层感知机

3 神经网路的第二次高潮

1986-BP算法(反向传播算法)-自然杂志

4 神经网络的第二次寒冬

1989-卷积神经网络(CNN) -梯度爆炸问题
1998-SVM算法(支持向量机)贝尔实验室

5 深度学习的来临

⚠️《A Fast Learning Algorithm for Deep Belif Nets》

深度学习崛起的时代背景

算法有了,计算性能提升了,数据也有了

深度学习的应用场景

图像与视觉

  • ImageNet 比赛 2013年
  • 人脸识别
  • 以图搜图

语音识别

2009年 高斯混合模型(GMM)被击败,语音识别领域首次成功
2016年百度语音识别准确率高达97%

自然语言处理

  • 情感分析
  • 文本生成
  • 语言翻译
  • 聊天机器人

个性化推荐

CTR(Click-Through-Rate) 点击通过率

常见的深度学习网络结构

全连接网络结构 FC FullConnected

卷积神经网络 CNN Convolutional nutrual Netwwork

循环神经网络 Recurrent Netural Network

机器学习回顾

输入数据-> 机器学习方法 -> 估计函数
新数据 ->估计函数 ->预测结果

线性回归的基本概念

  • 什么是线性回归

存在一个点集,用一条曲线去拟合它的过程。如果拟合曲线是直线,就是线性回归,如果是曲线就是二次回归

  • 基本概念:
    假设函数(Hypothesis Function),用数学方法描述自变量和因变量之间的为一种函数关系
    损失函数(Loss Function ),用数学方法描述假设函数的预测值和真实值之间的误差。均方差⚠️(Mean Squared Error)一种损失函数,交叉熵⚠️也是
    优化算法(Optimization Algorithm)
  • 数据处理
    1 选取有用的维度
    2 是否处理离散值
    3 归一化(Mormalization)把各维的属性的取值范围放缩的差不多的区间:减掉均值,然后除以原值取范围

进行归一化的原因:1 ) 过大或者过小的数值范围会导致计算时的浮点上溢或者下溢出;2 )不同的数值范围会导致不同属性对模型的重要性不同(至少在初始阶段如此),而这个假设常常不合理的。这回对优化过程造成困难,使得使用时间大大加长;3 )很多机器学习技巧/模型(L1,L2正则项,向量空间模型-Vector Space)都基于这样的假设:所有的属性取汁差不多都是以0为均值切取值范围是相近的

4 分割数据考虑的因素:更多的训练数据会降低参数估计的方差,从而得倒更可信的模型,而更多的测试数据会降低测试误差的方差,从而得到更可信的测试误差
5 验证集:仅针对复杂模型,因为有很多超参数(Hyperparameter)要调整

  • 模型概览(房价预测)
  • 效果展示(房价预测)

深度学习框架介绍

深度学习框架的作用

  • 简化计算图的搭建
    计算图(computional gragh)-本质上是一个有向无环图,结点代表函数,边代表函数操作
  • 简化偏导计算
  • 高效运行

常见的深度学习框架

CNTK | PaddlePaddle | Caffe2 | TensorFlow | PyTorch | MXNet

PaddlePaddle 简介

PaddlePaddle是百度开源的,易学易用的分布式深度学习平台


PaddlePaddle 使用

  • docker 安装
mkdir ~/workspace
cd ~/workspace
touch housing.py

编辑 housing.py

import paddle.v2 as paddle

# 初始化
paddle.init(use_gpu=False,trainer_count=1)
# Configure the natural network
x = paddle.layer.data(name='x',type=paddle.data_type.dense_vector(13))
y_predict = paddle.layer.fc(input=x,size=1,act=paddle.activation.Linear())

with open('/workspace/fit_a_line.tar',r) as f:
      parpameters = paddle.parameters.Parameters.from_tar(f)
# Infer using provided test data
probs = paddle.infer(
           output_layer = y_predict,parameters = parameters,
            input=[item for item in paddle.dateset.uci_housing.test()()])

for i in xrange(len(probs)):
      print 'Predicted price: ${:,.2f}'.format(probs[I][0] * 1000)

运行housing.py

docker run --rm -v ~/workspace:/workspace paddle paddle/paddle:latest python /workspace/housing.py

房价模型连接
[百度备用]


  • pip 安装
pip install paddlepaddle 
import paddle.v2 as paddle
# initialize PaddlePaddle
paddle.init(use_gpu=False,trainer_count=1)
# Configure the neural network
x = paddl.layer.data(name='x',type=paddle_type.dense_vector(13))
y_predict = paddle.layer.fc(input=x ,size = 1,act = paddle.activation.Linear())
with open('fit_a_line.tar','r') as f:
      parameters = paddle.parameters.Parameters.from_tar(f)

# infer using provided test data
probs = paddle.infer(
              output_layer=y_predict,parmeters=parameters,
              input=[item for item in paddle.dataset.uci_housing.test()()])
for i in xrange(len(probs)):
      print 'Predicted price:${:,.2f}'.fromat{probs[I][0] * 1000}

PaddlePaddle 实现

  • 加载包
import matplotlib
matplotlib.use{'Agg'}

import matplotlib.predict as pat
import numpy as np

import paddle.v2 as paddle

  • 数据处理
#  1 dataset 初始化
TRAIN_DATA = None
X_RAW = None
TEST_DATA = None
#  2 数据载入
def load_data(filename, feature_num=2,ratio=0.8):
"""
载入数据并进行处理
Args:
      Filename:数据储存文件,从该文件读取数据
      feature_num:数据特征数量
      ratio 训练集占总数据集比例
"""
global TRAIN_DATA,TEST_DATA,X_RAW
# data = np.loadtxt() 表示将数据载入后以矩阵或向量的形式存储在data中
# delimiter = ',' 表示以','为分隔符
data = np.loadtxt(filename,delimiter=',')
X_RAW = data.T[0].copy()

# axis= 0 表示按列计算
# data.shape[0] 表示data中一共有多少列
maximums,minimums,avgs =data.max(axis=0),data.min(axis=0),data.sum(axis=0)/data.shape[0]

# 归一化 data[:i] 表示第i列元素
for i in xrange(feature_num-1)
        data[:i]  = (data[: i]  - aves[I])/(maximums[i] - minmums[i])
      
# offset 用于划分训练数据集和测试数据集,例如0.8表示训练数据集占80%
offset = int(data.shape[0]*ratio)
TRAIN_DATA = data[:offset].copy
TEST_DATA= data[offset:].copy
#  3 读取训练数据 和读取测试数据
"""
读取训练数据或测试数据,服务于train()和test()
Args:
    data_set: 要获取的数据集
Return:
    reader:用于获取训练数据集及其标签的生成器
"""
def reader()
      """
      一个reader
      Args:
      return:
                data[:-1],data[-1:] --使用yield 返回生成器
                data[:-1]表示前n-1个元素,也就是训练数据,data[-1:1]表示最后一个元素,也就是对应的标签
      """
      for data in data_set:
            yield data[:-1],data[-1:]
return reader
# 4 获取训练数据集
def train():
    """
    定义一个reader 来获取训练数据集及其标签
    Args:
    Return:
        read_data --用于获取训练数据集及其标签的reader
    """
global TRAIN_DATA
load_data('data.txt')
return read_data(TRAIN_DATA)
# 5  获取测试数据集
def test():
"""
定义一个reader 来获取测试数据集及其标签
Args:
Return:
    read_data -- 用于获取测试数据集及其标签的reader
"""
global TEST_DATA
load_data('data.txt')
return read_data(TEST_DATA)
  • 搭建神经网络
# 1 配置网络结构
def network_config():
"""
配置网络结构
Args:
Retrun:
        cost:
        parameter:模型参数
        optimizer:优化器
        feeeding:数据映射,python 字典
"""
# 输入层 paddle.layer.data 表示数据层,name='x':名称为x_input,
# type=paddle.data_type.dense_vector(1):数据类型为1维稠密向量
x_input = paddle.layer.data(name='x',
               type=paddle.data_type.dense_vector(1))
# 输出层:paddle.layer.fc 表示全链接层 ,input=x_input 表示该层输入数据层
# size =1:神经元个数,act=paddle.activation.Linear(): 激活函数为Linear()
# 标签数据,paddle.layer.data 表示数据层,name='y':名称为y
y_label = paddle.layer.data(name='y',type=paddle.data_type.dense_vector(1))

# 定义成本函数为均方差损失函数 square_error_cost
cost = paddle.layer.square_error_cost(input=y_predict,label=y_label)

# 利用cost 创建parameters
parameters = paddle.parameters.create(cost)

# 创建optimizer,并且初始化momentum,momentum=0 位普通的SGD 优化算法
optimizer = paddle.optimizer.Momentum(momnetum=0)

# 数据层和数组索引映射,用于trainer 训练时喂数据
feeding = {'x':0,'y':1}
result = [cost,parameter,optimizer,feeding]
return result
  • 初始化 PaddlePaddle
# 初始化 use_gpu=False 表示不用GPU
def main():
      # init
      paddle.init(use_gpu=False,trainer_count=1)
  • 训练模型
# 1 配置网络结构和设置参数
cost,parameters,optimizer,feeding = network_config()
# 2 记录成本
costs = []
# 3 创建 训练 trainer
traniner = paddle.trainer.SGD(cost=cost,parameters =parameters,update_equation =optimizer )
# 4 定义事件处理器,打印训练进度

def event_handler(event):
    """
    事件处理器,可以根据训练过程的信息作相应操作
    Args:
        Event:事件对象,包含event.pass_id,event.batch_id,event.cost等信息
    """
    if isinstance(event, paddle.event.EndIteration):
          if event.pass_id % 100 = 0:
                print "Pass %d,Batch %d,Cost %f"  % (
                    event.pass_id,event.batch_id,event.cost)
               costs.append(event.cost)
               )
   if isinstance(event, paddle.event.EndPass):
        result = trainer.test(
                      reader=paddle.batch(test(),batch_size=2),
                      feeding=feeding)
       print "Test %d,Cost %f" % (event.pass_id,result.cost) 
        )
# 5 模型训练
# training
trainer.train(
reder=paddle.batch(
        paddle.reader.shuffle(train(),but_size=500),
        batch_size=256),
        feeding=feeding,
        event_handler=event_handler,
        num_passes = 300)
# 6 打印结果
print_parameters(parameters)
# 7 展示学习曲线
plot_cost(costs)
  • 预测房价
# 1 参数打印 page 57
def print_parameters(parameters):
      """
          打印训练结果的参数以及测试结果
          Args:
                  Parameters:训练结果的参数
          Return:
      """
      print   " Result parameters as below"
      
      theta_a = parateters.get('____fc_layer_0__.w0')[0]
      theta_b = parameters.get('___fc_layer_0_.wbias')[0]
      
      x_0 = X_RAW[0]
      y_0 = theta_a * TRAIN_DATA[0][0] + theta_b

      x_1 = X_RAW[1]
      y_1 =theta_a *TRAIN_DATA[1][0] + theta_b

      param_a = (y_0 - y_1) / (x_0 - x_1)
      param_b = (y_1 - param_a * x_1)
      print 'a = ',param_a
      print 'b = ',param_b
# 2 展示模型训练曲线 page 58
def_plot_costs(costs):
      """
      利用 costs 展示模型的训练曲线
      Args: 
            Cost: 记录了训练过程的cost变化的list,每一百次迭代记录一次
      Return:
      """
      costs = np.squeeze(costs)
      plt.plot(costs)
      plt.ylabel('cost')
      plt.xlabel('iterations(per hundreds)')
      plt.title("house Price Distributions")
      plt.show()
      plt.savefig("cost.png")
# 3 开始预测 page 58
if __name__ == '__main__':
       main()
  • 数据可视化
# 绘图 page 59
import numpy as np
import matplotlib.pyplot as plt

def plot_data(data, a,b):
       x = data[:,0]
       y = data[:,1]
       y_predict = x*a + b;
       plt.scatter(x,y,marker='.',c='r',label='True')
       plt.title("House Price Distributions")
       plt.xlabel('House Area')
       plt.ylael('House Proce')
       plt.xlim(0,255)      
       plt.ylim(0,2500)
       predict = plt.plot(x,y_predict,lable='Preidict')
       plt.legend(loc='upper left')
       plt.savefig('result.png')
       plt.show()
       
data = np.loadtxt('data.txt',delimiter=',')
X_RAW = data.T[0].copy()
plot_data(data,7.1,-62.1)

你可能感兴趣的:(学习笔记-第二章 深度学习概论与PaddlePaddle入门)