百度飞浆深度学习(二)

吃可爱长大的小学妹 提交于 2020-01-30 07:13:15

1.深度学习发展历程

1.1图灵测试

图灵测试由艾伦·麦席森·图灵发明,指测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘)向被测试者随意提问。进行多次测试后,如果机器让平均每个参与者做出超过30%的误判,那么这台机器就通过了测试,并被认为具有人类智能。图灵测试一词来源于计算机科学和密码学的先驱艾伦·麦席森·图灵写于1950年的一篇论文《计算机器与智能》,其中30%是图灵对2000年时的机器思考能力的一个预测,目前我们已远远落后于这个预测。

1.2分级处理信息

大脑认知:1.边缘特征 2.基本形状和目标的局部特征 3.整个目标
高层的特征是低层特征的组合,从低层到高层的特征表达越来越抽象和概念化,也即越来越能表现语义或者意图。从视网膜出发,经过低级的V1区提取边缘特征,到V2区的基本形状或目标的局部,再到高层的整个目标(如判定为一张人脸),以及到更高层的PFC(前额叶皮层)进行分类判断等。
如下为人脑神经元作用示意图:
在这里插入图片描述

1.3深度学习

深度学习,恰恰就是通过组合低层特征形成更加抽象的高层特征(或属性类别)。

2.机器学习

2.1范畴

机器学习是指计算机使用大数据集而不是硬编码规则来学习的能力。
机器学习允许计算机自己学习。这种学习方式利用了现代计算机的处理能力,可以轻松地处理大型数据集。基本上,机器学习是人工智能的一个子集;更为具体地说,它只是一种实现AI的技术,一种训练算法的模型,这种算法使得计算机能够学习如何做出决策。从某种意义上来说,机器学习程序根据计算机所接触的数据来进行自我调整。

2.2分类

监督式学习:需要使用输入和预期输出标记的数据集。如天气预报人工智能。
非监督式学习:利用既不分类也不标记的信息进行机器学习,允许算法在无指导的情况下对信息进行操作。如亚马逊电子商务网站的行为预测AI。

3.神经网络

3.1初识神经网络

神经网络是一组粗略模仿人类大脑,用于模式识别的算法。神经网络这个术语来源于这些系统架构设计背后的灵感,这些系统是用于模拟生物大脑自身神经网络的基本结构,以便计算机能够执行特定的任务。 “AI价格评估”模型也是由神经元(圆圈)组成的。此外,这些神经元还是相互连接的。
在这里插入图片描述
神经元分为三种不同类型的层次:

  • 输入层接收输入数据。输入层会将输入数据传递给第一个隐藏层。

  • 隐藏层对输入数据进行数学计算。创建神经网络的挑战之一是决定隐藏层的数量,以及每一层中的神经元的数量。

  • 人工神经网络的输出层是神经元的最后一层,主要作用是为此程序产生给定的输出。

神经元之间的每个连接都有一个权重。这个权重表示输入值的重要性。模型所做的就是学习每个元素对价格的贡献有多少。这些“贡献”是模型中的权重。一个特征的权重越高,说明该特征比其他特征更为重要。每个神经元都有一个激活函数。它主要是一个根据输入传递输出的函数。 当一组输入数据通过神经网络中的所有层时,最终通过输出层返回输出数据。
训练AI的过程中,重要的是给它的输入数据集(一个数据集是一个单独地或组合地或作为一个整体被访问的数据集合),此外还需要对其输出结果与数据集中的输出结果进行对比。

3.2神经网络实例-paddle学习手写数字分类

使用数据集:MNIST数据集,包括60 000张训练图像和10 000张测试图像。分为图片和标签,图片为28*28的像素矩阵,标签是0~9数字。
在这里插入图片描述
该数据集非常小,很适合图像识别的入门使用,该数据集一共有4个文件,分别是训练数据和其对应的标签,测试数据和其对应的标签.文件如表所示:

文件名称 大小 说明
train-images-idx3-ubyte 9.9M 训练数据图片,60,000条数据
train-labels-idx1-ubyte 28.9K 训练数据标签,60,000条数据
t10k-images-idx3-ubyte 1.6M 测试数据图片,10,000条数据
t10k-labels-idx1-ubyte 4.5K 测试数据标签,10,000条数据

任务:将手写数字的灰度图像划分到10个类别。
官方一共提供了3个分类器,分别是Softmax回归,多层感知器,卷积神经网络LeNet-5,在图像识别问题上,一直是使用卷积神经网络较多。

第一步:准备数据

在百度AI Studio启动环境,进入Notebook界面,可以直接运行程序,无需再在其他编辑器上试运行。
导入依赖包:

#导入需要的包
import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as plt
import os

train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(),buf_size=512),batch_size=128)
# paddle.dataset.mnist.train()或test()接口已经为我们对图片进行了灰度处理、归一化、居中处理等处理。
test_reader = paddle.batch(paddle.dataset.mnist.test(),batch_size=128)

第二步:定义神经网络-卷积神经网络LeNet-5

# coding=utf-8
import paddle.v2 as paddle

# 卷积神经网络LeNet-5,获取分类器
def convolutional_neural_network():
    # 定义数据模型,数据大小是28*28,即784
    img = paddle.layer.data(name="pixel",type=paddle.data_type.dense_vector(784))
    # 第一个卷积--池化层
    conv_pool_1 = paddle.networks.simple_img_conv_pool(input=img,filter_size=5,num_filters=20,num_channel=1,pool_size=2,pool_stride=2,act=paddle.activation.Relu())
    # 第二个卷积--池化层
    conv_pool_2 = paddle.networks.simple_img_conv_pool(input=conv_pool_1,filter_size=5,num_filters=50,num_channel=20,pool_size=2,pool_stride=2,act=paddle.activation.Relu())
    # 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10
    predict = paddle.layer.fc(input=conv_pool_2,size=10,act=paddle.activation.Softmax())
    return predict

第三步:初始化paddle

class TestMNIST:
    def __init__(self):
        # 该模型运行在CUP上,CUP的数量为2
        paddle.init(use_gpu=False, trainer_count=2)

第四步:获取训练器

# *****************获取训练器********************************
def get_trainer(self):

    # 获取分类器
    out = convolutional_neural_network()

    # 定义标签
    label = paddle.layer.data(name="label",type=paddle.data_type.integer_value(10))

    # 获取损失函数
    cost = paddle.layer.classification_cost(input=out, label=label)

    # 获取参数
    parameters = paddle.parameters.create(layers=cost)

    """
    定义优化方法
    learning_rate 迭代的速度
    momentum 跟前面动量优化的比例
    regularzation 正则化,防止过拟合
    :leng re
    """
    optimizer = paddle.optimizer.Momentum(learning_rate=0.1 / 128.0,momentum=0.9,regularization=paddle.optimizer.L2Regularization(rate=0.0005 * 128))
    '''
    创建训练器
    cost 损失函数
    parameters 训练参数,可以通过创建,也可以使用之前训练好的参数
    update_equation 优化方法
    '''
    trainer = paddle.trainer.SGD(cost=cost,parameters=parameters,update_equation=optimizer)
    return trainer

第五步:开始训练

# *****************开始训练********************************
def start_trainer(self):
    # 获取训练器
    trainer = self.get_trainer()

    # 定义训练事件
    def event_handler(event):
        lists = []
        if isinstance(event, paddle.event.EndIteration):
            if event.batch_id % 100 == 0:
                print "\nPass %d, Batch %d, Cost %f, %s" % (
                    event.pass_id, event.batch_id, event.cost, event.metrics)
            else:
                sys.stdout.write('.')
                sys.stdout.flush()
        if isinstance(event, paddle.event.EndPass):
            # 保存训练好的参数
            model_path = '../model'
            if not os.path.exists(model_path):
                os.makedirs(model_path)
            with open(model_path + "/model.tar", 'w') as f:
                trainer.save_parameter_to_tar(f=f)

            result = trainer.test(reader=paddle.batch(paddle.dataset.mnist.test(), batch_size=128))
            print "\nTest with Pass %d, Cost %f, %s\n" % (event.pass_id, result.cost, result.metrics)
            lists.append((event.pass_id, result.cost, result.metrics['classification_error_evaluator']))

    # 获取数据
    reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=20000),
                          batch_size=128)
    '''
    开始训练
    reader 训练数据
    num_passes 训练的轮数
    event_handler 训练的事件,比如在训练的时候要做一些什么事情
    '''
    trainer.train(reader=reader,
                  num_passes=100,
                  event_handler=event_handler)

主函数:

if __name__ == "__main__":
    testMNIST = TestMNIST()
    # 开始训练
    testMNIST.start_trainer()

参考博客:

  1. 手写数字识别之卷积神经网络
  2. 手写识别之多层传感器神经网络
  3. softmax回归
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!