Maison  >  Article  >  développement back-end  >  Exemple détaillé de structure de données tensorielles dans Pytorch

Exemple détaillé de structure de données tensorielles dans Pytorch

WBOY
WBOYavant
2022-09-14 17:25:532791parcourir

【Recommandation associée : Tutoriel vidéo Python3

torch.Tensor

torch.Tensor est une matrice multidimensionnelle contenant des éléments de type de données unique , similaire au array de numpy.
Le Tensor peut être généré à l'aide de torch.tensor() pour convertir la liste de Python ou les données de séquence. Celle générée est dtype et la valeur par défaut est torch. FloatTensor. torch.Tensor 是一种包含单一数据类型元素的多维矩阵,类似于 numpy 的 array
Tensor 可以使用 torch.tensor() 转换 Python 的 list 或序列数据生成,生成的是dtype 默认是 torch.FloatTensor

注意 torch.tensor() 总是拷贝 data。如果你有一个 Tensor data 并且仅仅想改变它的 requires_grad 属性,可用 requires_grad_() 或者 detach() 来避免拷贝。如果你有一个 numpy 数组并且想避免拷贝,请使用 torch.as_tensor()

1,指定数据类型的 Tensor 可以通过传递参数 torch.dtype 和/或者 torch.device 到构造函数生成:

注意为了改变已有的 tensor 的 torch.device 和/或者 torch.dtype, 考虑使用 to() 方法.

>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
>>> torch.ones([2,3], dtype=torch.float32)
tensor([[1., 1., 1.],
        [1., 1., 1.]])

2,Tensor 的内容可以通过 Python索引或者切片访问以及修改:

>>> matrix = torch.tensor([[2,3,4],[5,6,7]])
>>> print(matrix[1][2])
tensor(7)
>>> matrix[1][2] = 9
>>> print(matrix)
tensor([[2, 3, 4],
        [5, 6, 9]])

3,使用 torch.Tensor.item() 或者 int() 方法从只有一个值的 Tensor中获取 Python Number:

>>> x = torch.tensor([[4.5]])
>>> x
tensor([[4.5000]])
>>> x.item()
4.5
>>> int(x)
4

4,Tensor可以通过参数 requires_grad=True 创建, 这样 torch.autograd 会记录相关的运算实现自动求导:

>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
>>> out = x.pow(2).sum()
>>> out.backward()
>>> x.grad
tensor([[ 2.0000, -2.0000],
 [ 2.0000,  2.0000]])

5,每一个 tensor都有一个相应的 torch.Storage 保存其数据。tensor 类提供了一个多维的、strided 视图, 并定义了数值操作。

Tensor 数据类型

Torch 定义了七种 CPU tensor 类型和八种 GPU tensor 类型:

Exemple détaillé de structure de données tensorielles dans Pytorch

torch.Tensor 是默认的 tensor 类型(torch.FloatTensor)的简称,即 32 位浮点数数据类型。

Tensor 的属性

Tensor 有很多属性,包括数据类型、Tensor 的维度、Tensor 的尺寸。

  • 数据类型:可通过改变 torch.tensor() 方法的 dtype 参数值,来设定不同的 tensor 数据类型。
  • 维度:不同类型的数据可以用不同维度(dimension)的张量来表示。标量为 0 维张量,向量为 1 维张量,矩阵为 2 维张量。彩色图像有 rgb 三个通道,可以表示为 3 维张量。视频还有时间维,可以表示为 4 维张量,有几个中括号 [ 维度就是几。可使用 dim() 方法 获取 tensor 的维度。
  • 尺寸:可以使用 shape属性或者 size()方法查看张量在每一维的长度,可以使用 view()方法或者reshape() 方法改变张量的尺寸。

样例代码如下:

matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],
                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)
print(matrix)               # 打印 tensor
print(matrix.dtype)     # 打印 tensor 数据类型
print(matrix.dim())     # 打印 tensor 维度
print(matrix.size())     # 打印 tensor 尺寸
print(matrix.shape)    # 打印 tensor 尺寸
matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸
print(matrix2)

程序输出结果如下:

Exemple détaillé de structure de données tensorielles dans Pytorch


view 和 reshape 的区别

两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(contiguous)的 tensor 进行操作,而 reshape() 同时还可以对不满足连续性条件的 tensor 进行操作。在满足 tensor 连续性条件(contiguous)时,a.reshape() 返回的结果与a.view() 相同,都不会开辟新内存空间;不满足 contiguous 时, 直接使用 view() 方法会失败,reshape() 依然有用,但是会重新开辟内存空间,不与之前的 tensor 共享内存,即返回的是 ”副本“(等价于先调用 contiguous() 方法再使用 view() 方法)。
更多理解参考这篇文章

Tensor 与 ndarray

1,张量和 numpy 数组。可以用 .numpy() 方法从 Tensor 得到 numpy 数组,也可以用 torch.from_numpy 从 numpy 数组得到Tensor。这两种方法关联的 Tensor 和 numpy 数组是共享数据内存的。可以用张量的 clone方法拷贝张量,中断这种关联。

arr = np.random.rand(4,5)
print(type(arr))
tensor1 = torch.from_numpy(arr)
print(type(tensor1))
arr1 = tensor1.numpy()
print(type(arr1))
"""
<class &#39;numpy.ndarray&#39;>
<class &#39;torch.Tensor&#39;>
<class &#39;numpy.ndarray&#39;>
"""

2,item() 方法和 tolist()

Notez que torch.tensor() copie toujours les données. Si vous disposez de données Tensor et que vous souhaitez simplement modifier son attribut requires_grad, utilisez requires_grad_() ou detach() pour éviter la copie. Si vous disposez d'un tableau numpy et que vous souhaitez éviter la copie, utilisez torch.as_tensor(). 🎜
🎜1. Un Tensor d'un type de données spécifié peut être généré en passant les paramètres torch.dtype et/ou torch.device au constructeur : 🎜🎜 Notez que pour changer le torch.device et/ou torch.dtype d'un tenseur existant, pensez à utiliser la méthode to().🎜
# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class &#39;float&#39;>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class &#39;list&#39;>
"""
🎜2 Le contenu. d'un Tensor peut être indexé ou découpé via Python Accédez et modifiez : 🎜
>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
🎜3, utilisez la méthode torch.Tensor.item() ou int() à partir de Tensor avec une seule valeur Obtenez le numéro Python : 🎜rrreee🎜4, Tensor peut être créé avec le paramètre requires_grad=True, de sorte que torch.autograd enregistrera les opérations pertinentes pour réaliser la dérivation automatique : 🎜rrreee🎜5 , chaque tenseur a un torch.Storage correspondant pour sauvegarder ses données. La classe tenseur fournit une vue multidimensionnelle et progressive et définit des opérations numériques. 🎜🎜Type de données Tensor🎜🎜Torch définit sept types de tenseurs CPU et huit types de tenseurs GPU : 🎜

type de données tenseur🎜🎜torch.Tensor est le type de tenseur par défaut (torch.FloatTensor ), c'est-à-dire un type de données à virgule flottante <code>32 bits. 🎜🎜Attributs du Tensor🎜🎜Tensor a de nombreux attributs, notamment le type de données, la dimension du Tensor et la taille du Tensor. 🎜

  • Type de données : différents types de données tenseurs peuvent être définis en modifiant la valeur du paramètre dtype de la méthode torch.tensor().
  • Dimension : différents types de données peuvent être représentés par des tenseurs de différentes dimensions. Un scalaire est un tenseur à 0 dimension, un vecteur est un tenseur à 1 dimension et une matrice est un tenseur à 2 dimensions. Les images couleur ont trois canaux, RVB, et peuvent être représentées comme un tenseur tridimensionnel. La vidéo a également une dimension temporelle, qui peut être exprimée sous la forme d'un tenseur à 4 dimensions avec plusieurs crochets [Les dimensions sont combien. Les dimensions d'un tenseur peuvent être obtenues à l'aide de la méthode dim().
  • Taille : vous pouvez utiliser l'attribut shape ou la méthode size() pour afficher la longueur du tenseur dans chaque dimension, et vous pouvez utiliser la méthode view() ou la méthode reshape() pour modifier la taille du tenseur.
🎜L'exemple de code est le suivant : 🎜rrreee🎜Le résultat du programme est le suivant : 🎜

attribut tensor🎜


🎜🎜La différence entre visualiser et remodeler🎜 🎜Les deux méthodes sont identiques. Elle est utilisée pour changer la forme du tenseur. view() ne convient qu'aux tenseurs opérationnels qui remplissent les conditions de continuité (contigu), tandis que reshape() peut également opérer sur tenseurs qui ne remplissent pas les conditions de continuité. Lorsque la condition de continuité du tenseur (contigu) est satisfaite, le résultat renvoyé par a.reshape() est le même que a.view(), et aucun nouvel espace mémoire ne sera ouvert si  ; contigu n'est pas satisfait du code>, l'utilisation directe de la méthode view() échouera. reshape() est toujours utile, mais il rouvrira l'espace mémoire et ne partagera pas la mémoire. avec le tenseur précédent, c'est-à-dire qu'il renverra une copie de "" " (équivalent à appeler d'abord la méthode contiguous() puis à utiliser view( )).
Pour plus de compréhension, reportez-vous à cet article🎜🎜Tensor et ndarray🎜🎜1, tensor et numpy array. Vous pouvez utiliser la méthode .numpy() pour obtenir un tableau numpy à partir d'un Tensor, ou vous pouvez utiliser torch.from_numpy pour obtenir un Tensor à partir d'un tableau numpy. Les tableaux Tensor et numpy associés à ces deux méthodes partagent la mémoire des données. Vous pouvez utiliser la méthode clone du tenseur pour copier le tenseur et rompre cette association. 🎜rrreee🎜2, la méthode item() et la méthode tolist() peuvent convertir des tenseurs en nombres Python et en listes de nombres🎜

# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class &#39;float&#39;>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class &#39;list&#39;>
"""

创建 Tensor

创建 tensor ,可以传入数据或者维度,torch.tensor() 方法只能传入数据,torch.Tensor() 方法既可以传入数据也可以传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。

传入维度的方法

方法名 方法功能 备注
torch.rand(*sizes, out=None) → Tensor 返回一个张量,包含了从区间 [0, 1)均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。 推荐
torch.randn(*sizes, out=None) → Tensor 返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。 不推荐
torch.normal(means, std, out=None) → Tensor 返回一个张量,包含了从指定均值 means 和标准差 std 的离散正态分布中抽取的一组随机数。标准差 std 是一个张量,包含每个输出元素相关的正态分布标准差。 多种形式,建议看源码
torch.rand_like(a) 根据数据 a 的 shape 来生成随机数据 不常用
torch.randint(low=0, high, size) 生成指定范围(low, hight)和 size 的随机整数数据 常用
torch.full([2, 2], 4) 生成给定维度,全部数据相等的数据 不常用
torch.arange(start=0, end, step=1, *, out=None) 生成指定间隔的数据 易用常用
torch.ones(*size, *, out=None) 生成给定 size 且值全为1 的矩阵数据 简单
zeros()/zeros_like()/eye() 0 的 tensor 和 对角矩阵 简单

样例代码:

>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

【相关推荐:Python3视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer