第一周 深度学习基础

pytorch基础练习

绪论

  1. 从专家系统到机器学习
  2. 从传统机器学习到深度学习
  3. 深度学习的能与不能

深度学习概述

  1. 浅层神经网络:生物神经元到单层感知器,多层感知器,反向传播和梯度消失
  2. 神经网络到深度学习:逐层预训练,自编码器和受限玻尔兹曼机

pytorch及安装,使用Colaboratory

1. 什么是PyTorch(PyTorch是一个python库,它主要提供了两个高级功能)

  • GPU加速的张量计算
  • 构建在反向自动求导系统上的深度神经网络

2.安装pytorch及创建Colaboratory文件

  • 安装谷歌浏览器安装Ghelper(扩展程序):http://googlehelper.net/
  • 在谷歌云盘上创建文件夹,关联Colaboratory应用(旨在帮助传播机器学习培训和研究成果,是一个Jupyter笔记本环境,可以方便的使用Keras,TensorFlow,PyTorch,OpenCV等框架进行深度学习应用的开发),创建Colaboratory文件,设置免费的GPU。
  • 测试是否能成功运行代码。

pytorch基础操作

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

import torch
x = torch.tensor()
#()可以是一个数,一维数组(向量),二维数组(矩阵),任意维度的数组(张量)

请添加图片描述
Tensor支持各种各样类型的数据,包括torch.float32, torch.float64, torch.float16, torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64 。创建Tensor有多种方法,包括ones,zeros,eye,arange,linspace,rand,random.normal,uniform,randperm.
请添加图片描述
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

请添加图片描述
请添加图片描述
请添加图片描述

个人想法及解读:之前用过numpy对数据进行处理,感觉和pytorch差不多,经过学习,了解到pytorch是将其作为numpy的替代品,以使用强大的GPU能力;而且pytorch是一个深度学习的研究平台,能够提供最大的灵活性和速度,这都是我之前没有接触过的,感觉pytorch功能很强大。

螺旋数据分类

!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  # 神经网络里隐层单元的数量

请添加图片描述
请添加图片描述
1.构建线性模型分类
请添加图片描述
请添加图片描述上面使用print(model)模型输出,可以看到有两层:

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

从上面图示可以看出,线性模型的准确率最高只能达到50%左右,对于这样复杂的一个数据分布。线性模型难以实现准确分类。

2.构建两层神经网络分类
请添加图片描述
请添加图片描述

问题总结

1.AlexNet有哪些特点?为什么可以比LeNet取得更好的性能?

AlexNet的特点
1.Alex的网络更深,一共有8层,参数很多;
2.Conv(特征层)+FC(输出层)的组合配置;
3.FC(输出层)占据绝对多数的模型参数,96%的参数全都集中在3层全连接层中,卷积层之占4%4.卷积层与Pooling层交替;
5.当分辨率(HW)减少时,需要增加通道数,保证有效特征数量;
6.多卷积核尺度。
AlexNet比LeNet取得更好的性能原因
1.AlexNet相当于是更大更深的LeNet,10*参数个数,260*计算复杂度;
2.AlexNet使用的是ReLU函数,传统的LeNet使用的是sigmoid函数。ReLU函数比sigmoid函数计算上更为简单(不需要求幂运算),且ReLU函数在不同的参数初始化方法下可以让模型更容易训练。
3.AlexNet新进入了丢弃法(Dropout),可以控制全连接层的模型复杂程度,常用于应对过拟合问题,其具体操作核心就是随机的丢弃某些层中的某些神经元,以此来降低后一层在计算中对上一层的过度依赖,起到正则化的作用。
4.使用了最大池化层maxpooling,避免了平均池化层的模糊化的效果,提升了特征的丰富性。

2.激活函数有哪些作用?

激活函数就是在人工神经网络上的神经元上运行的函数,负责将神经元的输入映射到输出端。
主要作用是完成数据的非线性变换,解决线性模型的表达/分类能力不足的问题。
激活函数分为线性激活函数(线性方程控制输入到输出的映射)和非线性激活函数(非线性方程控制输入到输出的映射)。
常用的激活函数有(f(x)=x;Sigmoid,Tanh,ReLU,LReLU,PReLU,Swish等)

3.梯度消失现象是什么?

梯度消失是指当神经网络层数增多时,越靠近输入层的层之间的权重无法得到有效修正(导数趋于0),从而得到的神经网络效果不好。
例如Sigmoid函数趋近01的时候变化率会变得平坦,也就是Sigmoid函数的梯度趋近于0,神经网络使用Sigmoid激活函数进行反向传播时,输出接近01的神经元(饱和神经元),其梯度趋近于0,这些神经元的权重不会更新,与此类神经元相连的神经元的权重也会更新的很慢,这就是梯度消失。

4.神经网络是更宽好还是更深好?

对于神经网络的深度和宽度,我之前只了解过深度,通常我们说的是神经网络越深,学习能力越强,但太深了会造成过拟合,并且对于浅层网络来说,过拟合会更加明显。
通过查阅资料,我看到目前的研究是模型性能对深度更加敏感,而调整宽度更有利于提升模型性能。深度代表了函数的表示能力,宽度关联了优化的难易(找到全局最优)程度。加宽网络比加深网络更容易训练,但增加网络的深度比增加网络的宽度更有利于提升性能。

5.为什么要使用Softmax?

Soft函数用于多分类过程中,它将多个神经元的输出,映射到(01)区间内。
在多分类问题中,数据(x,y)中y服从多项分布,使用Softmax函数输出wx+b转化成概率p,具有更好的解释性,方便后续取阈值。

6.SGD和Adam那个更有效?

Adam和SGDM是两种深度学习优化器,分别在效率和精度上有着各自的优势。
Adam在前期优化速度较快,SGDN在后期优化精度较高。Adam的速度更快,但SGDM能够取得更好的效果。

猜你喜欢

转载自blog.csdn.net/weixin_45867259/article/details/131690076