深度学习框架 PyTorch vs MindSpore (一): 二者的Tensor操作方法,以及与NumPy的转换

一、torch.Tensor

1、torch.Tensor 的基本用法

torch.Tensor 默认数据类型是 float32
torch.LongTensor 默认数据类型是 int64

数据类型转换:
int 和 float 之间的转换可以通过 t.int() 和 t.float()实现,默认转为 int64 和 float32
int 之间、float 之间的转换可以通过 a=b.type() 实现
example: 假设 t 为 torch.float16 的 Tensor, t=t.type(float32) 将 float16 转为 float32 。 t=t.float32 和 t=t.torch.float32 都是错的。

t.size(): 查看形状,与 t.shape 等价
t.ndim: 查看维数
t.numel(): 查看元素总数
type(t): 查看数据结构类型,如<class ‘torch.Tensor’>
t.type(): 查看Tensor的类型,如torch.FloatTensor
t.dtype: 查看元素数据类型

example:

import torch

b=torch.Tensor([[1,2,3,4,5],[10,20,30,40,50]])
print(b)
print("b.dtype:",b.dtype)
print()

b=b.int()  
print(b)
print("b.dtype:",b.dtype)
print("type:",type(b))
print()

print("size:",b.size())
print("shape:",b.shape)
print("dim:",b.ndim)
print("num_element:",b.numel())

print:

tensor([[ 1.,  2.,  3.,  4.,  5.],
        [10., 20., 30., 40., 50.]])
b.dtype: torch.float32

tensor([[ 1,  2,  3,  4,  5],
        [10, 20, 30, 40, 50]], dtype=torch.int32)
b.dtype: torch.int32
type: <class 'torch.Tensor'>

size: torch.Size([2, 5])
shape: torch.Size([2, 5])
dim: 2
num_element: 10

tensor ( [ [ 1, 2, 3, 4, 5 ],[10, 20, 30, 40, 50 ] ] ) 的尺寸是 2×5,而不是 1×2×5 。最外面的中括号不算在维数内,只是用于将Tensor包起来。

2、(n, ) 的含义

(n, )是一维张量,与 [n] 等价,表示一个有n个元素的行向量,即n×1的矩阵。

example:

a=torch.ones(4,)
print("a: ",a)

b=torch.Tensor([1,1,1,1])
print("b.shape: ",b.shape)

print:

a:  tensor([1., 1., 1., 1.])
b.shape:  torch.Size([4])

可以发现,torch.ones(4,) 的形状就是 torch.Size([4])

二、mindspore.Tensor

mindspore作为一款目前并不主流的深度学习框架,其用法也与pytorch和tensorflow有不小的差异。

1、数据类型转换

mindspore在网络传播的过程中对数据类型有非常严格的要求,且不会自动更改参数的数据类型,因此熟练掌握mindspore的数据类型转换以及熟知网络中每个参数的数据类型显得尤为重要。

torch.Tensor 默认整数类型是 int64 , 默认浮点数类型是 float64

数据类型转换可通过 mindspore.common.tensor中的 Tensor() 方法实现

example:

import mindspore as ms
from mindspore.common.tensor import Tensor

a = ms.Tensor([1])
print("a.dtype: ",a.dtype)
b = Tensor(a ,ms.float32)     # 数据类型转换
print("b.dtype: ",b.dtype)

b = Tensor(a , ms.float32) 将默认的 int64 类型转换为 float32 类型:

a.dtype:  Int64
b.dtype:  Float32

2、基本用法

t.shape: 查看形状
t.size: 查看元素总数(这个需要特别注意,t.size查看的不是Tensor的形状)
t.ndim: 查看维数
t.numel(): 查看元素总数
type(t): 查看数据结构类型
t.dtype: 查看元素数据类型

example:

import mindspore as ms

a=ms.Tensor([[1,2,3,4,5],[10,20,30,40,50]])
print(a)
print("a.dtype:",a.dtype)
print("type:",type(a))
print("num_element:",a.size)
print("shape:",a.shape)
print("dim:",a.ndim)

print:

[[ 1  2  3  4  5]
 [10 20 30 40 50]]
a.dtype: Int64
type: <class 'mindspore.common.tensor.Tensor'>
num_element: 10
shape: (2, 5)
dim: 2

ms.Tensor 是用小括号表示的,而不是中括号。

同样,tensor ( [ [ 1, 2, 3, 4, 5 ],[10, 20, 30, 40, 50 ] ] ) 的尺寸是 2×5,而不是 1×2×5 。最外面的小括号不算在维数内,只是用于将Tensor包起来。

三、不同框架Tensor之间的转换:以numpy为桥梁

由于不同深度学习框架中的Tensor不能直接转换,而我们在框架迁移时又想方便的利用已有框架的Tensor进行训练。如将pytorch的代码改写为mindspore代码时,可先将torch.Tensor转为numpy,再将numpy转为mindspore.Tensor,这样就实现了Tensor类型的转换。

1、torch.Tensor与numpy的转换

t.numpy(): 将torch.Tensor转换为numpy
torch.from_numpy(np): 将numpy转换为torch.Tensor

转换之后,Tensor与numpy共享内存,对其中一个修改,另一个也会随之改变。

example:

import torch
import numpy as np

a=torch.Tensor([[1,2,3],[10,20,30]])
b=a.numpy()   # 将a转为numpy格式,ab共享内存,修改a的时候b也会随之修改
print("a.type: ",type(a))
print("b.type: ",type(b))

c=torch.from_numpy(b)    # 将b转换为Tensor格式,ab共享内存
print("c.type: ",type(c))

print:

a.type:  <class 'torch.Tensor'>
b.type:  <class 'numpy.ndarray'>
c.type:  <class 'torch.Tensor'>

2、mindspore.Tensor与numpy的转换

t.asnumpy(): 将ms.Tensor转换为numpy
mindspore.common.tensor.Tensor(np): 将numpy转换为ms.Tensor

转换之后,Tensor与numpy独立,不共享内存,对其中一个修改,另一个不会随之改变。

example:

import mindspore as ms
import numpy as np
from mindspore.common.tensor import Tensor

a=ms.Tensor([[1,2,3],[10,20,30]])
b=a.asnumpy()     # 将Tensor转换为numpy格式
print("a.type: ",type(a))
print("b.type: ",type(b))

c=Tensor(b)       # 将numpy转换为Tensor格式
print("c.type: ",type(c))

print:

a.type:  <class 'mindspore.common.tensor.Tensor'>
b.type:  <class 'numpy.ndarray'>
c.type:  <class 'mindspore.common.tensor.Tensor'>
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctrl A_ctrl C_ctrl V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值