[ALEXNET] [keras] Reconhecimento de número manuscrito

Configuração de ambiente

Python 3.6
tensorflow 1.13.1
hard 2.2.4

pip install tensorflow==1.13.1
pip install keras==2.2.4

Progresso do programa

Leia em conjunto de dados manuscritos

import keras
from keras.datasets import mnist

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

O conjunto de dados manuscritos está localizado no pacote keras . Neste momento, o programa baixa automaticamente os dados do site oficial; o
conjunto de dados manuscritos:
Insira a descrição da imagem aqui
ver X, Y no seguinte formato:
Insira a descrição da imagem aqui
X_train contém uma imagem: o
Insira a descrição da imagem aqui
rótulo correspondente Y_train é um número inteiro, que representa a imagem Qual é o número:
Insira a descrição da imagem aqui

Organize os dados de entrada em um formato aceitável para o modelo

X_train = X_train.reshape(60000, 28, 28, 1)
X_test = X_test.reshape(10000, 28, 28, 1)

Os dados da primeira imagem do conjunto de treinamento parecem ser 5. (observe que o último parâmetro deve ser escrito como 0, tentado ":" não funciona)
Insira a descrição da imagem aqui
Os dados do conjunto de teste são semelhantes, a primeira imagem de teste:
Insira a descrição da imagem aqui
veja o convertido formato:
Insira a descrição da imagem aqui
é apenas uma dimensão extra

Verifique o intervalo dos dados da imagem de entrada: o
Insira a descrição da imagem aqui
valor está entre 0 e 255, o seguinte é convertido para entre 0 e 1, para normalização:

X_train = X_train / 255
X_test = X_test / 255

Insira a descrição da imagem aqui

Codifique os dados de saída com um só hot

Para simplificar, uma matriz esparsa é usada para representar os resultados da previsão. Existem n tipos de resultados de classificação e a matriz tem n colunas. A j-ésima coluna é 1, o que significa que o j-ésimo tipo de resultado da previsão é mais provável.

Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

Verifique o formato:
Insira a descrição da imagem aqui
é realmente mais amplo.
Verifique o 101º rótulo e dê uma olhada nos dados da imagem:
Insira a descrição da imagem aqui
Existem 10 categorias, 0, 1, 2,…, 9, onde a 7ª coluna é 1, o que significa que o resultado é 6, que realmente se parece com 6.

Construir um modelo

model = Sequential() # 空模型

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1))) 
model.add(Activation("relu"))
model.add(Conv2D(32, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten()) # 展开成一维
model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(10, activation="softmax"))

Breve explicação:

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1))) 

O primeiro parâmetro do Conv2D 32 significa que o resultado final é de 32 camadas ( m ∗ n ∗ 3 m * n * 3mn3 ->m ′ ∗ n ′ ∗ 32 m '* n' * 32mn3 2 ) O
segundo parâmetro (3, 3) representa o tamanho do operador de convolução;
input_shape é o formato dos dados de entrada

model.add(Dense(200))

Sobrepor 200 camadas de rede neural (parece ser o tipo mais comum, ou camada oculta ... eu não entendo muito)

Ver informações do modelo: (ignore o número entre colchetes que representa o processo em execução)
Insira a descrição da imagem aqui

Defina o otimizador do modelo

adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="categorical_crossentropy", optimizer=adam, metrics=["accuracy"])

Escolha o otimizador Adam e introduza o parâmetro β 1 β_1b1, β 2 β_2b2, ε εε , pegue um valor comumente usado, lr é a taxa de aprendizagem, definida como 0,001, a
função de perda usa entropia cruzada e a fórmula de cálculo para medir a precisão do desempenho do modelo é a precisão

Modelo de treinamento

model.fit(X_train, Y_train, batch_size=100, epochs=1, verbose=1, validation_data=[X_test, Y_test])

No treinamento em lote, os dados são divididos em 100 partes e treinados apenas uma vez (epochs é o número de iterações). Não está claro o que é detalhado. . .

Roar, ventilador elétrico!
Insira a descrição da imagem aqui

Insira uma imagem para fazer uma previsão

Primeiro, olhe para a terceira imagem do conjunto de teste: (esta imagem é a que ele viu antes)
Insira a descrição da imagem aqui
impressão, o resultado previsto é o número 1, que é consistente com a etiqueta de dados. A
Insira a descrição da imagem aqui
saída é uma lista que registra a possibilidade de cada resultado da classificação, precisamos extrair manualmente o maior resultado possível como nosso resultado de previsão final.
Aqui a função np.round () é manter várias casas decimais, o primeiro parâmetro são os dados de entrada, o segundo parâmetro é manter várias casas decimais, o padrão é 1 dígito

O .reshape acima (1, 28, 28, 1) é necessário, porque outros métodos estão relatando erros. . .
(1)
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
(2)
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Meu entendimento, como o último parâmetro, se for 0, ou seja, se houver apenas uma camada, então considera-se que não existe tal dimensão (ver (1)), apenas para tomar todos , use o símbolo ":", Eles são considerados como tendo esta dimensão, mas parecem ser os mesmos em minha opinião.
Portanto, o primeiro parâmetro usa apenas um número, e considera-se que não existe essa dimensão para relatar um erro.
Isso também deve provar porque quando a informação da imagem foi exibida antes, o último parâmetro com o símbolo ":" para tirar tudo isso reportará um erro, pois isso será considerado como uma dimensão a mais que a imagem.

Armazenamento de modelo

Acesse principalmente uma série de parâmetros obtidos no treinamento:

model.save("model/My_Alexnet_mnist.h5")
# 这里我之前手动创建了文件夹 model, 如果没有的话,应该会报文件不存在的错

Salve no arquivo .h5 na pasta do modelo no diretório principal do arquivo do programa

Carregamento de modelo

from keras.models import load_model
model = load_model("model/My_Alexnet_mnist.h5")

O modelo original está de volta!
Insira a descrição da imagem aqui
Não precisa se preocupar em correr novamente depois que o computador for desligado!

Código fonte completo

Sem saída desnecessária;

# 完整版
import numpy as np
import matplotlib.pyplot as plt
import keras

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Activation
from keras.layers import Conv2D, MaxPooling2D
#from keras import backend as K

# 手写数据集读入
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

# 把输入数据整理成模型可以接受的格式
X_train = X_train.reshape(60000, 28, 28, 1)
X_test = X_test.reshape(10000, 28, 28, 1)

# 进行归一化处理
X_train = X_train / 255
X_test = X_test / 255

# 对于输出进行 one-hot-codeing
Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

# 搭建模型
model = Sequential()

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1)))
model.add(Activation("relu"))
model.add(Conv2D(32, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten()) # 展开成一维
model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(10, activation="softmax"))

# 定义模型的优化器
adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="categorical_crossentropy", optimizer=adam, metrics=["accuracy"])

# 训练模型
model.fit(X_train, Y_train, batch_size=100, epochs=1, verbose=1, validation_data=[X_test, Y_test])

# 模型预测
test_index = 2
plt.imshow(X_test[test_index, :, :, 0])
output = model.predict(X_test[test_index, :, :, :].reshape(1, 28, 28, 1))

print("predicted output: ", np.round(output))
print("the label is: ", Y_test[test_index])

# 模型的存储
model.save("model/My_Alexnet_mnist.h5")

# 载入训练完成的模型
# from keras.models import load_model
# model = load_model("model/My_Alexnet_mnist.h5")
model.summary()

Acho que você gosta

Origin blog.csdn.net/weixin_44092088/article/details/113031972
Recomendado
Clasificación