Red neuronal ligera clásica (1) MobileNet V1 y su aplicación en el conjunto de datos Fashion-MNIST

Red neuronal ligera clásica (1) MobileNet V1 y su aplicación en el conjunto de datos Fashion-MNIST

1 Breve descripción de MobileNet V1

Desde que fue propuesto por Google en 2017, MobileNet puede describirse como Inception en redes livianas y ha experimentado generaciones de actualizaciones.

  1. MobileNetSe aplica una convolución separable en profundidad Depthwisepara reemplazar la convolución convencional, reduciendo así la cantidad de cálculo y los parámetros del modelo.
  2. MobileNetNo sólo produce una red pequeña, sino que también se centra en optimizar la latencia de predicción. Por el contrario, hay algunas redes pequeñas con menos parámetros de red pero mayores retrasos en la predicción.
  3. Dirección de descarga del artículo: https://arxiv.org/pdf/1704.04861.pdf

1.1 Convolución separable en profundidad

Para una capa convolucional tradicional, featurese produce una única salida como esta:

  • Primero, un conjunto de filtros realiza un filtrado en cada canal de entrada para generar un filtro feature. Este paso sólo considera la correlación espacial.

  • Luego calcule featurela suma ponderada de los filtros de cada canal para obtener un único feature.

    Aquí, la suma ponderada de canales en diferentes ubicaciones tiene pesos diferentes, lo que significa que, sobre la base de la correlación espacial, la correlación de canales se superpone.

DepthwiseLa convolución separable en profundidad rompe la mezcla de correlación espacial y correlación de canal:

  • Primero, un conjunto de filtros realiza un filtrado en cada canal de entrada para generar un filtro feature. Este paso sólo considera la correlación espacial.
  • Luego se realiza una convolución 1x1para combinar diferentes filtros feature. Aquí, los pesos de las sumas ponderadas del canal en diferentes ubicaciones son los mismos, lo que significa que en este paso solo se consideran las correlaciones del canal.
  • depthwiseEl número de parámetros y el costo computacional de la convolución son de 1/8 a 1/9 de la convolución convencional.

La diferencia entre convolución tradicional y convolución separable en profundidad se puede encontrar en el siguiente blog:

Funciones de uso común en Pytorch (3) Resumen detallado de operaciones de convolución comunes en el blog-CSDN de deep learning_undo_try

1.2 Estructura de la red

1.2.1 Capa convolucional V1

inserte la descripción de la imagen aquí

El lado izquierdo de la imagen de arriba es la capa convolucional estándar y el lado derecho es la capa convolucional de V1. La capa convolucional de V1 primero utiliza una convolución de profundidad de 3 × 3 para extraer características, seguida de una capa BN, seguida de una capa ReLU, y luego una convolución punto por punto, y finalmente BN y ReLU. Esto también encaja bien con convoluciones separables en profundidad, dividiendo la convolución estándar de la izquierda en una convolución en profundidad y una convolución puntual en la derecha .

注意:El ReLU en convolución separable en profundidad es ReLU6.

inserte la descripción de la imagen aquí

El lado izquierdo de la imagen de arriba es ReLU ordinario, que no procesa valores mayores que 0. El lado derecho es ReLU6. Cuando el valor de entrada es mayor que 6, se devuelve 6. Relu6 "tiene un límite". El autor cree que ReLU6, como función de activación no lineal, es más robusta en cálculos de baja precisión .

标准卷积核深度可分离卷积层到底对结果有什么样的影响?

inserte la descripción de la imagen aquí

Como se puede ver en la figura anterior, utilizando convolución separable en profundidad y convolución estándar, los parámetros y la cantidad de cálculo se pueden reducir a aproximadamente un noveno a un octavo de este último . Pero la precisión sólo se redujo en un minúsculo 1% .

1.2.2 Estructura de la red

MobileNeetLa estructura de la red se muestra en la siguiente tabla. en:

  • Convsignifica convolución estándar y Conv dwconvolución separable en profundidad.
  • Todas las capas van seguidas de BNy ReLU(excepto la capa final completamente conectada, cuya salida se introduce directamente en softmaxla capa para su clasificación).
  • Primero, hay una convolución estándar de 3x3 y s2 se usa para reducir la resolución. Luego hay convoluciones separables en profundidad apiladas, y algunas de las convoluciones en profundidad utilizarán s2 para reducir la resolución. Luego se usa una capa de agrupación promedio para cambiar la característica a 1x1, se agrega una capa completamente conectada de acuerdo con el tamaño de la categoría predicha y, finalmente, una capa softmax. Toda la red tiene 28 capas, incluidas 13 capas convolucionales profundas.
  • A diferencia del entrenamiento de un modelo grande, MobileNetlas técnicas de regularización y mejora de conjuntos de datos se utilizan menos en el entrenamiento porque MobileNetes un modelo pequeño y no es fácil sobreajustar los modelos pequeños.

inserte la descripción de la imagen aquí

La cantidad total del cálculo se concentra básicamente en la convolución 1x1. Los parámetros se concentran principalmente en la convolución 1 x 1. Además, la capa completamente conectada representa parte de los parámetros.

  • Conv 1x1Contiene todas 1x1las capas convolucionales, incluidas las convoluciones separables 1x1.
  • Conv DW 3x3Sólo se incluyen las convoluciones en convoluciones separables 3x3.

inserte la descripción de la imagen aquí

1.3 Multiplicador de ancho, multiplicador de resolución

Aunque la MobileNetarquitectura básica ya es pequeña y tiene baja latencia, aplicaciones específicas requieren modelos más rápidos. Para ello, MobileNetse introducen dos hiperparámetros: multiplicador de ancho y multiplicador de resolución.

El multiplicador de ancho width multiplierse denota como a. De hecho, reduce feature mapla cantidad de canales de entrada y salida de cada capa de la red.

  • El multiplicador de ancho se aplica al número de canales de salida de la primera capa (que es una capa completamente convolucional). Esto también afecta la cantidad de canales de entrada y la cantidad de canales de salida Depthwisede todas las capas convolucionales separables posteriores .feature mapfeature map

    Esto se puede lograr ajustando directamente el número del canal de salida de la primera capa.

  • Reduce la cantidad de parámetros y la cantidad de cálculo aproximadamente en la proporción de a^2.

  • Por lo general, está configurado en cuatro marchas: 0,25, 0,5, 0,75, 1,0.

El multiplicador de resolución resolution multiplierse indica como p. Su función es: reducir feature mapel tamaño de la salida.

  • El multiplicador de resolución se aplica a la imagen de entrada, cambiando el tamaño de la imagen de entrada. Esto también afecta el tamaño de entrada y el tamaño de salida Depthwisede todas las capas convolucionales separables posteriores .feature mapfeature map

    Esto se puede lograr ajustando directamente el tamaño de entrada de la red.

  • No cambia la cantidad de parámetros del modelo, pero reduce la complejidad computacional aproximadamente en proporción a p^2.

如果模型同时实施了宽度乘子和分辨率乘子,则模型大概以 a^2 的比例减少了参数数量,大概以 a^2p^2 的比例降低了计算量。

Supongamos que el feature maptamaño de entrada es 14x14y el número de canales es 512; el tamaño de convolución es 3x3; el feature maptamaño de salida es 14x14y el número de canales es 512.

Tipo de capa Operaciones de multiplicar y sumar (millones) Número de parámetros (millones)
convolución regular 462 2.36
Convolución separable en profundidad 52.3 0,27
Convolución separable en profundidad con a = 0,75 29.6 0,15
Convolución separable en profundidad con a=0,75, p=0,714 15.1 0,15

1.4 Rendimiento del modelo

1.4.1 Comparación de modelos más delgados y modelos menos profundos

Cuando la cantidad de cálculo y el número de parámetros son casi los mismos, es mejor usar uno más delgado MobileNetque uno menos profundo MobileNet.

  • Modelo más delgado: use un multiplicador de ancho = 0,75 ( lo que significa que el modelo tiene una cantidad menor de canales).
  • Modelo menos profundo: se elimina MobileNetla parte central (es decir, 5 capas de convoluciones separables en profundidad).5x Conv dw/sfeature size=14x14@512
Modelo Precisión de ImageNet Operaciones de multiplicar y sumar (millones) Número de parámetros (millones)
Un MobileNet más delgado 68,4% 325 2.6
Red móvil menos profunda 65,3% 307 2.9

1.4.2 Comparación de diferentes multiplicadores de ancho y multiplicadores de resolución

A medida que a disminuye, la precisión del modelo sigue disminuyendo (a = 1 representa la línea de base MobileNet).

con multiplicador Precisión de ImageNet Operaciones de multiplicar y sumar (millones) Número de parámetros (millones)
1.0 70,6% 569 4.2
0,75 68,4% 325 2.6
0,5 63,7% 149 1.3
0,25 50,6% 41 0,5

Del mismo modo, a medida que p disminuye, la precisión del modelo sigue disminuyendo (p = 1 representa la línea de base MobileNet).

resolución Precisión de ImageNet Operaciones de multiplicar y sumar (millones) Número de parámetros (millones)
224x224 70,6% 569 4.2
192x192 69,1% 418 4.2
160x160 67,2% 290 4.2
128x128 64,4% 186 4.2

1.4.3 Comparación entre MobileNet y otros modelos

Los autores compararon V1 con redes grandes GoogleNet y VGG16.

Se puede encontrar que V1, como red liviana, tiene menos cálculo que GoogleNet, el número de parámetros es casi un orden de magnitud y su efecto de clasificación es mejor que GoogleNet, esto se debe a la convolución separable en profundidad. Los parámetros de cálculo de VGG16 son 30 veces mayores que los de V1, pero el resultado es sólo menos del 1% mayor.

inserte la descripción de la imagen aquí

El modelo reducido MobileNet(multiplicador de ancho a=0,75, multiplicador de resolución p=0,714) Squeezenetes similar en tamaño al modelo, pero tiene mayor precisión y 22 veces menos cálculos.

inserte la descripción de la imagen aquí

2 Ejemplos de aplicación de MobileNet V1 en el conjunto de datos Fashion-MNIST

2.1 Crear modelo de red MobileNet V1

Implementamos una versión simplificada del modelo.

import torch.nn as nn
import torch

class MobileNetV1(nn.Module):
    def __init__(self):
        super(MobileNetV1, self).__init__()

        def conv_bn(inp, oup, stride):
            """
               标准卷积块
            """
            return nn.Sequential(
                nn.Conv2d(in_channels=inp, out_channels=oup, kernel_size=3, stride=stride, padding=1, bias=False),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True)
            )

        def conv_dw(inp, oup, stride):
            """
               深度可分离卷积
            """
            return nn.Sequential(
                # 深度卷积
                nn.Conv2d(
                    in_channels=inp,
                    out_channels=inp, # out_channels=in_channels
                    kernel_size=3,
                    stride=stride,
                    padding=1,
                    groups=inp,      # groups=in_channels
                    bias=False
                ),
                nn.BatchNorm2d(inp),
                nn.ReLU(inplace=True),

                # 逐点卷积
                nn.Conv2d(
                    in_channels=inp,
                    out_channels=oup,
                    kernel_size=1,
                    stride=1,
                    padding=0,
                    bias=False
                ),
                nn.BatchNorm2d(oup),
                nn.ReLU(inplace=True),
            )

        self.model = nn.Sequential(
            # conv_bn(3, 32, 2),
            conv_bn(1, 32, 2),
            conv_dw(32, 64, 1),  # 深度卷积层有13层
            conv_dw(64, 128, 2),
            conv_dw(128, 128, 1),
            conv_dw(128, 256, 2),
            conv_dw(256, 256, 1),
            conv_dw(256, 512, 2),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 512, 1),
            conv_dw(512, 1024, 2),
            conv_dw(1024, 1024, 1),
            nn.AvgPool2d(7),
        )
        # self.fc = nn.Linear(1024, 1000)
        self.fc = nn.Linear(1024, 10)

    def forward(self, x):
        x = self.model(x)
        x = x.view(-1, 1024)
        x = self.fc(x)
        return x

if __name__ == '__main__':
    net = MobileNetV1()
    X = torch.rand(size=(1, 1, 224, 224), dtype=torch.float32)
    for layer in net.model:
        X = layer(X)
        print(layer.__class__.__name__, 'output shape:', X.shape)

equential output shape: torch.Size([1, 32, 112, 112])
Sequential output shape: torch.Size([1, 64, 112, 112])
Sequential output shape: torch.Size([1, 128, 56, 56])
Sequential output shape: torch.Size([1, 128, 56, 56])
Sequential output shape: torch.Size([1, 256, 28, 28])
Sequential output shape: torch.Size([1, 256, 28, 28])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 512, 14, 14])
Sequential output shape: torch.Size([1, 1024, 7, 7])
Sequential output shape: torch.Size([1, 1024, 7, 7])
AvgPool2d output shape: torch.Size([1, 1024, 1, 1])

2.2 Leer el conjunto de datos Fashion-MNIST

# 我们将图片大小设置224×224
# 训练机器内存有限,将批量大小设置为64
batch_size = 64

train_iter,test_iter = get_mnist_data(batch_size,resize=224)

2.3 Entrenamiento de modelos en GPU

from _07_MobileNetV1 import MobileNetV1

# 初始化模型
net = MobileNetV1()

lr, num_epochs = 0.1, 10
train_ch(net, train_iter, test_iter, num_epochs, lr, try_gpu())

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44665283/article/details/131564874
Recomendado
Clasificación