本文目录
  1. 2.张量(tensor)
  2. 1.1张量的创建
  3. 1.2 张量的类型转换
  4. 1.3 张量的数值计算

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哪个维度,就在哪个维度加