学习笔记-第二章 深度学习概论与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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容