Alors que je parcourais la documentation de Pytorch, je suis tombé sur un terme layout = torch.strided
dans de nombreuses fonctions. Quelqu'un peut-il m'aider à comprendre où il est utilisé et comment. La description indique que c'est la disposition souhaitée du Tenseur retourné. Que signifie la mise en page et combien de types de mise en page existe-t-il?
torch.Rand(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
strides
est le nombre d'étapes (ou de sauts) nécessaires pour passer d'un élément à l'élément suivant, dans une dimension donnée. Dans la mémoire de l'ordinateur, les données sont stockées linéairement dans un bloc de mémoire contigu. Ce que nous voir est juste une (re) présentation.
Prenons un exemple de tenseur pour comprendre ceci:
# a 2D tensor
In [62]: tensor = torch.arange(1, 16).reshape(3, 5)
In [63]: tensor
Out[63]:
tensor([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
Avec ce tenseur en place, les progrès sont les suivants:
# get the strides
In [64]: tensor.stride()
Out[64]: (5, 1)
Ce que dit ce tuple résultant (5, 1)
Est:
1
à 6
, nous devons faire 5 pas (ou sauts)7
à 8
, nous devons faire 1 pas (ou sauter)L'ordre (ou index) de 5
Et 1
Dans le Tuple représente la dimension/l'axe. Vous pouvez également passer la dimension, pour laquelle vous souhaitez la foulée, comme argument:
# get stride for axis 0
In [65]: tensor.stride(0)
Out[65]: 5
# get stride for axis 1
In [66]: tensor.stride(1)
Out[66]: 1
Avec cette compréhension, nous pourrions avoir à demander pourquoi ce paramètre supplémentaire est-il nécessaire lorsque nous créons les tenseurs? La réponse à cela est pour des raisons d'efficacité. (Comment pouvons-nous stocker/lire/accéder plus efficacement aux éléments du tenseur (clairsemé)?).
Avec tenseurs clairsemés (un tenseur où la plupart des éléments ne sont que des zéros), donc nous ne voulons pas stocker ces valeurs. nous stockons uniquement les valeurs non nulles et leurs indices. Avec une forme souhaitée, les autres valeurs peuvent ensuite être remplies de zéros, donnant le tenseur clairsemé souhaité.
Pour plus de lecture à ce sujet, les articles suivants pourraient être utiles:
P.S : Je suppose qu'il y a une faute de frappe dans la documentation torch.layout
Qui dit
Les enjambées sont une liste d'entiers ...
Le type de données composite renvoyé par tensor.stride()
est un tuple, pas une liste.
Pour une compréhension rapide, layout=torch.strided
correspond à tenseurs denses tandis que layout=torch.sparse_coo
correspond à tenseurs clairsemés .
D'un autre point de vue, nous pouvons le comprendre avec torch.tensor.view . Un tenseur peut être visualisé indique qu'il est contigu. Si nous changeons la vue d'un tenseur, les foulées changeront en conséquence, mais les données resteront les mêmes. Plus précisément, view
renvoie un nouveau tenseur avec les mêmes données mais de forme différente, et strides
est compatible avec le view
pour indiquer comment accéder aux données dans la mémoire.
Par exemple
In [1]: import torch
In [2]: a = torch.arange(15)
In [3]: a.data_ptr()
Out[3]: 94270437164688
In [4]: a.stride()
Out[4]: (1,)
In [5]: a = a.view(3, 5)
In [6]: a.data_ptr() # share the same data pointer
Out[6]: 94270437164688
In [7]: a.stride() # the stride changes as the view changes
Out[7]: (5, 1)
De plus, l'idée de torch.strided
est fondamentalement la même chose que les pas dans numpy. Consultez cette question pour une compréhension plus détaillée. Comment comprendre les foulées numpy pour le profane?
Selon la documentation officielle de Pytorch ici ,
Un torch.layout est un objet qui représente la disposition de la mémoire d'un torch.Tensor. Actuellement, nous prenons en charge torch.strided (tenseurs denses) et avons un support expérimental pour torch.sparse_coo (tenseurs COO clairsemés).
torch.strided représente des tenseurs denses et est la disposition de mémoire la plus couramment utilisée. Chaque tenseur stridé a une torche associée. Stockage, qui contient ses données. Ces tenseurs offrent une vue multidimensionnelle et étirée d'un stockage. Les foulées sont une liste d'entiers: la k-ième foulée représente le saut en mémoire nécessaire pour passer d'un élément au suivant dans la k-ième dimension du Tenseur. Ce concept permet de réaliser efficacement de nombreuses opérations tensorielles.
Exemple:
>>> x = torch.Tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> x.stride()
(5, 1)
>>> x.t().stride()
(1, 5)