Tensors Tensors是什么 张量是一种特殊的数据结构,与数组和矩阵非常相似。
Tensors什么作用 张量对模型的输入和输出以及模型的参数进行编码
Tensors 和 NumPy 的ndarrays对比 不同:
张量可以在 GPU 或其他硬件加速器上运行
张量还针对自动微分进行了优化
Tensors 和Numpy的ndarrays联系 张量和 NumPy 数组通常可以共享相同的底层内存,从而无需复制数据。
Initializing a Tensor 1.通过数据创建,类型可以自动推导
1 2 data = [[1 , 2 ],[3 , 4 ]] x_data = torch.tensor(data)
2.通过numpy创建
1 2 np_array = np.array(data) x_np = torch.from_numpy(np_array)
3.从另一个Tensor创建,新Tensor保留参数Tensor的属性(形状、数据类型 ),除非显式覆盖。
1 2 3 4 5 x_ones = torch.ones_like(x_data) print (f"Ones Tensor: \n {x_ones} \n" )x_rand = torch.rand_like(x_data, dtype=torch.float ) print (f"Random Tensor: \n {x_rand} \n" )
1 2 3 4 5 6 7 Ones Tensor: tensor([[1, 1], [1, 1]]) Random Tensor: tensor([[0.8823, 0.9150], [0.3829, 0.9593]])
With random or constant values: shape
是张量维度的元组。在下面的函数中,它确定输出张量的维数。
1 2 3 4 5 6 7 8 shape = (2 ,3 ,) rand_tensor = torch.rand(shape) ones_tensor = torch.ones(shape) zeros_tensor = torch.zeros(shape) print (f"Random Tensor: \n {rand_tensor} \n" )print (f"Ones Tensor: \n {ones_tensor} \n" )print (f"Zeros Tensor: \n {zeros_tensor} " )
1 2 3 4 5 6 7 8 9 10 11 Random Tensor: tensor([[0.3904, 0.6009, 0.2566], [0.7936, 0.9408, 0.1332]]) Ones Tensor: tensor([[1., 1., 1.], [1., 1., 1.]]) Zeros Tensor: tensor([[0., 0., 0.], [0., 0., 0.]])
Attributes of a Tensor 1 2 3 4 5 tensor = torch.rand(3 ,4 ) print (f"Shape of tensor: {tensor.shape} " )print (f"Datatype of tensor: {tensor.dtype} " )print (f"Device tensor is stored on: {tensor.device} " )
1 2 3 Shape of tensor: torch.Size([3, 4]) Datatype of tensor: torch.float32 Device tensor is stored on: cpu
Operations on Tensors 有哪些运算 100 多种张量运算 ,包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等。
和一般的计算库相比有哪些优点 这些操作中的每一个都可以在 GPU 上运行
如果使用Colab如何使用GPU:
请通过转至运行时 > 更改运行时类型 > GPU 来分配 GPU
为什么我创建后在cpu上? 默认情况下,张量是在 CPU 上创建的。我们需要使用 .to
方法显式地将张量移动到 GPU
请记住,跨设备复制大张量在时间和内存方面可能会很昂贵!
1 2 3 if torch.cuda.is_available(): tensor = tensor.to("cuda" )
对tensor的切片索引修改 1 2 3 4 5 6 tensor = torch.ones(4 , 4 ) print (f"First row: {tensor[0 ]} " )print (f"First column: {tensor[:, 0 ]} " )print (f"Last column: {tensor[..., -1 ]} " )tensor[:,1 ] = 0 print (tensor)
1 2 3 4 5 6 7 First row: tensor([1., 1., 1., 1.]) First column: tensor([1., 1., 1., 1.]) Last column: tensor([1., 1., 1., 1.]) tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]])
tensor的拼接,维度扩大 连接张量 您可以使用 torch.cat
沿给定维度连接一系列张量。
另请参见 torch.stack,这是另一个与 torch.cat
略有不同的张量连接运算符。
1 2 t1 = torch.cat([tensor, tensor, tensor], dim=1 ) print (t1)
1 2 3 4 tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.], [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
Arithmetic operations 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 y1 = tensor @ tensor.T y2 = tensor.matmul(tensor.T) y3 = torch.rand_like(y1) torch.matmul(tensor, tensor.T, out=y3) z1 = tensor * tensor z2 = tensor.mul(tensor) z3 = torch.rand_like(tensor) torch.mul(tensor, tensor, out=z3)
如何将单一数值的tensor和python的数值类型进行转化 1 2 3 agg = tensor.sum () agg_item = agg.item() print (agg_item, type (agg_item))
tensors的In-place operations 就地运算 将结果存储到操作数中的操作称为就地运算。它们由 _
后缀表示。例如: x.copy_(y)
、 x.t_()
会更改 x
。
1 2 3 print (f"{tensor} \n" )tensor.add_(5 ) print (tensor)
1 2 3 4 5 6 7 8 9 tensor([[1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.], [1., 0., 1., 1.]]) tensor([[6., 5., 6., 6.], [6., 5., 6., 6.], [6., 5., 6., 6.], [6., 5., 6., 6.]])
确保你的数据没用了,再采取就地运算(In-place operations)
和numpy的联系
CPU上时,NumPy 数组上的张量可以共享其底层内存位置。
Tensor to NumPy array 1 2 3 4 t = torch.ones(5 ) print (f"t: {t} " )n = t.numpy() print (f"n: {n} " )
1 2 t: tensor([1., 1., 1., 1., 1.]) n: [1. 1. 1. 1. 1.]
当t数据变化时候,对应的n也发生变化,简单理解就是n是对t的引用(指针)
1 2 3 t.add_(1 ) print (f"t: {t} " )print (f"n: {n} " )
1 2 t: tensor([2., 2., 2., 2., 2.]) n: [2. 2. 2. 2. 2.]
NumPy array to Tensor 1 2 n = np.ones(5) t = torch.from_numpy(n)
NumPy 数组中的变化反映在张量中。
1 2 3 np.add(n, 1, out=n) print(f"t: {t}") print(f"n: {n}")
1 2 t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64) n: [2. 2. 2. 2. 2.]