Deeplizard《Pytorch神经网络高效入门教程》笔记
硬件基础:GPU、Cuda
GPU比起CPU更适合并行计算
机器学习中的计算多为可分解为并行计算的问题
Cuda是管理GPU的软件API
print(torch.cuda.device_count())
print(torch.cuda.is_available())
Pytorch可以使用多块GPU,Cuda可以指定GPU索引
为什么不在GPU上做所有的计算
数据从CPU转移到GPU上代价昂贵,将小型任务从CPU转移到GPU可能会更慢,GPU对于可以被分解成许多小任务的任务来说效果更好
张量(tensor)
张量是神经网络主要的数据结构,网络中的输入、输出、转换都是用张量表示的
张量的实例:(上下两两对应)
计算机术语:number、array、2d-array
数学术语:scalar、vector、matrix
综上,根据表示某个数据结构中的数据所需要的索引数量,将上述所有术语统一为:nd-array/nd-tensor,所以张量是多维数组
例如:
import torch
dd = [
[1,2,3],
[4,5,6],
[7,8,9]
]
t = torch.tensor(dd)
print(type(t))
张量的秩
张量的秩表示了张量中存在的维数,如:rank-2 tensor = matrix = 2d-array = 2d-tensor
张量的秩告诉我们要多少索引来访问数据结构中的值
print(len(t.shape))
张量的轴
张量的轴表示一个张量的特定维数**(有多少坐标轴)**,轴的长度表示沿轴有多少索引
张量的秩表示了张量中存在的轴数,轴数 = 维数
张量的形状
张量的形状由每个轴的长度决定,知道张量的形状,就知道了每个轴的长度
import torch
t = torch.tensor([
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]
], dtype=torch.float32)
print(t.size)
print(t.shape)
print(len(t.shape))
print(torch.tensor(t.shape).prod())
print(t.numel())
张量的形状包含了关于张量的轴、秩、索引信息
重塑(reshpae)没有改变原来数据结构中的数据,但是改变了数据的存储方式,如:2 by 3变成3 by 2
重塑的分量值乘积必须等于张量中元素的个数
print(t.shape)
t = t.reshape(1,9)
print(t)
print(t.shape)
print(len(t.shape))
##Creating tensor from data
import torch
import numpy as np
t = torch.Tensor()
print(type(t))
张量包含统一的数据类型
print(t.dtype)
张量计算依赖于类型和设备
print(t.device)
print(t.layout)
创建张量
data = np.array([1,2,3])
print(type(data))
t1 = torch.Tensor(data)
print(type(t1))
t2 = torch.tensor(data)
print(type(t2))
t3 = torch.as_tensor(data)
print(type(t3))
t4 = torch.from_numpy(data)
print(type(t4))
print(t1.dtype)
print(t2.dtype)
print(t3.dtype)
print(t4.dtype)
print(t1)
print(t2)
print(t3)
print(t4)
numpy与pytorch的转换关系:
import torch
import numpy as np
data = np.array([1,2,3])
t1 = torch.Tensor(data)
t2 = torch.tensor(data)
t3 = torch.as_tensor(data)
t4 = torch.from_numpy(data)
data[0] = 0
data[1] = 0
data[2] = 0
print(t1)
print(t2)
print(t3)
print(t4)
创建特殊张量:
t5 = torch.eye(2)
print(t5)
t6 = torch.zeros(2,2)
print(t6)
t7 = torch.ones(2,2)
print(t7)
t8 = torch.rand(2,2)
print(t8)
张量运算
压缩(flatten)操作:
import torch
t1 = torch.tensor([
[1,1,1,1],
[1,1,1,1],
[1,1,1,1],
[1,1,1,1],
])
t2 = torch.tensor([
[2,2,2,2],
[2,2,2,2],
[2,2,2,2],
[2,2,2,2],
])
t3 = torch.tensor([
[3,3,3,3],
[3,3,3,3],
[3,3,3,3],
[3,3,3,3],
])
t = torch.stack((t1,t2,t3))
print(t.shape)
t = t.reshape(3,1,4,4)
print(t)
用索引解释每个轴的意义:
print(t[0])
print(t[0][0])
print(t[0][0][0])
print(t[0][0][0][0])
元素操作:两个张量必须有相同的形状才能执行一个元素操作
import numpy as np
import torch
t1 = torch.tensor([
[1,2],
[3,4]
],dtype=torch.float32)
t2 = torch.tensor([
[9,8],
[7,6]
],dtype=torch.float32)
t3 = torch.tensor([
[9,8]
],dtype=torch.float32)
print(t1+t2)
print(t1+2)
print(t3+t2)
CNN实例
CNN输入一般长度为4,即有一个秩为4的张量,有 4个坐标轴
分4个步骤:
- 准备数据
- 建立模型
- 训练模型
- 分析模型结果
|