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.
MobileNet
Se aplica una convolución separable en profundidadDepthwise
para reemplazar la convolución convencional, reduciendo así la cantidad de cálculo y los parámetros del modelo.MobileNet
No 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.- 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, feature
se 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
feature
la suma ponderada de los filtros de cada canal para obtener un únicofeature
.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.
Depthwise
La 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
1x1
para combinar diferentes filtrosfeature
. 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. depthwise
El 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:
1.2 Estructura de la red
1.2.1 Capa convolucional V1
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.
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 .
标准卷积核深度可分离卷积层到底对结果有什么样的影响?
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
MobileNeet
La estructura de la red se muestra en la siguiente tabla. en:
Conv
significa convolución estándar yConv dw
convolución separable en profundidad.- Todas las capas van seguidas de
BN
yReLU
(excepto la capa final completamente conectada, cuya salida se introduce directamente ensoftmax
la 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,
MobileNet
las técnicas de regularización y mejora de conjuntos de datos se utilizan menos en el entrenamiento porqueMobileNet
es un modelo pequeño y no es fácil sobreajustar los modelos pequeños.
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 1x1
Contiene todas1x1
las capas convolucionales, incluidas las convoluciones separables1x1
.Conv DW 3x3
Sólo se incluyen las convoluciones en convoluciones separables3x3
.
1.3 Multiplicador de ancho, multiplicador de resolución
Aunque la MobileNet
arquitectura básica ya es pequeña y tiene baja latencia, aplicaciones específicas requieren modelos más rápidos. Para ello, MobileNet
se introducen dos hiperparámetros: multiplicador de ancho y multiplicador de resolución.
El multiplicador de ancho width multiplier
se denota como a. De hecho, reduce feature map
la 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
Depthwise
de todas las capas convolucionales separables posteriores .feature map
feature 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 multiplier
se indica como p. Su función es: reducir feature map
el 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
Depthwise
de todas las capas convolucionales separables posteriores .feature map
feature 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 map
tamaño de entrada es 14x14
y el número de canales es 512
; el tamaño de convolución es 3x3
; el feature map
tamaño de salida es 14x14
y 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 MobileNet
que 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
MobileNet
la parte central (es decir, 5 capas de convoluciones separables en profundidad).5x Conv dw/s
feature 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.
El modelo reducido MobileNet
(multiplicador de ancho a=0,75, multiplicador de resolución p=0,714) Squeezenet
es similar en tamaño al modelo, pero tiene mayor precisión y 22 veces menos cálculos.
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())