使用pytorch框架写深度学习程序,总是会对数据进行各种各样的操作,本文从给出了实际可运行的数据操作代码,tensor创建,tensor形状,两个tensor运算,tensor与numpy数据的互相转换。
代码由许多的test组成,都是单独可运行的。程序入口在下面的main。
import torch
#基本属性
def test_base():
t_data=torch.zeros((3,4))
help(torch.numel)
print(t_data.shape)#形状
print(t_data.size())#与shape一样
print(t_data.numel())#元素数量
print('t_data.sum()',t_data.sum())#所有元素求和
def test_tensor_calculate():
x=torch.tensor([1.0,2,4,8])
y=torch.tensor([2,2,2,2])
print('x',x)
print('y',y)
print('x+y',x+y)
print('x-y',x-y)
print('x*y',x*y)
print('x/y',x/y)
print('x**y',x**y) # 对应元素幂运算
print('torch.exp(x)',torch.exp(x)) #e的指数幂
def test_two_tensor_calculate():
X=torch.arange(12,dtype=torch.float32).reshape(3,4)
Y=torch.ones((3,4),dtype=torch.float32)
print('X',X)
print('Y',Y)
print('torch.cat((X,Y),dim=0)',torch.cat((X,Y),dim=0)) # 0维度拼接 (3,4) (3,4) -> (6,4)
print('torch.cat((X,Y),dim=1)',torch.cat((X,Y),dim=1)) # 1维度拼接 (3,4) (3,4) -> (3,8)
print('X==Y',X==Y) #逻辑与
#广播
def test_broadcast():
a=torch.arange(3).reshape((3,1))
b=torch.arange(2).reshape((1,2))
print('a',a)
print('b',b)
print('a+b',a+b)# a形状 3,1 b形状 1,2 a,b扩充为 3,2
def test_cut():
X=torch.arange(12).reshape(3,4)
print('X',X)
print('X[-1]',X[-1])
print('X[1:3]',X[1:3])
print('X[1,2:]',X[1,2:])
X[0:2,1:]=torch.tensor([[6,6,6],[7,7,7]]) #给指定区域赋值
print('new X',X)
#避免重复分配内存的小方法
def test_save_memory():
data=torch.zeros((5,10))
data_x=torch.randn((5,10))
data_y = torch.randn((5, 10))
print(id(data))
data[:,:]=data_x+data_y
#data=data_x+data_y #这个让id改变 说明重复分配了内存
print(id(data))
#改类型
def test_change_type():
import numpy as np
X=torch.arange(3,4)
data_np=X.numpy()
data_tensor=torch.tensor(data_np)
print('type(data_np)',type(data_np))
print('type(data_np)',type(data_tensor))
if __name__ == '__main__':
test_base()
test_tensor_calculate()
test_two_tensor_calculate()
test_broadcast()
test_cut()
test_save_memory()
test_change_type()