文章目录

  • 非常详细的一个文档,学习pytorch可以详细研究一下:
  • 对一些比较重要的功能和知识点进行复现:
  • 一、创建tensor张量
  • 二、tensor与numpy之间的相互转换
  • 三、tensor.function与tensor.function_的区别
  • 四、修改tensor的形状
  • 五、索引操作
  • 六.逐元素操作
  • 七. 归并操作
  • 八、比较操作


非常详细的一个文档,学习pytorch可以详细研究一下:

http://www.feiguyunai.com/index.php/2019/09/11/pytorch-char02/#23_Jupyter_Notebook

对一些比较重要的功能和知识点进行复现:

一、创建tensor张量

例子:

# 根据list数据生成tensor
torch.Tensor([1,2,3,4,5,6])
#根据指定形状生成tensor
torch.Tensor(2,3)
#根据给定的形状生成torch
t = torch.Tensor([[1,2,3],[4,5,6]])
print(t)
# tensor张量的维度大小信息
t.size()
print(t.shape)
# 根据已知大小创建tensor
torch.Tensor(t.size())

注意:

  1. torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),torch.tensor从数据中推断数据类型。
  2. torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,其是随机初始化的值
t1 = torch.Tensor(1)
t2 = torch.tensor(1)
print("t1的值{},t1的数据类型{}".format(t1,t1.type()))
print("t2的值{},t2的数据类型{}".format(t2,t2.type()))
# 生成单位矩阵
t3 = torch.eye(2,2)
# 生成全部是0的矩阵
t4 = torch.zeros(2,3)
# 根据规则生成数据
t5 = torch.linspace(1,10,4)
# 生成满足均匀分布随机数
t6 = torch.rand(2,3)
# 返回所给数据形状相同,值全部为0的张量
t7 = torch.zeros_like(torch.rand(2,3))

print("单位矩阵:{},/n 零矩阵:{},/n规则数据格式“”")
二、tensor与numpy之间的相互转换
# tensor To Numpy
tensor_test = torch.tensor([1,2,3])
print("tensor格式:{}".format(tensor_test))
print("numpy的list格式:{}".format(tensor_test.numpy()))
# Numpy To Tensor(besides chartensor)

numpy_test = np.ones([3,3])
print("numpy的list格式:{}".format(numpy_test))
print("tensor格式:{}".format(torch.from_numpy(numpy_test)))

注意:
tensor和numpy的大多数函数都类似,很多相同操作的函数也相同,二者最大的区别在于tensor可以调用GPU运行而numpy的ndarray主要是在CPU中加速运算

三、tensor.function与tensor.function_的区别
x = torch.tensor([1,2])
y = torch.tensor([3,4])
z1 = x.add(y)
z2 = y.add_(x)
print("不改变自身值x={};z={};".format(x.numpy(),z1.numpy()))
print("  改变自身值y={};z={};".format(y.numpy(),z2.numpy()))

注意:
加上一个下划线表示会修改原始数据的形式,使用同一个内存空间

四、修改tensor的形状
# size——返回tensor的属性值,与shape等价
shape_test = torch.randn(2,3)

# shape——查看属性
print(shape_test.shape)
print(shape_test.size())

# dim——查看维度
print(shape_test.dim())

# view——改变维度(注意数据量不变)
print(shape_test.view(3,2))
print(shape_test.view(-1)) # 展开为一维向量

# unsqueeze——添加维度,后面的参数为需要添加维度的维数
new_shape_test = torch.unsqueeze(shape_test,0)
print(new_shape_test)
print("原始维度:{}".format(shape_test.shape))
print("添加后的维度:{}".format(new_shape_test.shape))

解释:
上述添加维度表示在第几个位置上添加一个维度,例如unsqueeze(shape_test,0)表示在shape_test的最外层添加一个维度

五、索引操作
# manual_seed()——设置随机种子
torch.manual_seed(100)
index_test = torch.rand(2,3)
print("原始数据:{}".format(index_test))

# []——获取切片数据
print("第一行数据:{}".format(index_test[0,:]))
print("最后一列数据:{}".format(index_test[:,-1]))

# 索引
mask =index_test>0                          #根据原始数据建立索引
print(torch.masked_select(index_test,mask)) #根据索引获取值
print(torch.nonzero(mask))                  #获取非零数值的下标

# torch.gather——按照规定的格式、方式进行索引
#out[i][j] = input[index[i][j]][j]  # if dim == 0
#out[i][j] = input[i][index[i][j]]  # if dim == 1
index1 = torch.LongTensor([[0,0,0],[1,1,1],[1,1,0]])
a = torch.gather(index_test,0,index1) # index_test是数据;dim=0表示按行索引,dim=1表示按列索引;index的大小就是输出的大小
print("按行索引结果(index的列数对应原始矩阵的列数):{}".format(a))
index2 = torch.LongTensor([[2,2,2,2],[2,1,1,1]])
b = torch.gather(index_test,1,index2)
print("按列索引结果(index的行数对应原始矩阵的列数):{}".format(b))

# torch.scatter_是与gather相反的一个操作
out_index = torch.zeros(2,4)
out_index.scatter_(1,index,b) #dim=1,index2是索引,b是按索引得到的值
print("将索引得到的值放回到相应的位置上(还原原始数据):{}".format(out_index))

解释:
gather把数据从input中按index取出,而scatter_是把取出的数据再放回去。注意scatter_函数是inplace操作。


六.逐元素操作

常见的:

  1. abs/add——绝对值操作与加法操作
  2. addcdiv(t,v,t1,t2)——t1与t2按元素除,乘v,加t
  3. addcmul(t,v,t1,t2)——t1与t2按元素乘,乘v,加t
  4. cell/floor——向上和向下取整
  5. clamp(t,min,max)——将张量元素限制在一个指定的区间之内
  6. exp/log/pow——指数、对数、幂
  7. mul(*)/neg——逐元素乘法、取反
  8. sigmoid/tanh/softmax——激活函数
  9. sign/sqrt——取符号/开根号
t = torch.randn(1,3)
t1 = torch.randn(3,1)
t2 = torch.randn(1,3)
t3 = torch.randn(1,3)
print("t:{}".format(t))
print("t1:{}".format(t1))
print("t2:{}".format(t2))
print("t3:{}".format(t3))
print('#'*50)

# 矩阵加减乘除
print("加法:{}".format(t2+t3))
print("减法:{}".format(t2-t3))
print("乘法:{}".format(t2*t3))
print("除法:{}".format(t2/t3))
print('#'*50)

#t+0.1*(t1/t2)
print("快捷计算:t+0.1*(t1/t2)(其中t1/t2是矩阵除法了):\n{}".format(torch.addcdiv(t,0.1,t1,t2)))
print('#'*50)

#计算sigmoid
print('sigmoid函数计算结果:{}'.format(torch.sigmoid(t)))
print('#'*50)

#将t限制在[0,1]之间
print('限制区域范围:{}'.format(torch.clamp(t,0,1)))
print('#'*50)

#t+2进行就地运算
t.add_(2)


七. 归并操作
#生成一个含6个数的向量
a_test=torch.linspace(0,10,6)
#使用view方法,把a变为2x3矩阵
a_test=a_test.view((2,3))
# 沿y轴方向累加,即dim=0
b_test=a_test.sum(dim=0)   #b的形状为[3]
# 沿y轴方向累加,即dim=0,并保留含1的维度
b_test=a_test.sum(dim=0,keepdim=True) #b的形状为[1,3]
print(a_test)
print(b_test)

总结:

  1. cumprod(t,axis)——在axis维度对t进行累积
  2. cumsum(t,axis)——在axis维度对t进行累加
  3. mean/median——均值和中位数
  4. std/var——标准差和方差
  5. norm(t,p=2) ——返回t的p阶范数
  6. prod(t)/sum(t)——对所有的t元素进行累计和累积
八、比较操作
x=torch.linspace(0,10,10).view(5,2)
print(x)
#求所有元素的最大值
print("全局最大值:{}".format(torch.max(x)))
#求y轴方向的最大值
print("y方向最大值:{}".format(torch.max(x,dim=0)))
#求最大的2个元素
print("最大的n元素及其相对索引(在dim索引方向上):\n{}".format(torch.topk(x,2,dim=0)))

# 返回的索引是与dim有关的,dim=0表示按照行索引(即y方向的索引)
# tock返回的value表示对应列中最大的两个值,index表示值对应的行数

torch 在tensor中的索引 torch tensor操作_深度学习


总结:

  1. eq——比较tensor是否相等
  2. equal——比较tensor是否有相同的shape和值
  3. ge/le/gt/lt ——大于/小于/大于等于/小于等于的比较
  4. max/min(t,axis)——沿着axis的方向返回最大、最小值后
  5. topk(t,k,axis)——在指定的axis方向上取最大的k个值