第1周学习:深度学习和pytorch基础
第1周学习:深度学习和pytorch基础
- 一、概念学习
- 1.1关于一些基本问题的思考
- 1.2深度学习基础
- 二、代码练习
- pytorch 基础练习
- 螺旋数据分类问题
一、概念学习
1.1关于一些基本问题的思考
Q1:PyTorch提供GPU加速的张量计算,那么什么是张量?在深度学习中为什么使用张量进行样本的描述与计算?
A1:对于张量的物理意义,这篇文章说的比较清楚《通俗地理解张量》。
而在深度学习中,对于样本的计算进行向量化或者矩阵化是消除代码中显式for循环语句的一种重要方法(对于向量化运算的意义可以参考吴恩达老师的讲解《向量化》)。而作为1阶张量的向量和2阶张量的矩阵在深度学习中是一种非常重要的样本表示方法。PyTorch库中的torch.Tensor类存储了一个矩阵变量,并且有一系列方法用于对这个矩阵进行各种运算,所以用Pytorch来处理深度学习算法非常方便。
Q2:传统机器学习和深度学习的区别与联系
A2:传统机器学习的目的是让机器如何像人的大脑一样去学习,学习的过程就是不断教机器识别特征,并且依靠不断加深的算法能力训练,达到语音识别,人脸识别,图像识别等技术。
深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。总的来说,机器学习更贴近统计学本身,它从大量的数据中发现一个“函数”或“模型”,并通过它来模拟现实世界事物间的关系,从而实现预测、判断等目的。而深度学习则是有很多隐层的神经网络,可以认为是传统神经网络的发展
Q3:神经网络里什么叫正向传播,什么叫反向传播
A3:正向传播:沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量。反向传播:沿着从输出层到输入层的顺序,依次计算并存储神经网络的中间变量和参数的梯度。例如使用梯度下降法不断优化权重就是反向传播的一个例子。
此外,在训练深度学习模型时,正向传播和反向传播相互依赖。一方面,正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度。另一方面,反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的。
Q4:什么是梯度下降法
A4:关于梯度下降法的数学原理可以参考该视频《梯度下降法》。本质是高数中的根据导数求极值点。
而深度学习中梯度下降法用来将误差反向由输出层向输入层传播时对神经元权值进行调整。在这里梯度下降法即是以各个权值为参数求其偏导数,最而获得最小的误差。
Q5:为什么要使用非线性的激活函数?
A5:线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。此时无论网络有多少层,其整体也将是线性的,这会导致失去万有逼近定理的性质。但仅部分层是纯线性是可以接受的,这有助于减少网络中的参数。
Q6:给的demo里为什么要强调随机初始化?
A6:在一个多层的神经网络中,每个隐藏单元的值,是所有输入与其对应权值的乘积之和。如果所有权值都被初始化为0,则所有隐藏单元的值全部为0;如果所有权值都被初始化为相同的其他值,则所有隐藏单元的值全部相等。另一方面,随机初始化使得算法更有可能找到全局最优解。
1.2深度学习基础
人工神经网络
1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征,建立了单个神经元的数学模型(MP模型)
神经元的数学模型推导公式:
万有逼近定理:
如果一个隐层包含足够多的神经元,三层前馈神经网络能以任意精度逼近任意预定的连续函数。
损失函数:
损失函数有助于优化神经网络的参数。我们的目标是通过优化神经网络的参数(权重)来最大程度地减少神经网络的损失。通过神经网络将目标(实际)值与预测值进行匹配,再经过损失函数就可以计算出损失。然后,我们使用梯度下降法来优化网络权重,以使损失最小化。
交叉熵损失函数的公式:
非线性激活函数
(1)sigmoid激活函数
Sigmoid又叫作 Logistic 激活函数,它将实数值压缩进 0 到 1 的区间内,还可以在预测概率的输出层中使用。该函数将大的负数转换成 0,将大的正数转换成 1。对于求导、连续求导、处理二分类问题,一般使用Sigmoid激活函数,因为Sigmoid函数可以把实数域光滑的映射到[0,1]空间。函数值恰好可以解释为属于正类的概率,数学公式为:
图像:
(2)ReLU激活函数
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。 数学公式为:
图像:
神经网络训练的基本流程:
1. 给定训练集同时设置学习率,并初始化网络连接中的所有权值;
将训练集样本作为网络输入,计算网络输出值;
根据损失函数计算网络输出值与实际标签值之间的误差;
根据链式求导法则计算各个权重对输出误差的导数;
根据梯度下降算法更新各个权值;
重复2-5,直到达到收敛条件结束训练。
二、代码练习
pytorch 基础练习
定义数据:
import torch
# 0维张量(数字)
x = torch.tensor(666)
# 1维张量(向量)
x = torch.tensor([1,2,3,4,5,6])
# 2维张量(矩阵)
x = torch.ones(2,3)
# 3维张量
x = torch.ones(2,3,4)
# 创建一个空张量
x = torch.empty(5,3)
# 创建一个随机初始化的张量
x = torch.rand(5,3)
# 创建一个全0的张量,里面的数据类型为 long
x = torch.zeros(5,3,dtype=torch.long)
基本运算:
# 创建一个 2x4 的矩阵
m = torch.Tensor([[2, 5, 3, 7],[4, 2, 1, 9]])
# 返回m中元素的数量
print(m.numel())
# 返回第0行,第2列的数
print(m[0][2])
# 返回第1列的全部元素
print(m[:, 1])
# 返回第0行的全部元素
print(m[0, :])
# 产生一个1维的数组1到4
v = torch.arange(1, 5)
# 向量点乘运算
m @ v
# m的第一行与向量v点乘
m[[0], :] @ v
# 加上一个随机生成的矩阵
m + torch.rand(2, 4)
# 转置,由 2x4 变为 4x2
print(m.t())
# 生成一个从3到8步长为20的矩阵
torch.linspace(3, 8, 20)
#tensor的拼接操作
# 创建两个 1x4 的tensor
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])
# 在 0 方向拼接 (即在 Y 方各上拼接), 会得到 2x4 的矩阵
print( torch.cat((a,b), 0))
tensor([[1., 2., 3., 4.],[5., 6., 7., 8.]])
# 在 1 方向拼接 (即在 X 方各上拼接), 会得到 1x8 的矩阵
print( torch.cat((a,b), 1))
tensor([[1., 2., 3., 4., 5., 6., 7., 8.]])
螺旋数据分类问题
初始化相关
#下载绘图函数到本地。
!wget https://raw.githubusercontent.com/Atcold/pytorch-Deep-Learning/master/res/plot_lib.py
#引入相关库
import random
import torch
from torch import nn, optim
import math
from IPython import display
from plot_lib import plot_data, plot_model, set_default# 因为colab是支持GPU的,torch 将在 GPU 上运行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('device: ', device)# 初始化随机数种子。神经网络的参数都是随机初始化的,
# 不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,
# 因此,在pytorch中,通过设置随机数种子也可以达到这个目的
seed = 12345
random.seed(seed)
torch.manual_seed(seed)N = 1000 # 每类样本的数量
D = 2 # 每个样本的特征维度
C = 3 # 样本的类别
H = 100 # 神经网络里隐层单元的数量
X = torch.zeros(N * C, D).to(device)
Y = torch.zeros(N * C, dtype=torch.long).to(device)
for c in range(C):index = 0t = torch.linspace(0, 1, N) # 在[0,1]间均匀的取10000个数,赋给t# 下面的代码不用理解太多,总之是根据公式计算出三类样本(可以构成螺旋形)# torch.randn(N) 是得到 N 个均值为0,方差为 1 的一组随机数,注意要和 rand 区分开inner_var = torch.linspace( (2*math.pi/C)*c, (2*math.pi/C)*(2+c), N) + torch.randn(N) * 0.2# 每个样本的(x,y)坐标都保存在 X 里# Y 里存储的是样本的类别,分别为 [0, 1, 2]for ix in range(N * c, N * (c + 1)):X[ix] = t[index] * torch.FloatTensor((math.sin(inner_var[index]), math.cos(inner_var[index])))Y[ix] = cindex += 1print("Shapes:")
print("X:", X.size())
print("Y:", Y.size())#显示数据
plot_data(X, Y)
构建线性分类模型
learning_rate = 1e-3
lambda_l2 = 1e-5
# nn 包用来创建线性模型
# 每一个线性模型都包含 weight 和 bias
model = nn.Sequential(nn.Linear(D, H),nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上# nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
criterion = torch.nn.CrossEntropyLoss()# 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)# 开始训练
for t in range(1000):# 把数据输入模型,得到预测结果y_pred = model(X)# 计算损失和准确率loss = criterion(y_pred, Y)score, predicted = torch.max(y_pred, 1)acc = (Y == predicted).sum().float() / len(Y)print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))display.clear_output(wait=True)# 反向传播前把梯度置 0 optimizer.zero_grad()# 反向传播优化 loss.backward()# 更新全部参数optimizer.step()
构建两层神经网络分类
和上面模型不同的是,在两层之间加入了非线性的激活函数:
(1)ReLU 激活函数
model = nn.Sequential(nn.Linear(D, H),nn.ReLU(),nn.Linear(H, C)
)
效果:
(2)ELU激活函数
model = nn.Sequential(nn.Linear(D, H),nn.ELU(),nn.Linear(H, C)
)
效果:
(3)Sigmoid激活函数
model = nn.Sequential(nn.Linear(D, H),nn.Sigmoid(),nn.Linear(H, C)
)
效果:
(4)GELU激活函数
model = nn.Sequential(nn.Linear(D, H),nn.GELU(),nn.Linear(H, C)
)
效果:
(5)PReLU激活函数
model = nn.Sequential(nn.Linear(D, H),nn.PReLU(),nn.Linear(H, C)
)
效果:
第1周学习:深度学习和pytorch基础相关推荐
- 深度学习笔记第二门课 改善深层神经网络 第一周:深度学习的实践层面
本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...
- 深度学习笔记第一门课第一周:深度学习引言
本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...
- 第一周:深度学习引言(Introduction to Deep Learning)
1.1 欢迎(Welcome) 深度学习改变了传统互联网业务,例如如网络搜索和广告.但是深度学习同时也使得许多新产品和企业以很多方式帮助人们,从获得更好的健康关注. 深度学习做的非常好的一个方面就是读 ...
- 动手学习深度学习——Pytorch版教程系列汇总(长期更新版)
动手学习深度学习目录 开发环境配置 1. 基本简介 2. 预备知识 3. 线性神经网络 4. 多层感知器 5. 深度学习计算 6. 卷积神经网络 7. 现代卷积神经网络 8. 循环神经网络 9. 现代 ...
- 动手学习深度学习(总结梳理)——9. Pytorch神经网络基础
目录 1. 层和块 1.1 自定义块 1.2 顺序块 1.3 一些灵活写法的例子(主要是展示写法自由度) 2. 参数管理 2.1 参数访问 2.1.1 目标函数 2.1.2 一次性访问所有参数 2.1 ...
- 01 动手学习深度学习-配置环境pytorch
01 动手学习深度学习-配置环境pytorch 一.需要的配置以及准备 二.安装anaconda 二.安装CUDA: 三.安装CUDNN 四.安装pytorch 五.安装jupyter noteboo ...
- 学习深度学习是否要先学习机器学习?
来源:https://www.zhihu.com/question/382278216 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 作者:图灵的猫 https://www.zhihu.com ...
- 机器学习深度学习加强学习_我如何在9个月内学习深度学习
机器学习深度学习加强学习 There are so many resources out there that can teach you deep learning, and if you are ...
- 如何学习深度学习——我的高质量学习资源列表
深度学习是当下计算机界火得不能再火的研究课题.作为一名计算机人,应当有不断学习当下最前沿技术的觉悟.但问题来了,深度学习领域的入门资料让人看花了眼,我实在不知道该从何学起.刚好在网上看到了Arthur ...
- 0-机器学习-深度学习-入门建议-章浩
1. 我亲自修过的课程及书籍 1.1 数学基础 1.1.1 高数(优化) 1.1.2 线代 统计学中的矩阵代数(方开泰,高教社) 3星,言简意赅,当字典使用 线性代数的几何意义(xxx,西电) 5星, ...
最新文章
- Sqlite表的结构修改
- 堆栈指针ESP和EBP
- 单片机文件系统的学习
- eclipse中birt插件使用_waves教学:如何使用通道条插件在DAW中创建模拟工作流
- 堆与优先队列课内模板
- 正则表达式~~检索匹配的利器
- 【wikioi】1014 装箱问题
- 又看了半天的pdf格式的js方面的书,感觉受益匪浅啊,只会一点操作的我,要学好理论...
- 用python编制一个的类_python之面向对象编制之封装
- Qt网络编程实现TCP通信
- 渲染到纹理(Render To Texture, RTT)详解
- Excel快速实现中英文分列
- vue开发银行流水查询系统--基于巨杉数据库
- windows 查看wifi密码命令
- 【凯子哥带你学Android】Andriod性能优化之列表卡顿——以“简书”APP为例
- 立创商城pcb封装导入
- matlab直流输电,基于MATLAB/Simulink的高压直流输电系统的仿真研究
- Tensorflow③ Keras的LSTM和TF的LSTM实现的源码剖析
- USB-serial驱动分析(usb转串口)
- ACME_Pan-specific_peptide-MHC_class_I_binding_pred
热门文章
- 电脑磁盘里总有个“.Trash-1000”,$recycle.bin文件夹删不掉,好像是装ubuntu双系统留下的。请问怎样删除?
- 二维数组中的查找(杨氏矩阵(C语言+Java))
- 《机器学习实战》决策树的应用
- 微信公众号自定义菜单栏绑定关联小程序
- android 事件分发 view和viewgroup
- 硬盘坏了数据可以恢复吗?一分钟掌握数据恢复
- C# 每天定时执行任务(每天凌晨1点执行)
- php 新浪财经rss,php动态生成xml格式的rss文件
- 迅为触控一体机工业人机界面HMI嵌入式显示屏安卓触摸屏提供商
- 王道考研数据结构代码总结