DEEP LEARNING · 02
学习张量的创建、类型转换、数值计算、索引和形状操作。
- PyTorch
- Tensor
PyTorch 张量基础
2.张量(tensor)
1.1张量的创建
# 创建张量的方式
torch.tensor()
torch.Tensor()
# 大小写区别:
1.小写主要是根据数据创建张量,不支持形状创建
2.大写可以根据数据和形状创建张量,如果只写数字,默认为形状
3.小写默认数据类型;int
4.大写默认数据类型:float
重点掌握小写
#通过指定类型创建张量--既支持形状又支持数据
torch.intTensor() # int32
torch.floatTensor() #float32
torch.DoubleTensor #float64
#创建线性和随机张量
torch.arange() 包头不包尾(起始,结束,步长)
torch.linespace() 包头包尾 (起始,结束,元素个数)
#随机张量
#随机种子
initial_seed()
manual_seed() --指定随机种子
#随机张量
rand() #0-1
randn() #正态分布
randint(起始,结束,形状) #随机整数
#创建全0、全1张量
torch.ones()
torch.ones_like(data)
#根据传入张量的形状,构建全"1"张量
torch.zeros()
torch.zeros_like(ata)
#根据传入张量的形状,构建全"0"张量
#自定义创建全“x”张量
torch.full([形状],x)
torch.full_like(data,20)
#数据类型的转换
# int64 int32 int16
# long int short
# float64 float32 float16
# double float half
# 张量类型转换
# 1.用tpye方式转换
data.type(指定的类型) #要转换的类型
data.type(torch.int64)
# 2.用函数名转化
data.要转化的函数名
data.double() #float64
1.2 张量的类型转换
# 张量转为numpy数组 --共享内存
data1 = torch.tensor()
data1.numpy 共享内存
data1.numpy + copy
#数组转张量--共享内存
torch.from_numpy(data)
torch.from_numpy(numpy.copy)
#数组转张量--内存不共享
torch.tensor()
#单个数据的张量转数字
data1.item()
1.3 张量的数值计算
1.3.1 张量的基本运算
# add 加 + add_ 带下划线表示跟新原数据
# sub 减 - sub_
# mul 乘 * mul_
# div 除 / div_
# neg 取负号 *-1 neg_
1.3.2 张量的点乘、点积运算
点乘: 形状相同,一一对应计算
点积: a列等于b行,点积运算
1.3.3 张量的常见计算函数
#求和:sum——dim 表示第几维进行求和
dim=0 列相加--变成0维--竖着加
dim=1 行相加--变成1维--横着加
dim=2 矩阵相加--变成2维--一一对应加
mean 平均
max 最大值
min 最小值
square 平方
sqrt 开方
pow 幂
abs 绝对值
exp 指数
log 对数
1.3.4 张量的索引
# 1.简单的行列索引
t1[0] ->最高维第一个
t1[:,0] -> 所有第二维的第一个
# 2.通过列表索引获取数据
t1[[行索引],[列索引]] --行列一一对应
例:t1[[1,2],[2,3]] -> 取出的坐标为 (1,2(2,3)
# 3.通过范围索引获取数据
t1[:3,:2] -> 取前三行,前两列数据
# 4.通过布尔值索引获取数据
t1[t1[:,3]>5]
里面得到一个布尔值列表,外通过布尔值索引拿数据
#5.多维索引获取数据
t1[0,0,0] 数字从前到后,维度从高到低
例:
print(t2[0]) # 第一个二维张量
print(t2[:,0]) # 每个二维张量的第一行
print(t2[:,:,0]) # 每个二维张量的第一列
1.3.5 张量的形状操作
# 1.reshape
在张量数据不变的情况下改变形状
t1 =torch,IntTencor([[1,2,3],[4,5,6]])
t1.reshape(3,2)
t1.reshape(1,-1) # -1表示自己计算
#张量的升维和降维
# 1.升维
unsqueeze(dim = 0) 在第0维增加一维
[[1,2, 3, 4, 5, 6]]
unsqueeze(dim = 1) 在第1维增加一维
[[1],
[2],
[3],
[4],
[5],
[6]],
# 2.降维
squeeze() 将所有维度为1的进行删除
(3,1,5,1,2) ->(3,5,2)
#张量的维度交换
# 只能做一次交换
transpose(1,2) -> 1,2 是dim的维度交换
# 交换多个维度
permute(1,2,0) ->把原dim写到新位置上
1.3.6 查看数据的指针和步长
t1.data_ptr() # 指针
t1.stride() #步长
#某个值到同维度对应位置下一个值的步数
1.3.7 张量的连续性数据
# 如果张量内存不连续,view会报错
也就是说 如果形状改变了 view就会报错
原始数据就不会报错
#解决方案 contiguous -> 改变内存 变成原始数据
# 先contiguous再view就不会报错了
1.3.8 张量的拼接
# cat
# 按哪个维度拼接,哪个可以不一样,其他维度必须一样
print(torch.cat((t1,t2),dim=0)) #按0维度拼接
print(torch.cat((t1,t2),dim=1)) #按1维度拼接
print(torch.cat((t1,t2),dim=2)) #按2维度拼接
#stack
# 所有形状必须一样
dim哪个维度,就在哪个维度加