主要参考龙曲良老师的视频课程和书籍<<Pytorch深度学习实战>>
第一章人工智能绪论
1.1人工智能
1.1.1人工智能
发展:
- 达特茅斯会议
- 知识库加推理(专家系统)
- 机器学习
- 深度学习
1.1.2机器学习
- 监督学习:线性回归,逻辑回归,支持向量机,随机森林
- 无监督学习:自编码器,生成对抗网络
- 强化学习(增强学习):DQN,TRPO,PPO
1.1.3神经网络与深度学习
1.2神经网络发展简史
- 两个阶段:浅层神经网络阶段,深度学习
- 2006以前一神经网络和连接主义的名义发展(2次兴盛2次寒冬),2006年,Geoffrey Hinton首次将深层神经网络命名为深度学习(第三次复兴)
1.2.1浅层神经网络
- MP神经元模型:MP 神经元模型并没有学习能力,只能完成固定逻辑的判定。(1943)
- 感知机(Perceptron)(1958)
- 第一个可以自动学习权重的神经元模型
- 无法处理简单的异或 XOR 等线性不可分问题 - 第一次兴盛:1943~1969
- 第一次低估:1969~1982(感知机一书的发表)
- 第二次兴盛:1982~1995(BP再次被重视并被应用,1982循环连接的Hopfield网络)
- CNN被提出
- RNN被提出
- BP
- 多次感知机
- Yann LeCun将BP应用在手写数字图片上
- 1997,LSTM(RNN)
- 双向循环网络 - 第二次寒冬:SVM
- 人工智能第三次复兴:Geoffrey Hinton 等人发现通过逐层预训练的方式可以较好地训练多层神经网络,并在 MNIST 手写数字图片数据集上取得了优于 SVM 的错误率
1.2.1深度学习实战
- Geoffrey Hinton通过浅层预训练在MNIST上优于SVM
- 2011提出ReLU函数
- 2012年AlexNet使用ReLU,Dropout在ILSVRC-2012比赛优异,基于两块 GTX580 GPU 训练
- VGG系列
- GooLeNet系列
- ResNet系列:层数提升值数百层
- DensNet系列
- 2014 年,Ian Goodfellow 提出了生成对抗网络,通过对抗训练的方式学习样本的真实分布,从而生成逼近度较高的样本。
1.3深度学习特点
1.3.1数据量
- 鸢尾花卉数据集 Iris 共包含 3 个类别花卉,每个类别 50 个样本
- Yann LeCun 收集整理的 MNIST 手写数字图片数据集共包含 0~9 共 10类数字,每个类别多达 7000 张图片
1.3.2计算力
- 目前的大部分神经网络均使用 NVIDIA GPU 和 Google TPU 等并行加速芯片训练模型参数
1.3.3网络规模
- AlexNet(8 层)、VGG16(16 层)、 GoogLeNet(22 层)、ResNet50(50 层)、DenseNet121(121 层)
- 同时输入图片的大小也从28 × 28逐渐增大,变成224 × 224、416 × 416等
1.5 深度学习框架
1.5.1主流框架
Caffe
贾扬清,主要面向使用卷积神经网络.主要开发语言是C++.Caffe2已经融入到PyTorch中MXNET
有李沐Keras
基于Theano和TensorFlow.简单TensorFlow
有Google开发PyTorch
有Facebook开发
1.5.2静态图和动态图
- 基于静态图的代表性框架是TensorFlow 1,特点是建立计算图过程和实际计算过程是分开的.
- 基于动态图的代表性框架是PyTorch,特点是计算图的建图过程和计算过程是同时进行的.
符号式编程:
先创建计算图后运行的编程方式,与之相对的就是命令式编程
也称为动态图模式.- 一般认为,动态图模式开发效率高,但是运行效率可能不如静态图模式,更适合算法设计和开发;静态图模式运行效率高,更适合算法部署
ONNX 生态
:https://zhuanlan.zhihu.com/p/305746549?utm_id=0
1.5.3功能演示
1)加速计算
import timeit
import torch
def compare_cpu_gpu(n):
# 创建在CPu上运算的2个矩阵
cpu_a = torch.randn([1, n])
cpu_b = torch.randn([n, 1])
# 创建使用GPU运算的2个矩阵
gpu_a = torch.randn([1, n]).cuda()
gpu_b = torch.randn([n, 1]).cuda()
def cpu_run():
return torch.matmul(cpu_a, cpu_b)
def gpu_run():
return torch.matmul(gpu_a, gpu_b)
# 第一次计算需要热身,避免将初始化阶段时间计算在内
cpu_time = timeit.timeit(cpu_run, number=3)
gpu_time = timeit.timeit(gpu_run, number=3)
# 正式计算10 次,取平均时间
cpu_time = timeit.timeit(cpu_run, number=100)
gpu_time = timeit.timeit(gpu_run, number=100)
return cpu_time, gpu_time
cpu_times = []
gpu_times = []
x = []
for n in range(100):
cpu, gpu = compare_cpu_gpu(n)
x.append(n)
cpu_times.append(cpu)
gpu_times.append(gpu)
print(len(x))
print(len(cpu_times))
print(len(gpu_times))
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 3), dpi=100) # 创建画布
plt.plot(x,cpu_times,gpu_times) # 绘制折线图
plt.show() # 显示图像
2) 自动求梯度
import torch
from torch import autograd
a = torch.tensor(1.)
b = torch.tensor(2.)
c = torch.tensor(3.)
w = torch.tensor(4.,requires_grad=True)
y = a*w**2+b*w+c
w_grad = autograd.grad(y,[w])
print('w_grad: ',w_grad) # w_grad: (tensor(10.),)
torch.Tensor与torch.tensor的区别
区别一:torch.Tensor是torch.empty与torch.tensor的混合
,在传入数据时,torch.Tensor使用全局默认类型(FloatTensor)而torch.tensor则会从输入数据中进行推断
;
区别二:当输入数据是一个常数n
时,torch.Tensor会将n是为一维张量的元素个数
,并随机初始化。而torch.tensor则会将n视作一个数字
而不是元素个数。例如:
torch.Tensor(6)
t# ensor([2.7626e-06, 1.0871e-05, 3.4008e-06, 5.2903e-08, 2.1877e-04, 1.7377e-04])
torch.tensor(6)
# tensor(6)
区别三:torch.Tensor是一个类
,会调用自己的构造函数,而torch.tensor则是一个函数
,其原型为:
torch.tensor(data, dtype=None, device=None, requires_grad=False)
来自于:https://blog.csdn.net/qq_45957458/article/details/129656914