Múltiples canales de entrada y múltiples canales de salida.

Parte de las notas de estudio de "Practica Pytorch de aprendizaje profundo" es solo para tu propia revisión.

 Múltiples canales de entrada y múltiples canales de salida.

En las dos primeras secciones, la entrada y la salida que usamos son matrices bidimensionales, pero las dimensiones de los datos reales suelen ser más altas. Por ejemplo, una imagen en color tiene 3 canales de color RGB (rojo, verde, azul) además de las dos dimensiones de alto y ancho. Suponiendo que la altura y el ancho de la imagen en color son h y w (píxeles) respectivamente, entonces se puede expresar como una matriz multidimensional. Llamamos a esta dimensión con un tamaño de 3 como dimensión del canal . En esta sección presentaremos núcleos de convolución con múltiples canales de entrada o múltiples canales de salida.

Múltiples canales de entrada

Cuando los datos de entrada contienen múltiples canales, necesitamos construir un kernel de convolución con el mismo número de canales de entrada que el de los datos de entrada, para que pueda realizar cálculos de correlación cruzada con datos de entrada que contengan múltiples canales.

La Figura 5.4 muestra un ejemplo del cálculo de correlación cruzada bidimensional con 2 canales de entrada. En cada canal, la matriz de entrada bidimensional y la matriz de núcleo bidimensional realizan operaciones de correlación cruzada y luego las agregan de acuerdo con los canales para obtener la salida.

 

A continuación, implementamos el cálculo de correlación cruzada con múltiples canales de entrada. Solo necesitamos realizar operaciones de correlación cruzada en cada canal y luego usar la función add_n para acumular.

import torch
from torch import nn
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
def corr2d_multi_in(X, K):
    # 沿着X和K的第0维(通道维)分别计算再相加
    res = d2l.corr2d(X[0, :, :], K[0, :, :])
    for i in range(1, X.shape[0]):
        res += d2l.corr2d(X[i, :, :], K[i, :, :])
    return res

Podemos construir la matriz de entrada X y la matriz de núcleo K en la figura 5.4 para verificar la salida de la operación de correlación cruzada. 

X = torch.tensor([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])
K = torch.tensor([[[0, 1], [2, 3]], [[1, 2], [3, 4]]])
corr2d_multi_in(X, K)

Salida: tensor ([[56., 72.],
[104., 120.]])

Múltiples canales de salida

Implemente una función de cálculo de correlación cruzada para calcular la salida de múltiples canales.

def corr2d_multi_in_out(X, K):
# 对K的第0维遍历,每次同输⼊X做互相关计算。所有结果使用stack函数合并在一起
    return torch.stack([corr2d_multi_in(X, k) for k in K])

Concatenamos la matriz de kernel K con K + 1 (cada elemento de K más uno) y K + 2 para construir un kernel de convolución con 3 canales de salida.

K = torch.stack([K, K + 1, K + 2])
K.shape # torch.Size([3, 2, 2, 2])

A continuación, realizamos operaciones de correlación cruzada en la matriz de entrada X y la matriz de kernel K. La salida en este momento contiene 3 canales. El resultado del primer canal es consistente con los resultados del cálculo anterior de la matriz de entrada X y el canal de entrada múltiple y el núcleo del canal de salida única.

corr2d_multi_in_out(X, K) 

Salida:

tensor ([[[56., 72.],
[104., 120.]],
[[76., 100.],
[148., 172.]],
[[96., 128.],
[192 ., 224.]]])

Capa convolucional 1X1

Finalmente, discutimos la capa convolucional multicanal con una forma de ventana de convolución de (1x1). Por lo general, la llamamos capa de convolución 1X1, y la operación de convolución en ella se llama convolución 1X1. Debido a que se utiliza la ventana mínima 了, la convolución pierde la función de la capa convolucional 了 que puede reconocer patrones formados por elementos adyacentes en las dimensiones de altura y anchura. De hecho, el cálculo principal de la convolución 1x1 ocurre en la dimensión del canal. La Figura 5.5 muestra el cálculo de correlación cruzada usando un núcleo de convolución con 3 canales de entrada y 2 canales de salida. Vale la pena señalar que la entrada y la salida tienen la misma altura y ancho. Cada elemento de la salida se basa en la acumulación ponderada de elementos en la misma posición en altura y ancho en la entrada. Suponiendo que consideramos la dimensión del canal como la dimensión de la característica y los elementos en las dimensiones de alto y ancho como muestras de datos, entonces la función de la capa convolucional 1x1 es equivalente a la capa completamente conectada.

A continuación, usamos la multiplicación de matrices en la capa completamente conectada para lograr una convolución 1x1. Esto requiere algunos ajustes en la forma de los datos antes y después de la operación de multiplicación de matrices.

def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.view(c_i, h * w)
    K = K.view(c_o, c_i)
    Y = torch.mm(K, X) # 全连接层的矩阵乘法
    return Y.view(c_o, h, w)

Se ha verificado que al hacer una convolución 1x1, la función anterior es equivalente a la función de operación de correlación cruzada previamente implementada corr2d_multi_in_out.

Salida: Verdadero

En el modelo posterior 里 veremos que la capa convolucional 1x1 se usa como una capa completamente conectada que mantiene una forma alta y de dimensión ancha 不. Por lo tanto, podemos controlar la complejidad del modelo ajustando el número de canales entre capas de red.

resumen

  • El uso de múltiples canales puede expandir los parámetros del modelo de la capa convolucional.
  • Suponiendo que la dimensión del canal se considera la dimensión de la característica, y los elementos en las dimensiones de altura y ancho se consideran muestras de datos, entonces el papel de la capa convolucional 1x1 es equivalente a la capa completamente conectada.
  • La capa convolucional 1x1 se usa generalmente para ajustar el número de canales entre las capas de red y controlar la complejidad del modelo.

Supongo que te gusta

Origin blog.csdn.net/dujuancao11/article/details/108491029
Recomendado
Clasificación