LightProgrammer000

Rede Neural 1

Sep 13th, 2024
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.88 KB | None | 0 0
  1. # Importa a biblioteca numpy para operações matemáticas e manipulação de arrays
  2. import numpy as np
  3.  
  4. # Importa o módulo pyplot da biblioteca matplotlib para criar gráficos
  5. import matplotlib.pyplot as plt
  6.  
  7. # Importa LabelBinarizer para converter rótulos em formato one-hot encoding
  8. from sklearn.preprocessing import LabelBinarizer
  9.  
  10. # Importa classification_report para gerar um relatório de classificação
  11. from sklearn.metrics import classification_report
  12.  
  13. # Importa as classes necessárias da biblioteca Keras para criar e treinar o modelo de rede neural
  14. from tensorflow.keras.models import Sequential
  15. from tensorflow.keras.layers import Dense
  16. from tensorflow.keras.optimizers import SGD
  17. from tensorflow.keras.datasets import mnist
  18. from tensorflow.keras import backend as K
  19.  
  20. # Acessando o dataset MNIST
  21. # O MNIST é um dataset amplamente utilizado com imagens de dígitos manuscritos (0-9) em escala de cinza de 28x28 pixels.
  22. print('[INFO] accessing MNIST...')
  23.  
  24. # Carregando o dataset MNIST
  25. # O dataset está dividido em dados de treino (trainX, trainY) e de teste (testX, testY).
  26. # 'trainX' contém as imagens de treino, 'trainY' contém os rótulos correspondentes (0 a 9).
  27. # 'testX' e 'testY' são usados para avaliar o modelo após o treinamento.
  28. ((trainX, trainY), (testX, testY)) = mnist.load_data()
  29.  
  30. # Convertendo as imagens de 28x28 pixels em vetores de 784 dimensões (28*28)
  31. # O modelo espera que os dados de entrada sejam um vetor unidimensional, então transformamos cada imagem 28x28 em um vetor de 784 elementos.
  32. trainX = trainX.reshape((trainX.shape[0], 28 * 28 * 1))
  33. testX = testX.reshape((testX.shape[0], 28 * 28 * 1))
  34.  
  35. # Normalizando as imagens para valores entre 0 e 1
  36. # As imagens originalmente têm valores de pixel entre 0 e 255. Normalizamos esses valores para o intervalo [0, 1] dividindo por 255,
  37. # o que ajuda a rede neural a convergir mais rapidamente durante o treinamento.
  38. trainX = trainX.astype('float32') / 255.0
  39. testX = testX.astype('float32') / 255.0
  40.  
  41. # Convertendo os rótulos para o formato one-hot encoding
  42. # Os rótulos originais são valores inteiros (0-9). Precisamos convertê-los em um formato "one-hot encoded",
  43. # onde cada rótulo é representado como um vetor de zeros, com um único 1 na posição correspondente à classe (ex: 2 = [0,0,1,0,0,0,0,0,0,0]).
  44. lb = LabelBinarizer()
  45. trainY = lb.fit_transform(trainY)
  46. testY = lb.transform(testY)
  47.  
  48. # Construindo o modelo da rede neural (Sequencial, camada a camada)
  49. # O modelo será uma rede neural "feedforward", em que os dados fluem da camada de entrada para a camada de saída sem loops.
  50. model = Sequential()
  51.  
  52. # Primeira camada oculta com 256 neurônios, função de ativação 'sigmoid'
  53. # A função de ativação 'sigmoid' é usada para introduzir não linearidade no modelo, permitindo que ele aprenda padrões mais complexos.
  54. model.add(Dense(256, input_shape=(784,), activation='sigmoid'))
  55.  
  56. # Segunda camada oculta com 128 neurônios, também com 'sigmoid'
  57. # Esta camada tem menos neurônios (128) que a anterior e usa a mesma função de ativação.
  58. model.add(Dense(128, activation='sigmoid'))
  59.  
  60. # Camada de saída com 10 neurônios, uma para cada classe (0 a 9), usando softmax para classificação
  61. # A função softmax transforma a saída em probabilidades, com a soma das probabilidades de todas as classes sendo 1.
  62. # Isso facilita a escolha da classe com maior probabilidade como a previsão final do modelo.
  63. model.add(Dense(10, activation='softmax'))
  64.  
  65. # Configurando o otimizador SGD (gradiente descendente estocástico) com uma taxa de aprendizado de 0.01
  66. # O SGD ajusta os pesos do modelo gradualmente, minimizando a função de perda (categorical_crossentropy).
  67. # A taxa de aprendizado (0.01) define o quão grandes são os ajustes dos pesos em cada iteração.
  68. sgd = SGD(0.01)
  69.  
  70. # Compilando o modelo, usando 'categorical_crossentropy' como função de perda e acurácia como métrica
  71. # 'categorical_crossentropy' é usada para problemas de classificação com várias classes.
  72. # A métrica 'accuracy' mede a performance do modelo.
  73. model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
  74.  
  75. # Treinando o modelo com os dados de treino, validando com os dados de teste
  76. # 'epochs' define o número de vezes que o modelo vera todo o conjunto de treino.
  77. # 'batch_size' define quantas amostras são processadas antes de atualizar os pesos.
  78. H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=20, batch_size=128)
  79.  
  80. # Fazendo previsões no conjunto de teste
  81. # Após o treinamento, fazemos previsões no conjunto de teste para ver como o modelo performa
  82. # em dados que ele nunca viu antes.
  83. predictions = model.predict(testX, batch_size=128)
  84.  
  85. # Relatório de classificação com métricas de desempenho (precisão, recall, F1-score)
  86. # O classification_report gera um resumo das principais métricas de desempenho,
  87. # comparando as previsões do modelo com os rótulos reais.
  88. print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=[str(x) for x in lb.classes_]))
  89.  
  90. # Plotando os gráficos de perda e acurácia ao longo das épocas
  91. # Agora, vamos visualizar como a perda e a acurácia variam durante o treinamento.
  92. # Isso ajuda a entender se o modelo está aprendendo ou superajustando (overfitting).
  93. plt.style.use('ggplot')
  94. plt.figure()
  95.  
  96. # Plota a perda de treino e validação
  97. plt.plot(np.arange(0, 20), H.history['loss'], label='train_loss')
  98. plt.plot(np.arange(0, 20), H.history['val_loss'], label='val_loss')
  99.  
  100. # Plota a acurácia de treino e validação
  101. plt.plot(np.arange(0, 20), H.history['accuracy'], label='train_acc')
  102. plt.plot(np.arange(0, 20), H.history['val_accuracy'], label='val_acc')
  103.  
  104. # Definindo o título e labels dos eixos
  105. # Estes títulos e legendas nos ajudam a interpretar os gráficos gerados.
  106. plt.title('Training Loss and Accuracy')
  107. plt.xlabel('Epoch #')
  108. plt.ylabel('Loss/Accuracy')
  109. plt.legend()
  110. plt.show()
  111.  
Add Comment
Please, Sign In to add comment