Chapitre pratique d'apprentissage en profondeur (13) - AlexNet de TensorFlow

Savoir scientifique

En pratique, peu de personnes forment des réseaux à partir de zéro car l'ensemble de données n'est pas assez volumineux. Une pratique courante consiste à utiliser un réseau préformé (tel qu'un réseau de 1000 catégories formé sur ImageNet) pour affiner le réglage (également appelé réglage fin) ou comme extracteur de caractéristiques.

  avant-propos

Cela fait longtemps que je ne vois pas, vieux fans. Je me demande à quel point votre apprentissage est profond ? Selon le plan actuel de Layman's House, l'article est partagé une fois toutes les deux semaines, et l'article théorique et l'article de combat réel sont partagés. Ce partage, nous suivons avec le dernier article Deep Learning Theory (14) -- AlexNet to l'étage suivant Venez au combat réel de TensorFlow, j'espère que tout le monde pourra comprendre attentivement l'article précédent avant d'entrer dans le contenu d'aujourd'hui.

Le combat TensorFlow d'AlexNet

1. Préparation des données

Contrairement à l'article précédent, changeons le jeu de données. Cette fois, nous utilisons cinq catégories de fleurs comme jeu de données, qui contient également deux sous-ensembles : le jeu d'apprentissage et le jeu de vérification.

Que diriez-vous, les fleurs sont magnifiques !

De plus, il est à noter qu'en raison des cinq catégories, notre code de lecture des données a un peu changé :

Le reste du code est le même que le premier projet !

2. Structure du réseau

# Structure du réseau AlexNet

# Entrée : 3*227*2227 représente une entrée d'image couleur à trois canaux, la taille de l'image est de 227*227

# Couche de convolution 1 : la taille du noyau de convolution est de 11*11, le nombre de noyaux de convolution : 96 et la taille du pas : 4

# Regroupement maximum 1 : zone d'échantillonnage : 3 * 3, taille de pas : la valeur par défaut est 1

# Couche de convolution 2 : la taille du noyau du produit est de 5*5, le nombre de noyaux de convolution : 256 et la taille du pas : 1

# Regroupement maximum 2 : zone d'échantillonnage : 3 * 3, taille de pas : la valeur par défaut est 1

# Couche de convolution 3 : la taille du noyau du produit est de 3*3, le nombre de noyaux de convolution : 384, la taille du pas : 1 et le rembourrage est utilisé.

# Couche de convolution 4 : la taille du noyau du produit est de 3*3, le nombre de noyaux de convolution : 384, la taille du pas : 1 et le rembourrage est utilisé.

# Couche de convolution 5 : la taille du noyau du produit est de 3*3, le nombre de noyaux de convolution : 256, la taille du pas : 1 et le rembourrage est utilisé. (Cette couche manque dans l'article théorique, rappelez-vous, faites attention)

# Regroupement maximum 3 : zone d'échantillonnage : 3*3, taille de pas : la valeur par défaut est 1

# Couche 1 entièrement connectée : sortie 84

# Couche 2 entièrement connectée : sortie 5 (cinq catégories)

def inference(images, batch_size, n_classes,drop_rate):
    # 卷积层1:卷积核大小为11*11 卷积核个数:96,步长:4
    conv1 = Conv_layer(names = 'conv1_scope', input = images , w_shape = [11, 11, 3, 96], b_shape = [96], strid = [4, 4], is_padding = False)
    print("---------conv1:{}".format(conv1))
    # 最大池化1:采样区域:3*3, 步长:默认为1
    down_sample1 = Avg_pool_lrn(names = 'avg_pooling1', input = conv1 , ksize = [1, 2, 2, 1], is_lrn = False)
    print("---------down_sample1:{}".format(down_sample1))
    # 卷积层2:积核大小为5*5 ,卷积核个数:256, 步长:1
    conv2 = Conv_layer(names = 'conv2_scope', input = down_sample1 , w_shape = [5, 5, 96, 256], b_shape = [256], strid = [1, 1], is_padding = False)
    # 最大池化2:采样区域:3*3, 步长:默认为1
    down_sample2 = Avg_pool_lrn(names = 'avg_pooling2', input = conv2 , ksize = [1, 3, 3, 1], is_lrn = False)
    # 卷积层3:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。
    conv3 = Conv_layer(names = 'conv3_scope', input = down_sample2 , w_shape = [3, 3, 256, 384], b_shape = [384], strid = [1, 1], is_padding = True)
    # 卷积层4:积核大小为3*3 ,卷积核个数:384, 步长:1,采用padding。
    conv4 = Conv_layer(names = 'conv4_scope', input = conv3 , w_shape = [3, 3, 384, 384], b_shape = [384], strid = [1, 1], is_padding = True)
    # 卷积层5:积核大小为3*3 ,卷积核个数:256, 步长:1,采用padding。(在理论篇文章中遗漏了这一层,切记,注意)
    conv5 = Conv_layer(names = 'conv4_scope', input = conv3 , w_shape = [3, 3, 384, 256], b_shape = [256], strid = [1, 1], is_padding = True)
    reshape = tf.reshape(conv3, shape=[batch_size, -1])
    dim = reshape.get_shape()[1].value
    # 全连接层1:输出84
    local_1 = local_layer(names = 'local1_scope', input = reshape , w_shape = [dim, 84], b_shape = [84])
     # 全连接层2:输出5
    local_2 = local_layer(names = 'local2_scope', input = local_1 , w_shape = [84, 5], b_shape = [5])
    print(local_2.shape)


    return local_2

3. Processus de formation

C'est peut-être parce que l'ensemble de données est trop petit, que le réseau est rapidement adapté et que nous utiliserons plus tard un ensemble de données plus grand pour la formation.

épilogue

C'est la fin du partage d'aujourd'hui. La construction de la couche réseau est relativement simple. Il convient de noter que la sortie des trois dernières couches convolutionnelles est la même que la forme de son entrée. Les vétérans peuvent imprimer pour voir les résultats par eux-mêmes. De plus, parce que la catégorie de l'ensemble de données a changé, la partie informatique correspondante et la partie sortie du réseau ont également été modifiées. En même temps, je ne sais pas si le vieux fer prudent a découvert que le La partie traitement de l'ensemble de données semble un peu déraisonnable. Je suis la chaque catégorie lit les données dans une boucle séparément, alors que se passe-t-il s'il y a trop de catégories de données ? Par conséquent, dans une étape ultérieure, nous adopterons une nouvelle méthode de lecture du pipeline de données, efficace et concise, attendons-la ensemble avec impatience !

Enfin, notre code de combat actuel espère que vous qui apprenez sincèrement, vous continuerez à le pratiquer vous-même et à l'améliorer étape par étape selon le code du premier projet.

Editeur : Layman Yueyi|Revue : Layman Xiaoquanquan

Magnifique revue du passé

Chapitre pratique d'apprentissage en profondeur (12) - LetNet-5 de TensorFlow

Chapitre pratique de l'apprentissage en profondeur (11) - TensorFlow Learning Road (8)

Chapitre pratique de l'apprentissage en profondeur (10) - TensorFlow Learning Road (7)

Qu'avons-nous fait l'année dernière :

[Résumé de fin d'année] 2021, dites adieu à l'ancien et accueillez le nouveau

[Résumé de fin d'année] Dire au revoir à l'ancien et accueillir le nouveau, 2020, recommençons

balayer

code

fermer

Note

Visite informatique avancée

Salut, tu regardes toujours ?

Acho que você gosta

Origin blog.csdn.net/xyl666666/article/details/120124467
Recomendado
Clasificación