Compréhension approfondie de la méthode de connexion entre l'ajout par élément et la carte de fonctionnalités de concaténation

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-wiseIntroduction 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-wiseLa notion de

elementwiseUne opération fait référence à deux tenseurs de même forme (forme), enÉlément correspondantContinuéOpérations au niveau du bit

  • element-wiseOpé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-wisedes 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} un1un2unn 1unn b1b2bn 1bn = un1b1un2b2unn 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}unb=je = 1nunjebje

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 productIl 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. broadcastingMé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-wiseseuls 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 broadcastingafin que deux tenseurs de formes différentes puissent effectuer des opérations arithmétiques.

broadcasting2.Mécanisme de diffusion

Le tenseur d'ordre inférieur broadcastingest transformé via le mécanisme de diffusion pour correspondre à la forme du tenseur d'ordre élevé afin que element-wiseles opérations puissent être effectuées.broadcastingLa diffusion est un element-wisesujet 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-wiseles 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 broadcastla 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 operationLa notion de

concatenation operationest 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 = 1cXje*Kje+je = 1cOuije*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 = 1c( Xje+Ouije)*Kje=je = 1cXje*Kje+je = 1cOuije*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.

おすすめ

転載: blog.csdn.net/m0_37605642/article/details/132747021