[PYTHON] Comprendre le produit tensoriel (numpy.tensordot)

Je n'ai pas compris de façon catastrophique le tensordot de numpy, mais je sens que je pourrais le comprendre en recherchant diverses choses, alors je vais en prendre note.

Ce sujet

>>> import numpy as np
>>> a = np.arange(12).reshape(2,3,2)
>>> b = np.arange(48).reshape(3,2,8)
>>> c = np.tensordot(a,b, axes=([1,0], [0,1]))

>>> a
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])

>>> b
array([[[ 0,  1,  2,  3,  4,  5,  6,  7],
        [ 8,  9, 10, 11, 12, 13, 14, 15]],

       [[16, 17, 18, 19, 20, 21, 22, 23],
        [24, 25, 26, 27, 28, 29, 30, 31]],

       [[32, 33, 34, 35, 36, 37, 38, 39],
        [40, 41, 42, 43, 44, 45, 46, 47]]])

>>> c
array([[ 800,  830,  860,  890,  920,  950,  980, 1010],
       [ 920,  956,  992, 1028, 1064, 1100, 1136, 1172]])

Ce que nous faisons avec np.tensordot 1: Générer une matrice intermédiaire à partir de la matrice a

1.jpg

L'image est que les éléments sont pris dans l'ordre de la deuxième dimension et de la première dimension de la matrice a, et une matrice intermédiaire pour le calcul est créée. La forme de la matrice intermédiaire est le numéro de la deuxième dimension x le numéro de la première dimension.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435353431382f64393430643066642d636365652d373531322d623936652d6638383065613963376462662e6a706567.png

Dans ce cas, c'est une image qu'une matrice intermédiaire de forme 3 (deuxième numéro de dimension) x 2 (premier numéro de dimension) est créée.

3.jpg

4.jpg

Dans tous les cas, prenez d'abord l'élément supérieur gauche.

Quel élément choisir ensuite? Puisqu'il est repris dans l'ordre de la deuxième dimension et de la première dimension, Tout d'abord, prenez dans l'ordre de la deuxième dimension.

5.jpg

Ce sera comme ça une fois ramassé dans l'ordre de la deuxième dimension.

De plus, quel élément choisir ensuite est Je l'ai pris dans l'ordre de la deuxième dimension, donc Ensuite, sautez sur l'île "inférieure" dans l'ordre de la première dimension.

6.jpg

Comme précédemment, ramassez les éléments dans le deuxième ordre dimensionnel sur l'îlot «inférieur».

Vous avez maintenant une matrice 3x2.

7.jpg

Faites de même pour le côté «droit».

Vous avez maintenant une deuxième matrice 3x2.

En conséquence, la structure suivante est créée.

8.jpg

Ce que nous faisons avec np.tensordot 2: Générer une matrice intermédiaire à partir de la matrice b

9.jpg

L'image est que les éléments sont pris dans l'ordre de la première dimension et de la seconde dimension de la matrice b, et une matrice intermédiaire pour le calcul est créée.

La forme de la matrice intermédiaire est le numéro de la première dimension x le numéro de la seconde dimension.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435353431382f62613436636630632d326366352d323535362d313130312d3830383662343962366331612e6a706567.png

Dans ce cas, c'est une image qu'une matrice intermédiaire de forme 3 (premier numéro de dimension) x 2 (deuxième numéro de dimension) est créée.

11.jpg

12.jpg

Dans tous les cas, prenez d'abord l'élément supérieur gauche.

Quel élément choisir ensuite? Puisqu'il est repris dans l'ordre de la première dimension et de la seconde dimension, Ensuite, vous devez sauter sur l'île "du bas".

13.jpg

Ce sera comme ça une fois ramassé dans l'ordre de la première dimension.

De plus, quel élément choisir ensuite est Je l'ai pris dans l'ordre de la première dimension, donc Ensuite, nous reviendrons sur l'île «supérieure» dans l'ordre de la deuxième dimension.

14.jpg

En redémarrant à partir de ④, prenez les éléments dans l'ordre de la première dimension comme précédemment.

Vous avez maintenant une matrice 3x2.

Faites de même pour le reste.

Vous devriez avoir huit matrices 3x2.

En conséquence, la structure suivante est créée.

15.jpg

Ce que nous faisons avec np.tensordot 3: Prenons le "produit" des deux matrices intermédiaires obtenues à partir de la matrice a et de la matrice b.

16.jpg

17.jpg

18.jpg

Il a été rendu compact en une matrice à 2 dimensions x 8 dimensions.

Que faites-vous conceptuellement

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435353431382f31656164613036652d663366612d393762392d363333392d3166666134353338336339342e6a706567.png

En calculant pour ces dimensions, nous pouvons réduire ces dimensions tout en préservant les informations sur ces dimensions.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435353431382f66363639666637352d303037632d316534322d396333322d3035653630386663636638302e6a706567.png

Il est compacté à la forme de ces dimensions restantes (c'est-à-dire 2 dimensions x 8 dimensions).

En ce sens, il semble qu'une telle opération s'appelle la contraction. Je l'interprète comme "réduction + résumé".

Le produit tenseur semble être comme ça.

Recommended Posts

Comprendre le produit tensoriel (numpy.tensordot)
Comprendre Tensor (2): Shape
Comprendre l'audit du système d'audit Linux
Comprendre Tensor (3): données du monde réel
Comprendre le contenu du pipeline sklearn
Pourquoi Super Intelli ne pouvait pas comprendre la classe