red neuronal convolucional Keras CIFAR-10 color de la imagen de reconocimiento de objetos

Los libros de referencia "Tensorflow + Keras profunda aprender la aplicación práctica de la inteligencia artificial," Linda Gui con
el Capítulo IX, cap.
Se trata de un libro muy fácil de usar introductoria práctica, todo el código, se explica inevitablemente


CIFAR-10 conjunto de datos es la imagen de color 32x32 60000, divididos en 10 categorías, aviones, automóviles, aves, gatos, ciervos, perros, ranas, caballos, barcos, camiones. 50000 imágenes de entrenamiento, imágenes 10.000 de prueba

1. conjuntos de procesamiento de datos
1-1. Descarga Conjunto de datos cifar-10

from keras.datasets import cifar10
import numpy as np
np.random.seed(10)

(x_image_train,y_label_train),\
(x_image_test,y_label_test)=cifar10.load_data()

cifar10.load_data () para descargar o leer el conjunto de datos CIFAR-10, la primera descarga tardará algún tiempo

1-2. Ver los datos de entrenamiento
Compruebe la forma x_image_train
1-3. Ver más formación de datos (etiqueta e imagen)

import matplotlib.pyplot as plt
label_dict={0:'airplane',1:'automobile',2:'bird',3:'cat',4:'deer',5:'dog',6:'frog',
													7:'horse',8:'ship',9:'truck'}
#用字典dict定义每一个数字所代表的图像类别名称
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
     fig=plt.gcf()
     fig.set_size_inches(12,14)
     if num>25: num=25
     for i in range(0,num):
         ax=plt.subplot(5,5,1+i)
         ax.imshow(images[idx],cmap='binary')
         title=str(i)+','+label_dict[labels[i][0]]
         if len(prediction)>0:
             title+='=>'+label_dict[prediction[i]]
             
         ax.set_title(title,fontsize=10)
         ax.set_xticks([]);ax.set_yticks([])
         idx+=1
     plt.show()
     
plot_images_labels_prediction(x_image_train,y_label_train,[],0)#查看训练数据前十项

la predicción = [], Ninguna predicción de vista
1-4 de imagen, datos de la etiqueta de preprocesamiento
de normalización de la imagen, la etiqueta se convierte en código caliente (One-Hot Encoding)
normalización digital puede mejorar la precisión de la precisión del modelo del modelo, el modelo de mejorar la velocidad de convergencia.

#image预处理 (RGB各通道除以255标准化)
x_image_train_norm=x_image_train.astype('float32')/255.0
x_image_test_norm=x_image_test.astype('float32')/255.0
x_image_train_norm[0][0][0]

Ver los resultados de los datos de entrenamiento de una imagen normalizada de la primera datos de punto 3 que representa el RGB
de salida [12 es]: Array ([0.23137255, 0.24313726, 0.24705882], DTYPE = float32)

Pretratamiento de la etiqueta de
vista de la etiqueta de datos de forma antes de 5
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
la etiqueta en Hot-Encoding Uno
(0- (1000000000), L- (0100000000), ----. 6 se corresponde con (0000001000))

#label 预处理
#Keras 提供了np_utils.to_categorical方法可进行One-Hot Encoding转换
from keras.utils import np_utils
y_label_train_OneHot=np_utils.to_categorical(y_label_train).reshape(50000,10)
y_label_test_OneHot=np_utils.to_categorical(y_label_test).reshape(10000,10)

Entrada: y_label_train_OneHot [:. 5] Aquí Insertar imagen Descripción
2. Keras de reconocimiento de imágenes de la red neural convolucional CIFAR 10-
conectado a los primeros conjuntos de datos parciales descargado y procesa
2-1
red neural convolucional se puede dividir en dos partes,
la extracción de característica de imagen: Convolución capa 1 (CONV1 ), agrupado capa 1 (pooling1), CONV2, pooling2 , extracción de características de imagen.
Totalmente conectado redes neuronales: Las redes neuronales capa de planarización, una capa oculta, una capa de salida compuesta.

2-2 modelo
capa convolucional, capa agrupada, red completamente conectada (plana, capa de salida oculto) apilados lineal
model.add () el aumento de modelo de capas

#2-1 建立模型
from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation,Flatten
from keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D

#建立线性堆叠模型,后续只要将各个神经网络加入模型即可
model=Sequential()
#建立卷积层1
model.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=(32,32,3),
                 activation='relu',padding='same'))
#建立池化层1,将32x32的图像缩减为16x16的图像
model.add(MaxPooling2D(pool_size=(2,2)))
#建立卷积层2
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same'))
#加入Dropout避免过拟合
model.add(Dropout(0.25))
#建立池化层2
model.add(MaxPooling2D(pool_size=(2,2)))
#建立神经网络
    #建立平坦层
model.add(Flatten())
model.add(Dropout(0.25))
    #建立隐藏层
model.add(Dense(1024,activation='relu'))
model.add(Dropout(0.25))    
    #建立输出层
model.add(Dense(10,activation='softmax'))
  • CONV1 parámetros de la capa
    | filtros = 32, | 32 filtros dispuesto generados aleatoriamente |
    | kernel_size = (3,3) | cada 3x3 tamaño del filtro |
    | = padding 'Same' | dejar convolucionada imagen generada por la operación de convolución mismo tamaño |
    | input_size = (32,32,3) | tridimensional, la primera imagen representativa de dos dimensiones de la forma y tamaño 32x32, la tercera dimensión que representa una imagen en color, el RGB tres canales |
    | activación = 'RELU' | proporcionado la capa de activación relu función |
  • El agrupamiento de 1 parámetro
  • pool_size = (2,2), la imagen se reduce a 32x32 16x16
  • CONV1 parámetros de la capa
    | filtros = 64, | 64 filtros dispuesto generados aleatoriamente |
    | kernel_size = (3,3) | cada 3x3 tamaño del filtro |
    | = padding 'Same' | dejar convolucionada imagen generada por la operación de convolución mismo tamaño |
    | activación = 'RELU' | función de activación de la capa dispuesta RELU |
  • sobreajuste evitar deserción
  • model.add (deserción (0,25)) cada formación iteración renunciar a 25% de las neuronas en la red neural
    del resto de los parámetros anteriores y similares
    de entrada: print (model.summary ()) Modelo Resumida
    Aquí Insertar imagen Descripción
    2-3 formación
#开始训练
train_history=model.fit(x=x_image_train_norm,y=y_label_train_OneHot,validation_split=0.2,
                                epochs=20,batch_size=128,verbose=2)
  • pérdida: pérdida de ajuste de la función, en un estudio a fondo utilizando una mejor formación de entropía cruzada
  • optimizador: Cuando el entrenamiento, el uso optimizador Adam puede hacer que la capacitación convergencia más rápida y mejorar la precisión
  • un conjunto de métricas para evaluar la forma en que el modelo es de tasa exacta
  • model.fit la formación, el proceso de formación existe dentro train_history, parámetros model.fit necesidad:
  • El entrenamiento de los parámetros de datos de entrada
  • x_image_train_norm, y_label_train_OneHot
  • relación de conjunto de entrenamiento y validación
  • validation_split = 0,2, 80% de los datos de entrenamiento (50000x0.8 = 40.000), 20% para verificar los datos
  • épocas = 20, la formación de la red 20
  • la batch_size = 128, 128 cada lote de datos, un total de 40.000 / 128 = 313 lotes, cada uno datos de entrenamiento de la red 313 a procesar lotes
  • verbosa = 2, se muestra el proceso de formación

2-3 Ver resultados de formación
Ver exactitud, la pérdida de la ejecución

def show_train_history(train_history,train,validation):
    plt.plot(train_history.history[train])
    plt.plot(train_history.history[validation])
    plt.title('Train History')
    plt.ylabel(train)
    plt.xlabel('Epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()


show_train_history(train_history,'acc','val_acc')

plt.figure()
show_train_history(train_history,'loss','val_loss')

resultados:
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

#查看模型正确率
scores=model.evaluate(x_image_test_norm,y_label_test_OneHot,verbose=1)

Aquí Insertar imagen Descripción

#2-4 进行预测
prediction=model.predict_classes(x_image_test_norm)
#预测结果,前10项数据
prediction[:10]
#显示前10项结果
plt.figure()
plot_images_labels_prediction(x_image_test,y_label_test,prediction,0,10)

Aquí Insertar imagen Descripción
2-5 muestra la probabilidad predicha de
vista de la probabilidad de un conjunto de datos de prueba (la probabilidad de cada clasificado como)

#2-5 显示预测概率
#预测概率
Predicted_Probability=model.predict(x_image_test_norm)

def show_Predicted_Probability(y_label,prediction,x_image,
                                   Predicted_Probabilty,i):
    print('label:',label_dict[y_label[i][0]],
              'predict',label_dict[prediction[i]])
    plt.figure(figsize=(2,2))
    plt.imshow(np.reshape(x_image_test[i],(32,32,3)))
    plt.show()
    for j in range(10):
        print(label_dict[j]+' '+'Probability:%1.9f'%(Predicted_Probability[i][j]))
show_Predicted_Probability(y_label_test,prediction,x_image_test,Predicted_Probability,1)  

Aquí Insertar imagen DescripciónAquí Insertar imagen Descripción

Esta imagen se puede ver que el barco, el barco se clasifica como probabilidad de 0.8812, la probabilidad más alta, la predicción final es correcta, el primer 0 es el error de clasificación, también se puede ver la probabilidad de que el anterior.

2-6 muestra la matriz de confusión
establecidos por confusión pd.crosstab matriz, sus requisitos de entrada son matriz unidimensional, todos con y_label_test.shape, prediction.shape, respectivamente, no es una vista unidimensional, que es y_label_test (10000,1), uso reshape, convertida en una matriz unidimensional

#2-6 显示混淆矩阵
y=y_label_test.reshape(-1)  #将其转换为一维数组

import pandas as pd
print(label_dict)
pd.crosstab(y,prediction,rownames=['labels'],colnames=['predict'])

Aquí Insertar imagen Descripción
predicción Diagonal es correcta, se puede analizar la categoría más confuso y menos confuso.

2-7 Cargar y guardar el modelo de
cada circunvolución formación de redes neuronales tomará mucho tiempo ,, la lata después de cada entrenamiento es completa, excepto el modelo, o para ahorrar peso, la siguiente ejecución del modelo de formación a pesos de carga y, a continuación, continuar la formación

'''
#2-7 模型的加载与保存
model.save('model.h5')
#保存模型权重
model.save_weights('my_model_weights.h5')
#下次使用的时候
model = load_model('model.h5')
model.load_weights('my_model_weights.h5')
'''

Aquí Insertar imagen Descripción
Habrá buena h5 guardar archivos en su carpeta para guardar el archivo de script

FIN
crear tres veces la red neuronal de convolución mejorará aún más la precisión.

Desafíos:
1. tema blanco, el nombre de la variable temblor mal
2. Tenga en cuenta la dimensión de la atención, el método np_utils.to_categorical libro original puede ser de una sola caliente conversión de codificación, la forma de las se convierte (50000,1, 10), seguido de error de entrenamiento de la red, lo que sugiere que la capa de salida para introducir un vector de dos dimensiones, y es recibido (50000,1,10), así que fui a formar de nuevo un poco. Charles no entienden cómo este mal tan np_utils.to_categorical, MNIST escrita a mano reconocimiento numeral antes, esto no sería un problema.
Cambio:
y_label_train_OneHot = np_utils.to_categorical (y_label_train) .reshape (50000,10)

Gracias por leer ... continuará haciendo esfuerzos incansables para registrar el proceso de aprendizaje

Publicado 10 artículos originales · ganado elogios 10 · vistas 7521

Supongo que te gusta

Origin blog.csdn.net/qq_41647438/article/details/88614989
Recomendado
Clasificación