Capítulo práctico de aprendizaje profundo (13) -- AlexNet de TensorFlow

El conocimiento científico

En la práctica, pocas personas entrenan redes desde cero porque el conjunto de datos no es lo suficientemente grande. Una práctica común es usar una red previamente entrenada (como una red de categoría 1000 entrenada en ImageNet) para refinar (también llamado ajuste fino) o como un extractor de características.

  prefacio

Mucho tiempo sin verlos, viejos fanáticos. Me pregunto qué tan profundo es su aprendizaje. De acuerdo con el plan actual de Layman's House, el artículo se comparte una vez cada dos semanas, y se comparten el artículo teórico y el artículo de combate real. Este intercambio, seguimos con el último artículo Teoría del aprendizaje profundo (14) -- AlexNet para el próximo piso Venga al combate real de TensorFlow, espero que todos puedan entender el artículo anterior cuidadosamente antes de ingresar al contenido de hoy.

Combate TensorFlow de AlexNet

1. Preparación de datos

A diferencia del artículo anterior, cambiemos el conjunto de datos. Esta vez usamos cinco categorías de flores como conjunto de datos, que también contiene dos subconjuntos: el conjunto de entrenamiento y el conjunto de verificación.

¡Qué tal, las flores son hermosas!

Además, vale la pena señalar que debido a las cinco categorías, nuestro código de lectura de datos ha cambiado un poco:

¡El resto del código es el mismo que el primer proyecto!

2. Estructura de la red

# Estructura de la red AlexNet

# Entrada: 3*227*2227 representa la entrada de imagen en color de tres canales, el tamaño de la imagen es 227*227

# Capa de convolución 1: el tamaño del kernel de convolución es 11*11, el número de kernels de convolución: 96 y el tamaño del paso: 4

# Agrupación máxima 1: área de muestreo: 3*3, tamaño de paso: el valor predeterminado es 1

# Capa de convolución 2: el tamaño del núcleo del producto es 5*5, el número de núcleos de convolución: 256 y el tamaño del paso: 1

# Agrupación máxima 2: área de muestreo: 3*3, tamaño de paso: el valor predeterminado es 1

# Capa de convolución 3: el tamaño del núcleo del producto es 3*3, el número de núcleos de convolución: 384, el tamaño de paso: 1 y se usa relleno.

# Capa de convolución 4: el tamaño del núcleo del producto es 3*3, el número de núcleos de convolución: 384, el tamaño de paso: 1 y se usa relleno.

# Capa de convolución 5: el tamaño del núcleo del producto es 3*3, el número de núcleos de convolución: 256, el tamaño de paso: 1 y se utiliza relleno. (Esta capa falta en el artículo teórico, recuerda, presta atención)

# Agrupación máxima 3: área de muestreo: 3*3, tamaño de paso: el valor predeterminado es 1

# Capa 1 completamente conectada: salida 84

# Capa 2 totalmente conectada: salida 5 (cinco categorías)

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. Proceso de formación

Puede deberse a que el conjunto de datos es demasiado pequeño, la red se ajusta rápidamente y luego usaremos un conjunto de datos más grande para el entrenamiento.

epílogo

Este es el final del intercambio de hoy. La construcción de la capa de red es relativamente simple. Vale la pena señalar que la salida de las últimas tres capas convolucionales es la misma que la forma de su entrada. Los veteranos pueden imprimir para ver los resultados por sí mismos. Además, debido a que la categoría del conjunto de datos ha cambiado, la parte de procesamiento de datos correspondiente y la parte de salida de la red también han cambiado. Al mismo tiempo, no sé si el viejo hierro cuidadoso ha descubierto que el La parte de procesamiento del conjunto de datos parece un poco irrazonable. Sigo el Cada categoría lee los datos en un bucle por separado, ¿y qué si hay demasiadas categorías de datos? Por lo tanto, en la etapa posterior, adoptaremos un nuevo método de lectura de canalización de datos, que es eficiente y conciso, ¡esperémoslo juntos!

Finalmente, nuestro código de combate real espera que usted, que está aprendiendo sinceramente, continúe y lo practique usted mismo, y lo mejore paso a paso de acuerdo con el código del primer proyecto. ¡Realmente aprenda conocimiento!

Editor: Layman Yueyi|Reseña: Layman Xiaoquanquan

Maravillosa revisión del pasado.

Capítulo práctico de aprendizaje profundo (12) -- LetNet-5 de TensorFlow

Capítulo práctico de aprendizaje profundo (11) -- TensorFlow Learning Road (8)

Capítulo práctico de aprendizaje profundo (10) -- TensorFlow Learning Road (7)

Qué hemos hecho en el último año:

[Resumen de fin de año] 2021, adiós a lo viejo y bienvenida a lo nuevo

[Resumen de fin de año] Decir adiós a lo viejo y dar la bienvenida a lo nuevo, 2020, comencemos de nuevo

barrer

código

cerca

Nota

Recorrido avanzado de TI

Hola, ¿sigues viendo?

Supongo que te gusta

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