1. Documents de référence
Concaténation et opérations élémentaires de l'apprentissage profond (1)
Concaténation et opérations élémentaires de l'apprentissage profond (2)
2. element-wise
Introduction connexe
1. Correspondance vs éléments correspondants
Si deux éléments occupent la même position dans deux tenseurs, les deux éléments sont considérés comme correspondants, et la correspondance est déterminée par l'indice de l'élément.
> t1 = torch.tensor([ [1,2], [3,4] ], dtype=torch.float32)
> t2 = torch.tensor([ [9,8], [7,6] ], dtype=torch.float32)
# Example of the first axis
> print(t1[0])
tensor([1., 2.])
# Example of the second axis
> print(t1[0][0])
tensor(1.)
# t1中的1元素,对应t2中的9
> t1[0][0] tensor(1.)
> t2[0][0] tensor(9.)
2. element-wise
La notion de
elementwise
Une opération fait référence à deux tenseurs de même forme (forme), enÉlément correspondantContinuéOpérations au niveau du bit。
element-wise
Opérer sur des tenseurs de même forme , c'est-à-direLes tenseurs doivent avoir le même nombre d'éléments pour effectuer des opérations élément par élément。- Toutes les opérations arithmétiques, addition, soustraction, multiplication et division sont
element-wise
des opérations. Les opérations tensorielles que nous voyons habituellement sont des opérations arithmétiques utilisant des valeurs scalaires .
Les termes suivants font tous référence à element-wise
:
Element-wise
Component-wise
Point-wise
3.element-wise add
3.1 Opérateurs arithmétiques
Utilisez +、-、*、/
des opérateurs arithmétiques pour effectuer des opérations arithmétiques.
> t1 = torch.tensor([ [1,2], [3,4] ], dtype=torch.float32)
> t2 = torch.tensor([ [9,8], [7,6] ], dtype=torch.float32)
> t1 + t2
tensor([[10., 10.],
[10., 10.]])
> print(t1 + 2)
tensor([[3., 4.],
[5., 6.]])
> print(t1 - 2)
tensor([[-1., 0.],
[ 1., 2.]])
> print(t1 * 2)
tensor([[2., 4.],
[6., 8.]])
> print(t1 / 2)
tensor([[0.5000, 1.0000],
[1.5000, 2.0000]])
3.2 Méthodes intégrées
Utilisez les méthodes intégrées des tenseurs pour effectuer des opérations arithmétiques.
> t1 = torch.tensor([ [1,2], [3,4] ], dtype=torch.float32)
> t2 = torch.tensor([ [9,8], [7,6] ], dtype=torch.float32)
> print(t1.add(2))
tensor([[3., 4.],
[5., 6.]])
> print(t1.sub(2))
tensor([[-1., 0.],
[ 1., 2.]])
> print(t1.mul(2))
tensor([[2., 4.],
[6., 8.]])
> print(t1.div(2))
tensor([[0.5000, 1.0000],
[1.5000, 2.0000]])
4.Dot Product
[ a 1 a 2 ⋮ an − 1 an ] ⋅ [ b 1 b 2 ⋮ bn − 1 milliard ] = [ a 1 b 1 a 2 b 2 ⋮ an − 1 milliard − 1 anbn ] = a 1 b 1 + a b 2 + ⋯ + an − 1 milliard − 1 + anbn \left[\begin{array}{c}a_1\\a_2\\\vdots\\a_{n-1}\\a_n\end{array}\right ] \cdot\left[\begin{array}{c}b_1\\b_2\\\vdots\\b_{n-1}\\b_n\end{array}\right] = \begin{bmatrix}a_{1 } b_{1}\\a_{2} b_{2}\\\vdots\\a_{n-1} b_{n-1}\\a_{n} b_{n}\end{bmatrix} = \ mathbf {a}_{1}\mathbf{a}_{1}+\mathbf{a}_{2}\mathbf{b}_{2}+\cdots+\mathbf{a}_{n-1} \ mathbf{b}_{n-1}+\mathbf{a}_{n}\mathbf{b}_{n} un1un2⋮unn − 1unn ⋅ b1b2⋮bn − 1bn = un1b1un2b2⋮unn − 1bn − 1unnbn =un1b1+un2b2+⋯+unn − 1bn − 1+unnbn
简化使用求和公式:
a ⋅ b = ∑ i = 1 naibi \mathbf{a}\cdot\mathbf{b}=\sum _{i=1}^{n}\mathbf{a}_{i}\ mathbf {bi}un⋅b=je = 1∑nunjebje
import numpy as np
np1 = np.array([4, 6])
np2 = np.array([[-3], [7]])
print(np.dot(np1, np2)
## [30]
# 4*-3 + 6*7 = 42*12 = 30
5.element-wise product
element-wise product
Il s’agit en fait d’une multiplication élément par élément de deux tenseurs de même forme.
import numpy as np
np1 = np.array([4, 6])
np2 = np.array([-3, 7])
print(np2 * np1)
# [-12 42]
import numpy as np
np1 = np.array([4, 6])
print(np1 * 3)
# [12 18]
3. broadcasting
Mécanisme de diffusion
1. Introduction
Si la valeur scalaire 2 est un tenseur de degré 0, c'est-à-dire qu'il n'a pas de forme, le tenseur t1 est un tenseur de degré 2 de forme 2x2. Comme suit:
> a = 2
> t1 = torch.tensor([ [1,2], [3,4] ], dtype=torch.float32)
Puisque element-wise
seuls des tenseurs de même forme peuvent être utilisés, afin de résoudre le problème des formes incohérentes de deux tenseurs, un mécanisme de diffusion est introduit broadcasting
afin que deux tenseurs de formes différentes puissent effectuer des opérations arithmétiques.
broadcasting
2.Mécanisme de diffusion
Le tenseur d'ordre inférieur broadcasting
est transformé via le mécanisme de diffusion pour correspondre à la forme du tenseur d'ordre élevé afin que element-wise
les opérations puissent être effectuées.broadcasting
La diffusion est un element-wise
sujet plus avancé que les opérations de base。
> np.broadcast_to(2, t1.shape)
array([[2, 2],
[2, 2]])
Convertissez la valeur scalaire 2 en un tenseur de rang 2 avec la même forme que t1, et element-wise
les règles de correspondance de forme et les aspects ont la même forme.
> t1 + 2
tensor([[3., 4.],
[5., 6.]])
Fonctionnement réel :
> t1 + torch.tensor(
np.broadcast_to(2, t1.shape)
,dtype=torch.float32
)
tensor([[3., 4.],
[5., 6.]])
3. Exemples complexes
t1 = torch.tensor([
[1,1],
[1,1]
], dtype=torch.float32)
t2 = torch.tensor([2,4], dtype=torch.float32)
# t1 + t2 ???????
> t1.shape
torch.Size([2, 2])
> t2.shape
torch.Size([2])
Utilisez broadcast_to()
la fonction du package numpy pour vérifier broadcast
la conversion.
> np.broadcast_to(t2.numpy(), t1.shape)
array([[2., 4.],
[2., 4.]], dtype=float32)
> t1 + t2
tensor([[3., 5.],
[3., 5.]])
Après diffusion, l'opération d'addition entre ces deux tenseurs est l'opération entre tenseurs de même formeelement-wise
.
Quatre,concatenation operation
1. concatenation operation
La notion de
concatenation operation
est la concaténation entre deux tenseurs.
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a.shape)
b = np.array([[5, 6]])
print(b.shape)
np.concatenate((a, b))
c= np.concatenate((a, b))
print(c)
print(c.shape)
# 输出
Out[1]: (2, 2)
Out[2]: (1, 2)
Out[3]:
array([[1, 2],
[3, 4],
[5, 6]])
Out[4]: (3, 2)
2. Plusieurs formes de connexion de la carte des fonctionnalités
2.1concatenate
méthode de concaténation :Convoluer d'abord, puis concaténer. Convoluez d'abord chaque canal, puis fusionnez les canaux.
La méthode de concaténation consiste à fusionner les numéros de canaux. Le nombre de caractéristiques décrivant l'image elle-même (nombre de canaux) augmente, mais les informations sous chaque caractéristique n'augmentent pas.
Z concat = ∑ je = 1 c X je ∗ K je + ∑ je = 1 c Oui je ∗ K je + c Z_{\mathrm{concat}}=\sum_{i=1}^cX_i*K_i+\sum_{i =1}^cY_i*K_{i+c}Zconcaténer=je = 1∑cXje*Kje+je = 1∑cOuije*Kje + c
2.2element-wise add
ajouter une méthode :Ajouter d'abord, puis convoluer. Les cartes de fonctionnalités correspondantes sont d'abord ajoutées puis convoluées. Les informations sémantiques des cartes de fonctionnalités des canaux correspondants sont similaires et les cartes de fonctionnalités correspondantes partagent un noyau de convolution.
La méthode add augmente la quantité d'informations sur les caractéristiques décrivant chaque dimension de l'image, mais la dimension elle-même n'augmente pas, ce qui est évidemment significatif pour la classification finale de l'image.
Z ajouter = ∑ i = 1 c ( X i + Y i ) ∗ K i = ∑ i = 1 c \sum_{i=1}^c\left(X_i+Y_i\right)*K_i=\sum_{i= 1}^cX_i*K_i+\sum_{i=1}^cY_i*K_i\end{aligned}Zun jj=je = 1∑c( Xje+Ouije)*Kje=je = 1∑cXje*Kje+je = 1∑cOuije*Kje
2.3 Résumé
-
De nouvelles fonctionnalités seront obtenues via l'opération d'ajout. Cette nouvelle fonctionnalité peut refléter certaines caractéristiques des fonctionnalités d'origine, mais certaines informations des fonctionnalités d'origine seront également perdues en raison de la méthode d'ajout ; la concaténation consiste à fusionner directement les fonctionnalités d'origine et à laisser les réseau, apprenez à les intégrer. Les fonctionnalités et les informations ne seront pas perdues dans ce processus.
-
Le montant du calcul de concat est relativement important.Lorsque la relation entre les caractéristiques d'origine est claire, le coût de calcul peut être économisé en utilisant l'opération d'ajout pour fusionner.