深度学习七日打卡营-Day(01)基础知识介绍

写在前面:参加paddlepaddle深度学习七日打卡营是在20年的寒假,当时作为大二的我听的一头雾水,后来才发现,深度学习真的是计算机专业的必备技能啊!!!回来恶补一下

附课程链接:深度学习七日打卡营

深度学习七日打卡营第一天

  • 1.深度学习介绍
    • 1.1课程简介
    • 1.2 实践必备
    • 1.3浅话深度学习
    • 1.4 神经网络
  • 二、深度学习万能公式
  • 三、使用paddle进行手写数字识别
    • 1.引入相关库
    • 2.数据准备及预处理
      • 2.1查看数据集
    • 3.模型选择和开发
      • 3.1 优化器的配置
    • 4 模型评估测试
      • 4.1 模型评估
      • 4.2 模型预测
      • 4.3 batchsize单张图片预测
  • 5.模型部署
  • 总结:


1.深度学习介绍

1.1课程简介

学习这门课能学到什么呢?如图
深度学习七日打卡营-Day(01)基础知识介绍_第1张图片

1.2 实践必备

深度学习七日打卡营-Day(01)基础知识介绍_第2张图片
本课程采用Python语言及paddlepaddle框架,不会python语言的可以试试飞浆的另一门课程:Python小白逆袭大神

学过一点java和C数据结构的我强装上阵

1.3浅话深度学习

深度学习七日打卡营-Day(01)基础知识介绍_第3张图片
通俗来讲,同人类认识外界事物的原理相类似,机器学习也是通过对大量数据的认知训练来建立模型,从而预测未知属性,而与人类认知外界不同的是,机器学习主要是寻找一个最优的function来进行数学运算
深度学习七日打卡营-Day(01)基础知识介绍_第4张图片

而与机器学习通过人为提取特征,进行数据处理不同的是,深度学习通过神经网络自动提取特征参数,通过python语言+深度学习框架的方式,深度学习无疑大大降低了入门的门槛

深度学习七日打卡营-Day(01)基础知识介绍_第5张图片

1.4 神经网络

深度学习七日打卡营-Day(01)基础知识介绍_第6张图片

神经网络仿照人类的神经而得名,其本质是一个个线性方程,其一般表示形式为y=w*x+b,其中a为系数,b为偏置项

深度学习七日打卡营-Day(01)基础知识介绍_第7张图片

如图,通过一层层神经元的计算,得到数组,与实际值比较,并反向传播,进行神经元的参数更新。

二、深度学习万能公式

深度学习七日打卡营-Day(01)基础知识介绍_第8张图片

深度学习七日打卡营-Day(01)基础知识介绍_第9张图片
一般包括数据的选取,特征的处理,模型的选择,而后进行参数调优,部署上线

深度学习七日打卡营-Day(01)基础知识介绍_第10张图片
如图,进行参数更新,达到模型的最优值

三、使用paddle进行手写数字识别

1.引入相关库

import paddle
import numpy as np//numpy数组朝左
import matplotlib.pyplot as plt//python画图库

paddle.__version__//查看paddle版本
‘当前版本为’2.0.2’

2.数据准备及预处理

通过下载已经有的数据集MNIST进行训练

import paddle.vision.transforms as T//引入transformsAPI

//数据的加载和预处理
transform = T.Normalize(mean=[127.5], std=[127.5])//设置均值为127.5,方差是127.5,把像素点归一到[-1,1]的区间

//训练数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)

//评估数据集
eval_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)

print('训练集样本量: {},验证集样本量: {}'.format(len(train_dataset), len(eval_dataset)))
训练集样本量: 60000,验证集样本量: 10000

2.1查看数据集

print('图片:')
print(type(train_dataset[0][0]))//抽取第一张图片
print(train_dataset[0][0])
print('标签:')
print(type(train_dataset[0][1]))
print(train_dataset[0][1])



plt.figure()//matplotlib.pyplot库,形成画布
plt.imshow(train_dataset[0][0].reshape([28,28]), cmap=plt.cm.binary)
plt.show()//展示

深度学习七日打卡营-Day(01)基础知识介绍_第11张图片
如图,图片的像素被归一化到[-1,1]区间,原始像素为[0,255]。

3.模型选择和开发

深度学习七日打卡营-Day(01)基础知识介绍_第12张图片

因为是刚接触深度学习,故我们采用最常用的全连接方式,输入层为 28 * 28像素的图像,故大小为784
其与隐层全连接,输出层为10(0到9十个数字),其中隐层大小为自己设置

采用Sequential接口的方式,进行搭积木式的参数设置

network = paddle.nn.Sequential(
    paddle.nn.Flatten(),           // 拉平,将 (28, 28) => (784)
    paddle.nn.Linear(784, 512),    //隐层:线性变换层
    paddle.nn.ReLU(),              // 激活函数,进行非线性变化,方便梯度计算
    paddle.nn.Linear(512, 10)      // 输出层
)
// 模型封装
model = paddle.Model(network)//封装已经设置好的网络结构

//模型可视化
model.summary((1, 28, 28))

深度学习七日打卡营-Day(01)基础知识介绍_第13张图片
参数个数、形状一目了然

3.1 优化器的配置

//配置优化器、损失函数、评估指标
model.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=network.parameters()),//学习率以及训练参数
              paddle.nn.CrossEntropyLoss(),//损失函数
              paddle.metric.Accuracy())//评估指标
              
// 启动模型全流程训练
model.fit(train_dataset,  // 训练数据集
          eval_dataset,   //评估数据集
          epochs=5,       // 训练的总轮次,共训练5轮
          batch_size=64,   // 训练使用的批大小 每一批训练量为 总量除以批大小
          verbose=1)      // 日志展示形式,1为条形展示

深度学习七日打卡营-Day(01)基础知识介绍_第14张图片

4 模型评估测试

4.1 模型评估


//模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)

print(result)

深度学习七日打卡营-Day(01)基础知识介绍_第15张图片
模型准确率达到0.9742

4.2 模型预测


// 进行预测操作
import random
result = model.predict(eval_dataset)//验证集

//定义画图方法
def show_img(img, predict):
    plt.figure()
    plt.title('predict: {}'.format(predict))
    plt.imshow(img.reshape([28, 28]), cmap=plt.cm.binary)
    plt.show()

// 抽样展示,随机验证十张图片
indexs=[]
i=10
while  i>0:
    a=random.randint(0,10000)
    indexs.append(a)
    i=i-1
print(indexs)
for idx in indexs:
    show_img(eval_dataset[idx][0], np.argmax(result[0][idx]))

深度学习七日打卡营-Day(01)基础知识介绍_第16张图片

4.3 batchsize单张图片预测


//读取单张图片
image = eval_dataset[501][0]

// 单张图片预测
result = model.predict_batch([image])

//可视化结果
show_img(image, np.argmax(result))

5.模型部署


//用于后续继续调优训练的模型
model.save('finetuning/mnist')

深度学习七日打卡营-Day(01)基础知识介绍_第17张图片
如图,在finetuning文件夹下
模型继续训练

from paddle.static import InputSpec


//模型封装,为了后面保存预测模型,这里传入了inputs参数
model_2 = paddle.Model(network, inputs=[InputSpec(shape=[-1, 28, 28], dtype='float32', name='image')])//-1表示任意大小输入

// 加载之前保存的阶段训练模型
model_2.load('finetuning/mnist')

//模型配置
model_2.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=network.parameters()),
                paddle.nn.CrossEntropyLoss(),
                paddle.metric.Accuracy())

// 模型全流程训练
model_2.fit(train_dataset, 
            eval_dataset,
            epochs=2,
            batch_size=64,
            verbose=1)

保存预测

//保存用于后续推理部署的模型
model_2.save('infer/mnist', training=False)

深度学习七日打卡营-Day(01)基础知识介绍_第18张图片

总结:

第一天的恶补到此就结束啦,对深度学习架构以及高层API有了一定了解,再接再厉。

你可能感兴趣的:(深度学习)