#创建并初始化一个随机的tensor
x=torch.rand(5,3)
print(x)
tensor([[0.2764, 0.5943, 0.1787],
[0.5097, 0.2853, 0.3463],
[0.9110, 0.6389, 0.2536],
[0.9433, 0.6114, 0.0199],
[0.7834, 0.0757, 0.1763]])
# 创建一个全零型的tensor
x=torch.zeros(5,3,dtype=torch.long)
print(x)
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
# 根据数据进行创建
x=torch.tensor([5.5,3])
print(x)
tensor([5.5000, 3.0000])
#自定义tensor的数据类型
x=x.new_ones(5,3,dtype=torch.float64)
print(x)
x=torch.randn_like(x,dtype=torch.float)# 指定新的数据类型
print(x)
print(x.size())
print(x.shape) #通过shape size()获得tensor形状
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-1.3076, -1.8436, -1.1117],
[-0.3132, 0.8285, 0.6187],
[ 0.0623, -0.6991, -1.2316],
[ 0.8319, -0.3928, -0.5250],
[ 0.0562, 0.7673, 0.1927]])
torch.Size([5, 3])
torch.Size([5, 3])
# 算术操作 + - * / 以加法为例
y=torch.rand(5,3)
print(x+y)
print(torch.add(x,y))
result=torch.empty(5,3) #指定输出 数据预处理时常用
torch.add(x,y,out=result)
print(result)
tensor([[-0.7371, -1.0647, -1.0779],
[ 0.1557, 1.8013, 1.0695],
[ 0.8420, -0.1259, -0.5630],
[ 1.5255, -0.3072, -0.3871],
[ 0.8199, 1.2415, 0.6198]])
tensor([[-0.7371, -1.0647, -1.0779],
[ 0.1557, 1.8013, 1.0695],
[ 0.8420, -0.1259, -0.5630],
[ 1.5255, -0.3072, -0.3871],
[ 0.8199, 1.2415, 0.6198]])
tensor([[-0.7371, -1.0647, -1.0779],
[ 0.1557, 1.8013, 1.0695],
[ 0.8420, -0.1259, -0.5630],
[ 1.5255, -0.3072, -0.3871],
[ 0.8199, 1.2415, 0.6198]])
# 索引 索引出来的结果与原数据共享内存,即修改一个另外一个也跟着修改
print(x)
y=x[0,:]
y+=1
print(y)
print(x[0,:])
tensor([[ 0.6924, 0.1564, 0.8883],
[-0.3132, 0.8285, 0.6187],
[ 0.0623, -0.6991, -1.2316],
[ 0.8319, -0.3928, -0.5250],
[ 0.0562, 0.7673, 0.1927]])
tensor([1.6924, 1.1564, 1.8883])
tensor([1.6924, 1.1564, 1.8883])
# 改变形状 用view()来改变tensor 的形状
y=x.view(15)
z=x.view(-1,5) #-1 所指的维度可以根据其他维度的值推出来
print(x.size(),y.size(),z.size())
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
# 广播机制
# 当对两个不同形状的Tensor 按元素运算时,可能会触发广播机制:
# 即:先复制元素使得这两个Tensor的形状相同,再按元素运算
x=torch.arange(1,3).view(1,2)
print(x)
y=torch.arange(1,4).view(3,1)
print(y)
print(x+y)
tensor([[1, 2]])
tensor([[1],
[2],
[3]])
tensor([[2, 3],
[3, 4],
[4, 5]])
由于x和y分别是1行2列和3行1列的矩阵,如果要计算x+y,那么x中的第一行的2个元素被广播(复制)到了第二行,第三行,y同理
Tensor 与 Numpy 转换
# tensor 转 numpy 利用numpy()
a=torch.ones(5)
b=a.numpy()
print(a,b)
a+=1
print(a,b)
b+=1
print(a,b)
tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]
由上述结果可见tensor与numpy 是共享内存的,一个改变另外一个也跟着改变
# numpy 转 tensor 利用from_numpy()
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
print(a,b)
a+=1
print(a,b)
b+=1
print(a,b)
[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
TENSOR ON GPU
# 用to()可以将Tensor 在CPU和GPU(硬件支持)之间相互移动
if torch.cuda.is_available():
device=torch.device("cuda")
y=torch.ones_like(x,device=device)#直接创建一个GPU上的Tensor
x=x.to(device)
z=x+y
print(z)
print(z.to("CPU",torch.double))
参考动手学深度学习with pytorch
本文介绍了PyTorch中Tensor的基本操作,包括与Numpy的转换。内容涉及Tensor的矩阵加法和广播机制,以及如何将Tensor移到GPU上进行计算,强调了Tensor与Numpy共享内存的特性。

679

被折叠的 条评论
为什么被折叠?



