Implémentation de Light CNN (Python Keras)

introduction

Dans cet article, j'ai implémenté un modèle d'apprentissage en profondeur appelé Light CNN (LCNN), je l'ai donc résumé. Nous allons d'abord expliquer LCNN et sa fonctionnalité, Max Feature Mapping (MFM), puis l'implémenter et l'évaluer. Tout le code est en python et LCNN est implémenté à l'aide de Tensorflow, Keras. Veuillez vous référer au code pour implémenter LCNN sur Github. Github URL : https://github.com/ozora-ogino/LCNN Light CNN LCNN a été proposé par STC en 2015 et est actuellement utilisé dans des domaines tels que la classification d'images et la classification de la voix en tant que méthode d'apprentissage en profondeur étudiée par une institution appelée STC. LCNN est composé de 8 couches convolutives, et c'est une caractéristique majeure que la fonction d'activation dans chaque couche utilise ce que l'on appelle Max Feature Mapping. Max Feature Mapping Pour plus d'informations sur MFM, veuillez consulter ici. Je publierai également l'article original. "A Light CNN for Deep Face Representation with Noisy Labels " (https://arxiv.org/pdf/1511.02683.pdf)

la mise en oeuvre

Le code est le même que celui de GitHub.

lcnn.py



import tensorflow as tf
from keras.layers import Activation, Dense, BatchNormalization, MaxPool2D, Lambda, Input, Flatten, Dropout
from keras.layers.convolutional import Conv2D
from keras.models import Model
from keras.initializers import he_normal

#Custom layer
from .layers import Maxout


#function that return the stuck of Conv2D and MFM
def MaxOutConv2D(x, dim, kernel_size, strides, padding='same'):
    conv_out = Conv2D(dim, kernel_size=kernel_size, strides=strides, padding=padding)(x)
    mfm_out = Maxout(int(dim/2))(conv_out)
    return mfm_out


#function that return the stuck of FC and MFM
def MaxOutDense(x, dim):
    dense_out = Dense(dim)(x)
    mfm_out = Maxout(int(dim/2))(dense_out)
    return mfm_out

# this function helps to build LCNN. 
def build_lcnn(shape, n_label=2):
    """
    Auguments:
     shape (list) : 
      Input shape for LCNN. (Example : [128, 128, 1])
     n_label (int) : 
      Number of label that LCNN should predict.
    """
    
    input = Input(shape=shape)

    conv2d_1 = MaxOutConv2D(input, 64, kernel_size=5, strides=1, padding='same')
    maxpool_1 = MaxPool2D(pool_size=(2, 2), strides=(2,2))(conv2d_1)

    conv_2d_2 = MaxOutConv2D(maxpool_1, 64, kernel_size=1, strides=1, padding='same')
    batch_norm_2 = BatchNormalization()(conv_2d_2)

    conv2d_3 = MaxOutConv2D(batch_norm_2, 96, kernel_size=3, strides=1, padding='same')
    maxpool_3 = MaxPool2D(pool_size=(2, 2), strides=(2,2))(conv2d_3)
    batch_norm_3 = BatchNormalization()(maxpool_3)

    conv_2d_4 = MaxOutConv2D(batch_norm_3, 96, kernel_size=1, strides=1, padding='same')
    batch_norm_4 = BatchNormalization()(conv_2d_4)

    conv2d_5 = MaxOutConv2D(batch_norm_4, 128, kernel_size=3, strides=1, padding='same')
    maxpool_5 = MaxPool2D(pool_size=(2, 2), strides=(2,2))(conv2d_5)

    conv_2d_6 = MaxOutConv2D(maxpool_5, 128, kernel_size=1, strides=1, padding='same')
    batch_norm_6 = BatchNormalization()(conv_2d_6)

    conv_2d_7 = MaxOutConv2D(batch_norm_6, 64, kernel_size=3, strides=1, padding='same')
    batch_norm_7 = BatchNormalization()(conv_2d_7)

    conv_2d_8 = MaxOutConv2D(batch_norm_7, 64, kernel_size=1, strides=1, padding='same')
    batch_norm_8 = BatchNormalization()(conv_2d_8)

    conv_2d_9 = MaxOutConv2D(batch_norm_8, 64, kernel_size=3, strides=1, padding='same')
    maxpool_9 = MaxPool2D(pool_size=(2, 2), strides=(2,2))(conv_2d_9)
    flatten = Flatten()(maxpool_9)

    dense_10 = MaxOutDense(flatten, 160)
    batch_norm_10 = BatchNormalization()(dense_10)
    dropout_10 = Dropout(0.75)(batch_norm_10)

    output = Dense(n_label, activation='softmax')(dropout_10)
            
    return Model(inputs=input, outputs=output)

Évaluation

Le LCNN implémenté sera le modèle utilisé dans le concours de reconnaissance vocale, mais j'ai essayé avec mnist et CIFAR10 pour voir combien de performances peuvent être obtenues avec une simple reconnaissance d'image. Je n'ai pas du tout réglé le modèle, mais j'ai pu montrer 99% de performances avec mnist et environ 75% de performances avec CIFAR 10. mnist

test_mint.py


import numpy as np
from keras.callbacks import EarlyStopping
from keras.utils import to_categorical
from keras.datasets import mnist

lr = 0.001
epochs = 10
batch_size =256

[x_train, y_train], [x_test, y_test] = mnist.load_data()
x_train = x_train / 255
x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], x_train.shape[2], 1))
y_train = to_categorical(y_train)
input_shape = x_train.shape[1:]

lcnn = build_lcnn(input_shape, n_label=10)
lcnn.compile(optimizer=Adam(learning_rate=lr), loss='categorical_crossentropy', metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', patience=3, verbose=1)
history = lcnn.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=0.2, callbacks=[es])

x_test = x_test / 255
x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], x_test.shape[2], 1))
y_test = to_categorical(y_test)

loss, acc = lcnn.evaluate(x_test, y_test)

print(f'Accuracy : {acc*100}') # Result --> Accuracy : 99.90999794006348
print(f'Loss : {loss}')# Result --> Loss : 0.04250425341885457

CIFAR10

test_cifar10.py


import numpy as np
from keras.callbacks import EarlyStopping
from keras.utils import to_categorical
from keras.datasets import cifar10

lr = 0.001
epochs = 100
batch_size =64

[x_train, y_train], [x_test, y_test] =cifar10.load_data()

x_train = x_train / 255
y_train = to_categorical(y_train)
input_shape = x_train.shape[1:]

lcnn = build_lcnn(input_shape, n_label=10)
lcnn.compile(optimizer=Adam(learning_rate=lr), loss='categorical_crossentropy', metrics=['accuracy'])
es = EarlyStopping(monitor='val_loss', patience=5 , verbose=1)
history = lcnn.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=0.2, callbacks=[es])


x_test = x_test / 255
y_test = to_categorical(y_test)

loss, acc = lcnn.evaluate(x_test, y_test)
print(f'Accuracy : {acc*100}') # Result --> Accuracy : 75.1200020313263
print(f'Loss : {loss}')# Result --> Loss : 1.2616282165050507

Résumé

J'ai implémenté un modèle d'apprentissage en profondeur appelé LCNN, donc je l'ai résumé. Je suis heureux que vous puissiez l'utiliser comme référence. Github URL : https://github.com/ozora-ogino/LCNN Reference "A Light CNN for Deep Face Representation with Noisy Labels" "STC Antispoofing Systems for the ASVspoof2019 Challenge" "Audio replay attack detection with deep learning frameworks"

Recommended Posts

Implémentation de Light CNN (Python Keras)
Implémentation Python du filtre à particules
Implémentation du tri rapide en Python
Implémentation Python du filtre à particules auto-organisateur
Implémentation du jeu de vie en Python
Implémentation du tri original en Python
Implémentation de la méthode Dyxtra par python
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Python: Application de la reconnaissance d'image à l'aide de CNN
Implémentation Python du modèle Markov caché continu
Les bases de Python ①
Bases de python ①
Implémentation Keras de Shakedrop
Copie de python
Introduction de Python
Pourquoi l'implémentation Python d'ISUCON 5 a utilisé Bottle
Implémentation de l'arbre TRIE avec Python et LOUDS
[Entretien de codage] Implémentation de la machine cryptographique Enigma (Python)
Explication de la distance d'édition et de l'implémentation en Python
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
[Python] Opération d'énumération
Exemple d'implémentation d'un système de traitement LISP simple (version Python)
Implémentation d'estimation la plus probable du modèle de sujet en python
Implémentation RNN en python
Résumé de Tensorflow / Keras
Unification de l'environnement Python
Copie des préférences python
Principes de base du grattage Python
[python] comportement d'argmax
Comparaison de l'implémentation de plusieurs moyennes mobiles exponentielles (DEMA, TEMA) en Python
Utilisation des locaux Python ()
le zen de Python
Implémentation python de la classe de régression linéaire bayésienne
Installation de Python 3.3 rc1
Implémentation de la séquence de Fibonacci
# 4 [python] Bases des fonctions
Connaissance de base de Python
Anecdotes sobres de python3
Implémentation d'estimation bayésienne de variante du modèle de sujet en python
Un mémorandum sur la mise en œuvre des recommandations en Python
Bases de python: sortie
[Python] Code pour mesurer la lumière ambiante RVB de l'APDS9960
Installation de matplotlib (Python 3.3.2)
Application de Python 3 vars
Implémentation SVM en python
Divers traitements de Python
Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique
Implémentation de VGG16 à l'aide de Keras créé sans utiliser de modèle entraîné
Une implémentation Python simple de la méthode k-voisinage (k-NN)
[Avec une explication simple] Implémentation Scratch d'une machine Boltsman profonde avec Python ②
[Avec une explication simple] Implémentation Scratch d'une machine Boltzmann profonde avec Python ①
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
Implémentation informatique quantique de Quantum Walk 2
Visualiser le modèle Keras avec Python 3.5
Bleu clair avec AtCoder @Python
Vers la retraite de Python2
Implémentation de TF-IDF à l'aide de gensim