Explorando o Poder da Computação em Nuvem para o Aprendizado de máquina usando uma rede neural MLP (Multi Layer Perceptron) para classificação de objetos em imagens Reais
Repositório do Código em Python de Aprendizado de Maquina Usando uma Rede Neural MLP (Multi Layer Perceptron) para classificação de objetos em imagens.
Link do ppt da Apresentação do trabalho final
Perceptron Multicamadas (PMC ou MLP — Multi Layer Perceptron) é uma rede neural com uma ou mais camadas ocultas com um número indeterminado de neurônios. A camada oculta possui esse nome porque não é possível prever a saída desejada nas camadas intermediárias.
Para treinar a rede MLP, o algoritmo comumente utilizado é o de retropropagação (Backpropagation) seu arquitetura comforme a representação abaixo:
É uma aplicação de técnicas de aprendizado de máquina para resolver um problema de classificação de imagens. O conjunto de dados Fashion MNIST consiste em 60.000 imagens de 10 categorias diferentes de roupas, com 6.000 imagens por categoria. Cada imagem é uma representação em escala de cinza de 28x28 pixels.
import os
import tensorflow.keras as keras
from keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.layers import Dense, Flatten, Dropout
from keras.utils import to_categorical
from keras import optimizers
import matplotlib.pyplot as plt
import numpy as np
import sys
# Carregamento dos dados
(AX, AY), (QX, QY) = fashion_mnist.load_data()
AX = 255 - AX
QX = 255 - QX
nclasses = 10
AY2 = to_categorical(AY, nclasses)
QY2 = to_categorical(QY, nclasses)
nl, nc = AX.shape[1], AX.shape[2] # 28, 28
AX = AX.astype('float32') / 255.0 # 0 a 1
QX = QX.astype('float32') / 255.0 # 0 a 1
model = Sequential()
model.add(Flatten(input_shape=(nl, nc)))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(nclasses, activation='softmax'))
model.summary()
opt = optimizers.Adam()
model.compile(optimizer=opt,
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(AX, AY2,
batch_size=100,
epochs=100,
verbose=True,
validation_data=(QX, QY2))
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.subplot(1, 3, 2)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.subplot(1, 3, 3)
plt.plot(history.history['accuracy'], label='Train Error')
plt.plot(history.history['val_accuracy'], label='Validation Error')
plt.xlabel('Epoch')
plt.ylabel('Error')
plt.legend()
plt.tight_layout()
plt.show()
score = model.evaluate(QX, QY2, verbose=False)
print('Test loss:', score[0])
print('Test accuracy: %.2f %%' % (100 * score[1]))
print('Test error: %.2f %%' % (100 * (1 - score[1])))
model.save('MLP4.h5')
Test loss: 0.4102402329444885 Test accuracy: 85.26 % Test error: 14.74 %
Dica: Aumentar o número de camadas e neurônios nem sempre é a melhor solução para uma melhoria de performance/acurácia.
Na verdade uma das limitações da rede MLP é que ao se aumentar muito o número de camadas e neurônios ela tende a ficar com um número de parâmetros muito grande e com isso tão pesada ao ponto do hardware não conseguir processar e ela não convergir (chegar a um resultado), talvez por essa razão, até a evolução do hardware ela tenha ficado um pouco estagnada.
O código fornecido realiza a predição de roupas do conjunto de dados Fashion MNIST utilizando um modelo de rede neural treinado previamente.
# PREDIÇÃO
import os
import tensorflow.keras as keras
from keras.datasets import fashion_mnist
from keras.models import load_model
from keras.utils import to_categorical
import numpy as np; import sys; import os; from time import time
(_,_), (QX, QY) = fashion_mnist.load_data()
QX=255-QX
nclasses = 10
QY2 = keras.utils.to_categorical(QY, nclasses)
nl, nc = QX.shape[1], QX.shape[2] #28, 28
QX = QX.astype('float32') / 255.0 # 0 a 1
model=load_model('MLP4.h5')
score = model.evaluate(QX, QY2, verbose=False)
print('Test loss: %.4f'%(score[0]))
print('Test accuracy: %.2f %%'%(100*score[1]))
print('Test error: %.2f %%'%(100*(1-score[1])))
categorias=["Camiseta", "Calça", "Pulôver", "Vestido", "Casaco", "Sandália",
"Camiseta", "Tênis", "Bolsa", "Botins"]
QP_test= model.predict(QX[:20,:,:])
QP_predict = np.argmax(QP_test, axis=-1)
f= plt.figure(figsize=(15, 10))
for i in range(20):
f.add_subplot(4,5,i+1)
plt.imshow( QX[i,:,:], cmap="gray")
plt.axis("off");
plt.text(0,-3,categorias[QY[i]],color="b")
plt.text(0, 2,categorias[QP_predict[i]],color="r")
plt.savefig("img.png")
plt.show()
Test loss: 0.4102 Test accuracy: 85.26 % Test error: 14.74 % 1/1 [==============================] - 0s 72ms/step