第一周学习:深度学习和pytorch基础

目录

第一周学习:深度学习和pytorch基础

Part 1:视频学习:

1. 绪论:

2. 深度学习概述:

Part 2:代码练习:

1. pytorch基础练习:

​2. 螺旋数据分类:

Part3 遇到的问题


Part 1:视频学习:

1. 绪论:

1.1 人工智能

人工智能:使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统

人工智能的三个层面:计算智能(快速计算、记忆存储;代表:深蓝:暴力穷举)、感知智能(模仿听觉、视觉、触觉等人的感知能力,目前人工智能阶段)、认知智能(逻辑推理、知识理解、决策思考)

人工智能(领域、目标)>机器学习(实现目标的一类方法)>深度学习(机器学习这一类方法中的一小点)


1.2 机器学习与专家系统对比

机器学习两种方向:逻辑演绎vs归纳总结

知识工程/专家系统 vs 机器学习

知识工程/专家系统:根据专家定义的知识和经验,进行推理和判断,从而模拟人类专家的决策过程来解决问题。即需专业人员提前人工定义规则。

机器学习:通过提前标注好的训练样本,由机器自动训练出模型确定某准则,从而通过该准则解决问题。


1.3 机器学习

机器学习的应用领域:计算机视觉、语音技术、自然语言处理

机器学习定义:最常用定义:计算机系统能够利用经验提高自身的性能

                         可操作定义:机器学习本质是一个基于经验数据的函数估计问题

                         统计学定义:提取重要模式、趋势,并理解数据,即从数据中学习

是否用机器学习:问题规模是否很大->规则是否复杂->是否有足够的数据->是否有有意义的模式去提取->是否是解析解问题

机器学习三要素:模型、策略、方法(机器学习主要解决前两部分问题)

模型分类:

参数模型 非参数模型
优点 数据需求量少、训练迅速

对数据适应性强,

可拟合不同的函数形式

缺点

模型复杂度有限,

与真实目标函数拟合度小

数据需求大、容易过拟合
生成模型
优点

提供更多信息(建模边缘分布->采样生成样本)

样本量大时,更快收敛到真实分布
支持复杂训练情况(无监督训练、存在隐变量时)

缺点

数据需求大

预测类问题准确率通常不如判别模型


1.4 机器学习、深度学习、神经网络的发展变革

传统机器学习 VS 深度学习

机器学习、深度学习历史:单层感知器算法(无法处理异或问题)-低潮-BP算法-第一次热潮-支持向量机模型-低潮-深度学习-第二次高潮

神经网络结构的发展:


1.5 深度学习的不能

深度学习三要素:大数据、算法、计算力

深度学习的10点挑战:

(1) is data hungry(需要大数据训练)
(2) is shallow & has limited capacity for transfer(较浅且不能充分迁移)
(3) has no natural way to deal with hierarchical structure(没有自然化的能力去处理层次结构)
(4) has struggled with open-ended inference(一直想解决开放式推理问题而不能)
(5) is not sufficiently transparent(不够有效透明,神经网络知识表达是黑箱)
(6) has not been well integrated with prior knowledge(不能很好地将先验知识结合到算法中)
(7) cannot inherently distinguish causation from correlation(无法从本质上区分因果关系和相关性)
(8) presumes a largely stable world, in ways that may be problematic(只依赖于特定的环境假设,而实际可能实时变化)
(9)its answer often cannot be fully trusted(由于是对数据基于概率的逼近拟合,结果不能完全使人信服)
(10)is difficult to engineer with(不能像其他程序一样对内部结构进行实时debug)

深度学习的6点不能

(1)算法输出不稳定,容易被“攻击”(噪声等)

(2)模型复杂度高,难以纠错和调试

(3)模型层级复合度高,参数不透明(感受野、卷积核复合等)

(4)端到端训练方式对数据依赖性强,模型增量性差(当样本数据量小的时候,深度学习无法体现强大拟合能力;不同问题数据不同标注)

(5)专注直观感知类问题,对开放性推理问题无能为力

(6)人类知识无法有效引入进行监督,机器偏见难以避免(数据也有偏见)

联结主义+符号主义



2. 深度学习概述:

2.1 MP神经元及单层感知器

MP神经元结构:

其中输出函数中f为激活函数

激活函数举例:

特点:

M-P神经元的权重预先设置,无法学习;而单层感知器是首个可以学习的人工神经网络。

但单层感知器不能解决最简单的非线性问题即异或问题:

要解决异或问题需通过多个单层感知器构成多层感知器。


2.2 万有逼近定理

(1)如果一个隐层包含足够多的神经元,三层前馈神经网络(输入-隐层-输出)即单隐层神经网络能以任意精度逼近任意预定的连续函数。

(2)当隐层足够宽时,双隐层感知器(输入-隐层1-隐层2-输出)可以逼近任意非连续函数:可以解决任何复杂的分类问题。

原因在于:

对每一层的数学公式y=a(W·x+b),都完成了一个输入到输出的空间变换,其中:

W·x完成的是升维/降维、放大/缩小及旋转操作,而b完成的是平移操作,二者都是线性转换,而激活函数a则完成的是弯曲操作,实现了非线性转换。

增加节点数:增加维度,即增加线性转换能力。

增加层数:增加激活函数的次数,即增加非线性转换次数。


2.3 多层神经网络

在神经元总数相当的情况下,增加网络深度可以比增加宽度带来更强的网络表示能力:产生更多的线性区域

据上式可知深度和宽度对函数复杂度的贡献是不同的,深度的贡献是指数增长的,而宽度的贡献是线性的。

但当层数过多,反而会出现长时间训练也训练不出的情况,究其原因是因为出现了梯度消失

为理解出现上述情况的原因,我们首先来了解多层神经网络进行参数学习的过程:

前馈神经网络(以三层为例):

前一层的输出作为后一层的输入通过线性变化和激活输出,最终获得输出结果y,而y与真实值Y之间存在损失值L。而参数沿负梯度方向更新可以使L下降 ,这也即梯度下降法。

我们定义残差:

则红色部分即反向传播部分,将残差写成与前馈类似的样子,则损失函数在参数方向的偏导也就如下

Sigmoid激活函数的导数为:

很容易落到饱和区内导致该导数非常小,接近于0。

导致在反向传播过程中该梯度变为0,也即梯度消失,导致前面隐层不能得到有效更新。

自编码器,受限玻尔兹曼机




Part 2:代码练习:

1. pytorch基础练习:

PyTorch是一个python库,它主要提供了两个高级功能:1、GPU加速的张量计算 2、构建在反向自动求导系统上的深度神经网络

(1)定义数据:一般定义数据使用torch.Tensor , tensor的意思是张量,是数字各种形式的总称;

Tensor支持各种各样类型的数据,包括:

torch.float32, torch.float64, torch.float16, torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64

创建Tensor有多种方法,包括:ones(1), zeros(0), eye(单位矩阵), arange, linspace(从start到end,均匀切分成steps份), rand, randn(标准分布), normal(正态分布), uniform, randperm(随机排列)

import torch# 可以是一个数
x = torch.tensor(710)
# 可以是一维数组(向量)
y = torch.tensor([1,2,3,4,5,6])
# 可以是二维数组(矩阵)
z = torch.ones(2,3)
# 可以是任意维度的数组(张量)
m = torch.zeros(2,3,4)
print(x)
print(y)
print(z)
print(m)

(2)定义操作:

凡是用Tensor进行各种运算的,都是Function

最终,还是需要用Tensor来进行计算的,计算无非是

  • 基本运算,加减乘除,求幂求余
  • 布尔运算,大于小于,最大最小
  • 线性运算,矩阵乘法,求模,求行列式

基本运算包括: abs/sqrt/div/exp/fmod/pow ,及一些三角函数 cos/ sin/ asin/ atan2/ cosh,及 ceil/round/floor/trunc 等

布尔运算包括: gt/lt/ge/le/eq/ne,topk, sort, max/min

线性计算包括: trace, diag, mm/bmm,t,dot/cross,inverse,svd 等

import torch
from matplotlib import pyplot as plt
plt.hist(torch.randn(100).numpy(), 100);

import torch
from matplotlib import pyplot as plt
plt.hist(torch.randn(10**9).numpy(), 100);

2. 螺旋数据分类:

尝试解决螺旋分类 sprial classification 问题:

先初始化数据并可视化出来:

X 可以理解为特征矩阵,Y可以理解为样本标签。 结合代码可以看到,X的为一个 NxC 行, D 列的矩阵。C 类样本,每类样本是 N个,所以是 N*C 行。每个样本的特征维度是2,所以是 2列。

在 python 中,调用 zeros 类似的函数,第一个参数是 y方向的,即矩阵的行;第二个参数是 x方向的,即矩阵的列

!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)

分别构建线性模型和两层神经网络进行分类:

1、线性模型:

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()
print(y_pred.shape)
print(y_pred[10, :])
print(score[10])
print(predicted[10])
# Plot trained model
print(model)
plot_model(X, Y, model)

上面使用 print(model) 把模型输出,可以看到有两层:

  • 第一层输入为 2(因为特征维度为主2),输出为 100;
  • 第二层输入为 100 (上一层的输出),输出为 3(类别数)

线性模型很难对非线性数据分布问题分类。

2、两层神经网络:

learning_rate = 1e-3
lambda_l2 = 1e-5# 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
model = nn.Sequential(nn.Linear(D, H),nn.ReLU(),nn.Linear(H, C)
)
model.to(device)# 下面的代码和之前是完全一样的,这里不过多叙述
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in 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)# zero the gradients before running the backward pass.optimizer.zero_grad()# Backward pass to compute the gradientloss.backward()# Update paramsoptimizer.step()
# Plot trained model
print(model)
plot_model(X, Y, model)

可以看到在两层神经网络里加入 ReLU 激活函数以后,分类的准确率得到了显著提高。

主要是激活函数提供了非线性变换。

改变激活函数:

(1)使用sigmoid函数,输出结果:

(2)使用Tanh函数:

(3)使用LeakyReLU函数:

ReLU、Sigmoid、Tanh、LeakyReLU准确率分别为:92.6%、51.9%、85.1%和95.9, LeakyReLU准确率最高。



Part3 遇到的问题

1、创建tensor时,虽然torch.Tensor也能通torch.tensor一样创建,但是两者创建的数据类型不同:

import torchx = torch.Tensor([1,2,3])
print(x)
print(x.dtype)
y = torch.tensor([1,2,3])
print(y)
print(y.dtype)

输出为:

原因查得:首先torch.Tensor()是类,而torch.tensor()是函数,其次,torch.Tensor()会将数组转化为tensor默认的类型。

另外查得还有torch.from_numpy(),torch.as_tensor()的创建tensor形式,且如果用数组赋值给tensor的话,这两种创建方式与原数组共享内存,更为节省。但torch.as_tensor()既能接受numpy数组,也能接收list,而torch.from_numpy()只能接收numpy数组。

2、在进行每一次的反向传播前要进行梯度清零。

知乎上说是因为梯度在计算时会进行累加,从而扩大batchsize,降低显存的使用要求。这里不是很明白

3、Sigmoid因为导数存在饱和区所以在多层神经网络中随着层数增多,准确率会降低,但是这次进行螺旋分类的为两层神经网络,为何Sigmoid表现这么差呢?

OUC暑期培训(深度学习)——第一周学习记录:深度学习和pytorch基础相关推荐

  1. 201671010140. 2016-2017-2 《Java程序设计》java学习第一周

       java学习第一周        本周是新学期的开端,也是新的学习进程的开端,第一次接触java这门课程,首先书本的厚度就给我一种无形的压力,这注定了,这门课程不会是轻松的,同时一种全新的学习方 ...

  2. 掉进悬崖的小白,捡到python基础秘籍,学习第一周——语法基础,小游戏,无脑循环

    掉进悬崖的小白,捡到python基础秘籍,学习第一周--语法基础,小游戏,无脑循环 人生苦短,我用python 语言的种类: 语言的发展: 什么是python 搭建 Python开发环境: 集成开发环 ...

  3. Datacamp 学习第一周

    Datacamp 学习第一周总结 Intro to Python for Data Science 列表 numpy package 字典 pandas comparision operators l ...

  4. 我的JAVA学习第一周知识总结,个人感受小结

    JAVA学习第一周 1,了解三种开发模型 2,建包.建类的规范格式 3,了解不同数据类型 4,JAVA环境搭建 5,JVM.JRE.JDK是什么 6,if/else if语句的使用 7,各个语句swi ...

  5. 前端学习第一周-计算机基础,html标签的介绍,其中包括列表,表格以及表单的使用

    前端学习第一周-HTML基础 文章目录 前端学习第一周-HTML基础 前言 DAY 1 计算机组成 计算机网络 DAY 2 vscode快捷方式 HTML骨架 DAY 3 HTML属性 HTML标签 ...

  6. python学习第一周总结

    python学习第一周总结 一.Markdown语法 Markdown是一种轻量级标记语言,排版语法简洁,它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本身的 . ...

  7. 宿舍管理系统第一周项目记录

    0.第一周项目进度记录 Author:王忠舟 项目题目:设计一个宿舍管理系统. 1.学生的基本信息: 入校时,每位同学都有唯一的学号,并被分配到指定的宿舍楼和指定的宿舍,也会有一个宿舍号,其入校时间就 ...

  8. PaddlePaddle课程学习第一周笔记

    人工智能.机器学习.深度学习的关系 机器学习的过程分为假设.评价和优化三个阶段: 假设:通过观察加速度a和作用力F的观测数据,假设aaa和FFF是 线性关系,即a=w∗Fa = w * Fa=w∗F. ...

  9. Java学习第一周总结

    201711671227<Java程序设计>第一周学习总结 教材学习内容总结 主要学习了如何下载及安装Java,如何调试环境变量,系统变量等,其次更为重要的是掌握了使用Java来编译运行程 ...

最新文章

  1. 微信公众号H5订阅消息开发 uniapp订阅消息
  2. 通过OKR 进行项目过程管理
  3. Flex embed XML and Icon
  4. matlab 编译 java_MATLAB编译器运行时(MCR)编译器
  5. windows xp 下使用 windows 2003的远程桌面
  6. 2021年宣城市高考成绩查询,宣城高考成绩查询入口
  7. DirectUI的初步分析-转
  8. 为何要进入互联网行业做产品经理?
  9. python requests text content_python 3 关于requests库的 text / content /json
  10. 删除xcode中的描述文件的路径
  11. 开源免费录屏和直播软件OBS Studio教程
  12. markdown文档插入表情符号支持的英文单词大全 官方
  13. swift语言前景_席勒谈Swift语言:它的发展远远超出预期
  14. GraphQL简介及入门
  15. 使用MySQL管理工具-SQLyog 9.63报错号码2058,超详细解析
  16. 喝一碗孟婆汤,走一回奈何桥(FLASH转载)
  17. 安装mathtype时找不到文件mathpage.wil
  18. 从ARM9到A15 手机处理器架构进化历程
  19. sketch适合于做原型吗_适用于Sketch,Photoshop,Illustrator,XD和Figma的畅销UX和UI套件
  20. 西班牙语dele等级_西班牙语DELE考试不同等级到底是什么水平?

热门文章

  1. 如何在Fcpx中卸载安装效果,标题,转场等FCPX模板插件
  2. 计算机本科毕业论文要求,计算机科学与技术学院本科毕业设计(论文)规范(试行)...
  3. ksps什么单位_采样频率Hz 采样率KSPS或MSPS,两种单位的换算关系
  4. border 边框样式
  5. 取整取余(模)知多少?
  6. playbook中的block rescue always
  7. 【睡眠障碍】睡觉前数绵羊对睡眠障碍没有作用
  8. SQL零基础入门学习(十三)
  9. 渐进式 Web 应用程序介绍
  10. 服务器和客户端信息的获取