本篇主要是各类模型的基本介绍及应用,不涉及深层技术。

学习视频指路→B站指路

代码实践指路→代码指路

课件获取:通过百度网盘分享的文件:PyTorch深…
链接:https://pan.baidu.com/s/1iSY7LgEigOWUWEBLmN1j0A?pwd=ect0 
提取码:ect0
复制这段内容打开「百度网盘APP 即可获取」

目录

正文开始:

1.Overview

2.线性模型

3.梯度下降算法

4.反向传播

5.用PyTorch实现线性回归

6.逻辑斯蒂回归

7.处理多维特征的输入

8.加载数据集

9.多分类问题

10.卷积神经网络(基础篇)

11.卷积神经网络(高级篇)

12.循环神经网络(基础篇)

13.循环神经网络(高级篇)


正文开始:

1.Overview

第一讲比较浅显只讲部分

Figure.1 学习系统发展

学习系统的发展:

1.基于规则的系统:输入→手动设计程序→输出

设计程序时需要人工制定规则,就要专业背景知识,但是容易遗漏规则,导致系统性能不佳。

2.经典机器学习系统:输入→手动提取特征(张量)→映射函数y=f(x)→输出

3.表示学习:

输入→提取特征(张量)→映射函数y=f(x)→输出

深度学习:输入→简单特征→额外层提取特征→映射函数y=f(x)(多层神经网络)→输出

Figure.2 sk-learn官方算法路径

路径关键点:样本量?分类问题?预测量级?等

2.线性模型

一般模型训练过程:1.准备数据集。2.选择适合模型。3.根据测试数据训练模型。4.推理及运用。

我们的数据集一般分两部分,用于训练的训练数据和用于预测的测试数据。但是我们怎么评估这个模型是否可以达到评估标准,我们可以再将训练集分成普通训练集和开发集(用来评估模型)。

看下图,是一个线性模型的例子:

上图中,红色的线是我们的真实无差别的模型(现实不容易存在这么简单的模型),两条蓝色的线是我们随机random出来的模型结果,我们需要将random出来的线性模型和真实数据做对比,看他们之间的差异,当然差异越小,我们的模型越准确。那怎么计算差异呢?

·        我们引入一个Loss损失的概念,损失函数我们常用的是预测结果和真实结果做差,但也有其他算法,所以写论文的时候一定要定义清楚你的Loss函数。

注意:上图中y hat就是我们随机定义模型的预测结果。这里的Loss取平方主要是为了结果取正值。

由Loss我们引出一个MSE(平均平方误差)的概念,由上图可以看出,他是一组参数模型或者说是一个随机模型的误差平均值。用MSE就可以选出损失最小的模型。

线性模型例子:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D#这里设函数为y=3x+2
x_data = [1.0,2.0,3.0]
y_data = [5.0,8.0,11.0]def forward(x):return x * w + bdef loss(x,y):y_pred = forward(x)return (y_pred-y)*(y_pred-y)mse_list = []
W=np.arange(0.0,4.1,0.1)
B=np.arange(0.0,4.1,0.1)
[w,b]=np.meshgrid(W,B)l_sum = 0
for x_val, y_val in zip(x_data, y_data):y_pred_val = forward(x_val)print(y_pred_val)loss_val = loss(x_val, y_val)l_sum += loss_valfig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w, b, l_sum/3)
plt.show()

输出结果:

3.梯度下降算法

在我们构建模型时,需要找到损失函数最小的点来确定最佳模型,如何确定最小损失值,见下图。

Figure3.1

通过不断更新权值w,来选取最小损失。

那么为什么需要采用梯度下降算法,先解释什么是梯度,梯度可以说是求导值/斜率等,当我们知道这个cost与w的变化趋势(斜率)时,你就知道我们w应该往何处变化。比如下图,当他的梯度大于0,说明此处是增函数,趋势上升,w越大,cost越大,所以我们应该降低w。

Figure3.2

GD梯度下降算法:

import matplotlib.pyplot as plt# prepare the training set
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]# initial guess of weight
w = 1.0# define the model linear model y = w*x
def forward(x):return x*w#define the cost function MSE
def cost(xs, ys):cost = 0for x, y in zip(xs,ys):y_pred = forward(x)cost += (y_pred - y)**2return cost / len(xs)# define the gradient function  gd
def gradient(xs,ys):grad = 0for x, y in zip(xs,ys):grad += 2*x*(x*w - y)return grad / len(xs)epoch_list = []
cost_list = []
print('predict (before training)', 4, forward(4))
for epoch in range(100):cost_val = cost(x_data, y_data)grad_val = gradient(x_data, y_data)w-= 0.01 * grad_val  # 0.01 learning rateprint('epoch:', epoch, 'w=', w, 'loss=', cost_val)epoch_list.append(epoch)cost_list.append(cost_val)print('predict (after training)', 4, forward(4))
plt.plot(epoch_list,cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show() 

结果:

事实情况是,我们很少遇到图3.2这样平滑的损失函数,我们的真实损失函数很可能是坑坑洼洼的,在局部他是一个最低点,但是全局却不是最低点。所以我们一般采用随机梯度下降(SGD)。

这样选取的就不是连续的平均值而是随机的一组损失值,避免入坑出不来。和梯度下降不同的就只有上图的更新权重和偏导不同,其他都一致。

SGD:

import matplotlib.pyplot as pltx_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]w = 1.0def forward(x):return x*w# calculate loss function
def loss(x, y):y_pred = forward(x)return (y_pred - y)**2# define the gradient function  sgd
def gradient(x, y):return 2*x*(x*w - y)epoch_list = []
loss_list = []
print('predict (before training)', 4, forward(4))
for epoch in range(100):for x,y in zip(x_data, y_data):grad = gradient(x,y)w = w - 0.01*grad    # update weight by every grad of sample of training setprint("\tgrad:", x, y,grad)l = loss(x,y)print("progress:",epoch,"w=",w,"loss=",l)epoch_list.append(epoch)loss_list.append(l)print('predict (after training)', 4, forward(4))
plt.plot(epoch_list,loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show() 

结果:

发现更新(训练)的更快。

4.反向传播

这一讲我觉得是可以和上一讲梯度下降合并来讲,什么是反向传播?上图中红色箭头就是反向传播的,其实就是个求偏导的过程,根据反向正负来更新新一轮的权值的过程。

这里插一句,什么情况下才代表你的模型训练的差不多了,就是函数收敛,不会有大变化的时候,模型就训练完毕,如果继续下去就容易过拟合,导致真实预测不准。

此处代码就不贴了,如果需要可点这里

5.用PyTorch实现线性回归

正题来了,利用PyTorch来写模型。过程见上图。代码对应见下图。

这一讲和第二讲的线性模型基本没差,只不过把求损失和优化直接调用PyTorch包中方法,十分简便。PS:1.一般定义模型时,我们需要定义一个类,后续如果要使用就直接实例化。2.在反向传播之前一定要手动梯度清零。

6.逻辑斯蒂回归

分类问题讨论的是该输入属于某个类别的概率是多少。

逻辑斯蒂回归我们采用了sigmoid(用符号来表示)算法,具体算法见下。

将w*x+b替换上式中的x。

代码变化见下图:仅多了一个sigmoid调用。

逻辑斯蒂回归有一个特点,就是他通过sigmoid算法,最后求出的结果只会在0-1之间。

7.处理多维特征的输入

我们前面几讲的例子在降维处理上只有一层变换,都是输入1维输出1维。但如果我们对数据有多维处理,之前做法就不恰当。

由上图可以看出,现在需要将8维输入变成1维输出,中间经过了三层线性变换,代码和之前比也只需要多加两个线性模型。其余处理不变。

8.加载数据集

前几讲的数据集都是我们自己加到代码里的,如果处理多数据,那就需要有专门文件去存储。这一讲就说如何加载文件中数据,怎么处理。

本小节术语:Epoch:训练轮数;Batch-Size:一批样本组里有多少个样本;Iteration:有多少个样本组。

shuffle:自动打乱样本顺序。(一般情况下只对训练集进行shuffle处理,对于测试集还是按顺序输出)

相关代码:(Linux系统下的,如果是windows系统最下面的for in在记得封装在if main里,具体见注释。)

import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader# prepare datasetclass DiabetesDataset(Dataset):def __init__(self, filepath):xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)self.len = xy.shape[0] # shape(多少行,多少列)self.x_data = torch.from_numpy(xy[:, :-1])self.y_data = torch.from_numpy(xy[:, [-1]])def __getitem__(self, index):return self.x_data[index], self.y_data[index]def __len__(self):return self.lendataset = DiabetesDataset('diabetes.csv.gz')
train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True, num_workers=0) #num_workers 多线程# design model using classclass Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()self.linear1 = torch.nn.Linear(8, 6)self.linear2 = torch.nn.Linear(6, 4)self.linear3 = torch.nn.Linear(4, 1)self.sigmoid = torch.nn.Sigmoid()def forward(self, x):x = self.sigmoid(self.linear1(x))x = self.sigmoid(self.linear2(x))x = self.sigmoid(self.linear3(x))return xmodel = Model()# construct loss and optimizer
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# training cycle forward, backward, update
# 如果是windows系统报错,可以用 if __name__ == '__main__':  封装下面for in。
for epoch in range(100):for i, data in enumerate(train_loader, 0): # train_loader 是先shuffle后mini_batchinputs, labels = datay_pred = model(inputs)loss = criterion(y_pred, labels)print(epoch, i, loss.item())optimizer.zero_grad()loss.backward()optimizer.step()

结果,训练的不行loss挺高,得调。这里不做拓展。

9.多分类问题

在每一层线性变换后,我们都需要一个激活函数对上一层的特征进行一个抽出,这里在最后要输出时,我们采用softmax的激活层,softmax其实就需要我们的所有输出概率大于等于0,且总和为一,多用于分类问题。

这个公式就是softmax主公示,表示有k个分类,z是不同层的输出。

举个例子:

那么我们怎么求Loss?

下面开始讲PyTorch应用,实现全封装:

注意:这个torch.nn.CrossEntropyLoss() 将softmax也全封装,所以在调用它之前的最后一步不要再使用激活函数,这就是我们著名的交叉熵损失。

神经网络希望的输入比较小,最好遵从正态分布。

tansform里面将原数据图转成 通道数x宽x高 的形式,然后 归一化Normolize 使用给定前人计算出的合理的均值Mean和标准差std。

这一步构建模型并实例化,下面有个x.view(-1,784)其实就是把输入转换成一个矩阵(行28*列28=784)

这一步,损失计算以及优化器构造。

上图为训练过程,注意grad清零,以及算loss和加.item否则只会画出计算图,而不是数值。

测试,求正确率。

10.卷积神经网络Convolutional Neural Network(CNN-基础篇)

卷积层是为了保留图像的空间特征/结构.

这是我们处理图像经过的一个卷积处理,现在来看具体细节。

卷积内部对应的都是数乘,也就是一一对应相乘。上图就是右下模块与Kernel数乘都出169.

上图为三通道卷积处理后得到单通道的输出。那我们想得到一个多通道的输出,那我们就可以多来几个卷积层,最后合并成一个多通道。见下图。

此处注意:1.每一个卷积盒(filter)的通道数量要和输入通道数量一致。

2.有多少卷积盒,输出就有多少个通道。

PyTorch应用:

这个是会降宽高的卷积计算,如果我们需要输出的宽高和输入一样怎么处理,调节stride步长或者用MaxPool方法处理。

下面是一个例子,步骤清晰明了。

         这是将cpu的东西丢给GPU去跑,加快运行速度。to()就是转移的函数。

下面是结果:

11.卷积神经网络(高级篇)

12.循环神经网络(RNN基础篇)

本小节注意两个要点:1.序列Data的维度。2.循环共享机制

可以处理带有序列的数据,比如自然语言。因为他是顺序处理的。

RNN其实是有线性共享的,下图中的输入层x的维度可以和输出hidden层的维度不一致,但最终都会进行线性变换达成一致。

PS:如果把前面的卷积神经网络和FC(全连接)再结合本章RNN可以实现图片转文本的效果。

将RNN Cell展开:

 利用PyTorch有两种实现方法:

1.定义RNNCell

RNN搞清楚维度就比较好上手,如下图:batch_size=N(有N个x),seqLen表示每一个输入样本的特征个数(序列长度),inputsize表示每一个特征是几维,hiddensize表示每一个隐藏层的维数

2.直接使用RNN模型

下图中num_layers是说RNN有多少层!RNN有多少层,隐藏输出就有多少层。

注意这一句,out是h1-hN的输出,hidden是hN的输出,括号里的inputs是x1-xN的输入,hidden是h0。

下面是这两个输入输出维度对比。

展示一个比较乱,但是很直观的图:

举例:实现转变

不清楚独热(One-Hot)向量怎么来的可以看下边:

整体计算图

接下来,看代码实现:

RNN差别不大,就不贴出来了。这一节的重点是注意输入输出的维度。

13.循环神经网络(高级篇)

《PyTorch深度学习实践》完结合集--B站刘二大人学习总结相关推荐

  1. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  2. 【 数据集加载 DatasetDataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)】

    数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10) 模块介绍 在本节中没有关于数学原理的相关介绍,使用的数据集和类型 ...

  3. 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】

    深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...

  4. 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

    多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...

  5. 【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)

    从有代码的课程开始讨论 [Pytorch深度学习实践]B站up刘二大人之LinearModel -代码理解与实现(1/9) [Pytorch深度学习实践]B站up刘二大人之 Gradient Desc ...

  6. 【Pytorch深度学习实践】B站up刘二大人之 Gradient Descend-代码理解与实现(2/9)

    开篇几句题外话: 以往的代码,都是随便看看就过去了,没有这样较真过,以至于看了很久的深度学习和Python,都没有能够形成编程能力: 这次算是废寝忘食的深入进去了,踏实地把每一个代码都理解透,包括其中 ...

  7. 【刘二大人 - PyTorch深度学习实践】学习随手记(一)

    目录 1. Overview 1.Human Intelligence 2.Machine Learning 3.How to develop learning system? 4.Tradition ...

  8. 《PyTorch深度学习实践》刘二大人 第2讲 线性模型——使用双层for循环完成课后作业

    一.课堂代码 import numpy as np import matplotlib.pyplot as pltx_data = [1.0,2.0,3.0] y_data = [2.0,4.0,6. ...

  9. pytorch学习-刘二大人第一遍

    学习链接: https://www.bilibili.com/video/BV1Y7411d7Ys/?spm_id_from=333.999.0.0 一.线性模型 1.数据集分为 训练集和测试集 2. ...

最新文章

  1. 微软算法100题11 求二叉树中两节点之间的最大距离
  2. linux系统ip策略筛选器,在Linux下基于路由策略的IP地址控制
  3. Android HttpClient post MultipartEntity - Android 上传文件
  4. js中,(function(){})()的用法解析
  5. 【MySQL数据库】一天学完MySQL笔记——纯SQL文档版
  6. vue 执行函数this_vue回调函数中this无效
  7. 智慧、智能图书馆管理平台系统+web端业务数据管理平台+Axure通用web端高保真交互业务数据管理平台+铭牌管理+设备监控+系统管理+内容管理+机构列表管理+用户权限管理+专题管理+服务包管理
  8. Android Studio 修改项目包名(Xposed)
  9. ios实例开发精品文章推荐(8.14)
  10. 软件的黑盒和白盒分析方法
  11. 数组及引用类型内存分配
  12. usb转232串口线驱动android,prolific usb转串口驱动下载
  13. 图像处理之相似图片识别(直方图应用篇)
  14. python新年贺卡_写个新年贺卡生成器,各位小伙伴们新年快乐呀~
  15. win系统C++的udp通信(接收并发送)详细教程、win下inet_pton和inet_ntop无法使用解决方法
  16. HCIA-RoutingSwitching华为认证路由交换工程师(持续更新中2%)
  17. GHM------Gradient Harmonized Single-stage Detector 从梯度的方向来解决样本不均衡的问题
  18. 计算机,我该学什么?
  19. 涅槃重生!字节大牛力荐大型分布式手册,凤凰架构让你浴火成神
  20. 所有的问题最终都会只剩下数学的问题

热门文章

  1. 拯救者r720黑苹果_拯救级手游语音,大象声科助力联想拯救者电竞手机
  2. 超一亿人不按时吃饭!
  3. centos clamav 杀毒安装与应用
  4. 中级计算机技术工程师报名资格,中级软件工程师证书报考条件有哪些要求?
  5. 变电站机器人的控制部分
  6. golang命名规范
  7. 手机ufs测试软件,折腾1000个App UFS 3.0手机极限测试
  8. jupyter kernel
  9. 利用numpy对矩阵进行归一化处理的方法
  10. python 模块 导入机制 模块搜索 Python包 发布python模块或程序