Lab04 - MLP
Desafio1¶
Calcule a saida do perceptron abaixo:
 
x0 = 2; x1 = 0; x2 = -1,24; bias = 1; w0 = 0; w1 = 2; w3 = 1; função de ativação = Heaviside
Resposta:¶
Implementação de uma rede perceptron¶
Vamos usar um framework de machine learnning chamado TensorFlow/keras para fazer esta implementação.
pip install tensorflow
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
    layers.Dense(units=1, input_shape=[1])
])
model.summary()
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_2 (Dense)             (None, 1)                 2         
                                                                 
=================================================================
Total params: 2 (8.00 Byte)
Trainable params: 2 (8.00 Byte)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Layers¶
O arranjo de neuronios define a quantidade de camadas ou layers que a rede neural possui na rede perceptron possui apenas uma camada. Em uma rede MLP (multlayer perceptron) possui além das camadas de entrada e saída, camadas ocultas ou hiden layers, essas redes tambem são conhecidas por redes densas ou fully-connected.
 
Funão de ativação¶
É basicamente uma função matematica que é responsavel por ativar ou mudar o comportamento de saída do neuronio.
Dentre as mais comuns temos:
 
Outras funções de ativação muito utilizadas são:
- softplus
- elu
- sigmoid
- tanh
Desafio 2¶
Implemente a rede MLP abaixo usando TensorFlor/keras: função de ativação Relu
 
Dica: use o argumento activation='relu' em layers.Dense
## Sua resposta aqui...
Backpropagation¶
A técnica de backpropagation é fundamental para o treinamento de redes neurais, pois é através dela que os pesos são ajustados em função do erro calculado pela função de perda (Loss).
Funções de Perda (Loss Functions)¶
- Mean Squared Error (MSE): Utilizado em problemas de regressão. Calcula a média dos quadrados das diferenças entre os valores previstos e os valores reais.
- Mean Absolute Error (MAE): Também utilizado em problemas de regressão. Calcula a média do valor absoluto das diferenças entre os valores previstos e os valores reais.
- Binary Cross-Entropy (BCE): Utilizado em problemas de classificação binária. Mede a diferença entre duas distribuições de probabilidade, a prevista e a real.
Otimizadores (Optimizers)¶
Os otimizadores são algoritmos que ajustam os pesos da rede neural com o objetivo de minimizar a função de perda. Alguns dos otimizadores mais comuns são:
- Stochastic Gradient Descent (SGD): Um dos otimizadores mais simples e amplamente utilizados. Atualiza os pesos em pequenos passos, na direção oposta ao gradiente da função de perda.
- RMSprop: Adapta a taxa de aprendizado para cada parâmetro, dividindo a taxa de aprendizado por uma média móvel do quadrado dos gradientes.
- Adam: Combina as ideias do RMSprop e do SGD com momentum. Mantém uma média móvel tanto do gradiente quanto do quadrado do gradiente, e usa essas médias para adaptar a taxa de aprendizado para cada parâmetro.- (um dos mais utilizados)
- Adadelta: Uma extensão do Adagrad que busca reduzir seu comportamento agressivo de diminuição da taxa de aprendizado.
- Adagrad: Adapta a taxa de aprendizado para cada parâmetro, escalando-os inversamente proporcionalmente à raiz quadrada da soma de todos os gradientes quadrados passados.
- Adamax: Uma variante do Adam baseada na norma infinita.
- Entre outros... 
 


 
model.compile(optimizer=tf.keras.optimizers.Adam(0.1), loss = 'mse')
Pausa para carregar e preparar os dados para treinamento¶
!wget https://raw.githubusercontent.com/arnaldojr/disruptivearchitectures/master/material/aulas/IA/lab07/SalesData.csv /content
--2024-04-01 10:12:46-- https://raw.githubusercontent.com/arnaldojr/disruptivearchitectures/master/material/aulas/IA/lab07/SalesData.csv Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 11884 (12K) [text/plain] Saving to: ‘SalesData.csv’ SalesData.csv 100%[===================>] 11.61K --.-KB/s in 0s 2024-04-01 10:12:46 (53.2 MB/s) - ‘SalesData.csv’ saved [11884/11884] /content: Scheme missing. FINISHED --2024-04-01 10:12:46-- Total wall clock time: 0.2s Downloaded: 1 files, 12K in 0s (53.2 MB/s)
import pandas as pd
import numpy as np
df = pd.read_csv('SalesData.csv')
df.info()
# Separa os dados em X e y
X_train = df['Temperature']
y_train = df['Revenue']
<class 'pandas.core.frame.DataFrame'> RangeIndex: 500 entries, 0 to 499 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Temperature 500 non-null float64 1 Revenue 500 non-null float64 dtypes: float64(2) memory usage: 7.9 KB
import seaborn as sns
sns.scatterplot(x=X_train, y=y_train);
### Tente fazer o treinamento, se der erro! faça o ajustes necessários na camada sequencial em layer.dense().
epochs_hist = model.fit(X_train, y_train, epochs=10)
Epoch 1/10 16/16 [==============================] - 1s 3ms/step - loss: 315555.9688 Epoch 2/10 16/16 [==============================] - 0s 2ms/step - loss: 273533.7812 Epoch 3/10 16/16 [==============================] - 0s 2ms/step - loss: 235616.6250 Epoch 4/10 16/16 [==============================] - 0s 3ms/step - loss: 201430.7500 Epoch 5/10 16/16 [==============================] - 0s 3ms/step - loss: 171413.8906 Epoch 6/10 16/16 [==============================] - 0s 3ms/step - loss: 144605.4844 Epoch 7/10 16/16 [==============================] - 0s 2ms/step - loss: 121690.9766 Epoch 8/10 16/16 [==============================] - 0s 3ms/step - loss: 101589.6562 Epoch 9/10 16/16 [==============================] - 0s 2ms/step - loss: 84055.3672 Epoch 10/10 16/16 [==============================] - 0s 2ms/step - loss: 69379.4141
import pandas as pd
history_df = pd.DataFrame(epochs_hist.history)
history_df['loss'].plot();
# Previsões com o modelo treinado
temp = 5
receita = model.predict([temp])
print('Previsão de Receita Usando a ANN Treinada =', receita[0][0])
1/1 [==============================] - 0s 39ms/step Previsão de Receita Usando a ANN Treinada = 136.9302
import matplotlib.pyplot as plt
plt.scatter(X_train, y_train, color = 'gray')
plt.plot(X_train, model.predict(X_train), color = 'red')
plt.ylabel('Receita [dólares]')
plt.xlabel('Temperatura [°C]')
plt.title('Receita Gerada vs. Temperatura no Ponto de Venda de Sorvetes')
16/16 [==============================] - 0s 2ms/step
Text(0.5, 1.0, 'Receita Gerada vs. Temperatura no Ponto de Venda de Sorvetes')
desafio 3:¶
O treinamento para 10 épocas ficou bom??? se não, melhore o resultado.
### seu código aqui.....
Resumo do dia¶
Até o momento fizemos o seguinte:
- Carregar e Visualizar os Dados
- Criar e Compilar o Modelo
- Treinamento
- Avaliação e Predição
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
from tensorflow.keras import layers
import tensorflow as tf
from tensorflow import keras
def carregar_e_visualizar_dados():
    # Carregar os dados
    #!wget https://raw.githubusercontent.com/arnaldojr/disruptivearchitectures/master/material/aulas/IA/lab07/SalesData.csv /content
    df = pd.read_csv('SalesData.csv')
    df.info()
    # Separar os dados
    X_train = df['Temperature']
    y_train = df['Revenue']
    # Visualizar os dados
    sns.scatterplot(x=X_train, y=y_train)
    plt.show()
    return X_train, y_train
def criar_e_compilar_modelo():
    # Criar o modelo
    model = keras.Sequential([
        layers.Dense(units=1, input_shape=[1])
    ])
    # Compilar o modelo
    model.compile(optimizer=tf.keras.optimizers.Adam(0.1), loss='mse')
    model.summary()
    return model
def treinar_modelo(model, X_train, y_train, epochs=100):
    historico_epochs = model.fit(X_train, y_train, epochs=epochs)
    df_historico = pd.DataFrame(historico_epochs.history)
    df_historico['loss'].plot()
    plt.show()
    return model
def avaliar_e_prever(model, X_train, y_train):
    # Visualizar as predições do modelo
    plt.scatter(X_train, y_train, color='gray')
    plt.plot(X_train, model.predict(X_train), color='red')
    plt.ylabel('Receita [dólares]')
    plt.xlabel('Temperatura [°C]')
    plt.title('Receita Gerada vs. Temperatura no Ponto de Venda de Sorvetes')
    plt.show()
    # Fazer uma previsão
    temp = 5
    receita = model.predict([temp])
    print('Previsão de Receita Usando a ANN Treinada =', receita)
# ---- Programa principal ----
# Carregar e visualizar os dados
X_train, y_train = carregar_e_visualizar_dados()
# Criar e compilar o modelo
model = criar_e_compilar_modelo()
# Treinar o modelo
model = treinar_modelo(model, X_train, y_train)
# Avaliar e fazer predições
avaliar_e_prever(model, X_train, y_train)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 500 entries, 0 to 499 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Temperature 500 non-null float64 1 Revenue 500 non-null float64 dtypes: float64(2) memory usage: 7.9 KB
Model: "sequential_4"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_4 (Dense)             (None, 1)                 2         
                                                                 
=================================================================
Total params: 2 (8.00 Byte)
Trainable params: 2 (8.00 Byte)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Epoch 1/100
16/16 [==============================] - 0s 2ms/step - loss: 319039.4062
Epoch 2/100
16/16 [==============================] - 0s 2ms/step - loss: 276887.2812
Epoch 3/100
16/16 [==============================] - 0s 2ms/step - loss: 238628.3906
Epoch 4/100
16/16 [==============================] - 0s 2ms/step - loss: 204381.8906
Epoch 5/100
16/16 [==============================] - 0s 2ms/step - loss: 173926.2969
Epoch 6/100
16/16 [==============================] - 0s 2ms/step - loss: 147583.9531
Epoch 7/100
16/16 [==============================] - 0s 2ms/step - loss: 123943.3594
Epoch 8/100
16/16 [==============================] - 0s 2ms/step - loss: 103614.0625
Epoch 9/100
16/16 [==============================] - 0s 2ms/step - loss: 86137.4531
Epoch 10/100
16/16 [==============================] - 0s 2ms/step - loss: 70995.4609
Epoch 11/100
16/16 [==============================] - 0s 2ms/step - loss: 58197.1367
Epoch 12/100
16/16 [==============================] - 0s 2ms/step - loss: 47373.6836
Epoch 13/100
16/16 [==============================] - 0s 2ms/step - loss: 38204.8594
Epoch 14/100
16/16 [==============================] - 0s 2ms/step - loss: 30706.8301
Epoch 15/100
16/16 [==============================] - 0s 2ms/step - loss: 24447.9141
Epoch 16/100
16/16 [==============================] - 0s 2ms/step - loss: 19336.2246
Epoch 17/100
16/16 [==============================] - 0s 2ms/step - loss: 15294.8311
Epoch 18/100
16/16 [==============================] - 0s 2ms/step - loss: 11972.4717
Epoch 19/100
16/16 [==============================] - 0s 2ms/step - loss: 9316.7100
Epoch 20/100
16/16 [==============================] - 0s 2ms/step - loss: 7252.5850
Epoch 21/100
16/16 [==============================] - 0s 2ms/step - loss: 5654.0059
Epoch 22/100
16/16 [==============================] - 0s 2ms/step - loss: 4398.6558
Epoch 23/100
16/16 [==============================] - 0s 2ms/step - loss: 3426.6641
Epoch 24/100
16/16 [==============================] - 0s 2ms/step - loss: 2704.4099
Epoch 25/100
16/16 [==============================] - 0s 2ms/step - loss: 2150.8928
Epoch 26/100
16/16 [==============================] - 0s 2ms/step - loss: 1744.8942
Epoch 27/100
16/16 [==============================] - 0s 2ms/step - loss: 1441.0400
Epoch 28/100
16/16 [==============================] - 0s 2ms/step - loss: 1218.3285
Epoch 29/100
16/16 [==============================] - 0s 2ms/step - loss: 1058.0693
Epoch 30/100
16/16 [==============================] - 0s 3ms/step - loss: 942.4816
Epoch 31/100
16/16 [==============================] - 0s 2ms/step - loss: 861.4608
Epoch 32/100
16/16 [==============================] - 0s 2ms/step - loss: 801.4128
Epoch 33/100
16/16 [==============================] - 0s 2ms/step - loss: 760.8700
Epoch 34/100
16/16 [==============================] - 0s 2ms/step - loss: 733.4592
Epoch 35/100
16/16 [==============================] - 0s 2ms/step - loss: 712.1679
Epoch 36/100
16/16 [==============================] - 0s 2ms/step - loss: 699.5580
Epoch 37/100
16/16 [==============================] - 0s 2ms/step - loss: 690.8046
Epoch 38/100
16/16 [==============================] - 0s 2ms/step - loss: 684.1700
Epoch 39/100
16/16 [==============================] - 0s 2ms/step - loss: 680.7510
Epoch 40/100
16/16 [==============================] - 0s 2ms/step - loss: 678.0201
Epoch 41/100
16/16 [==============================] - 0s 2ms/step - loss: 675.8742
Epoch 42/100
16/16 [==============================] - 0s 2ms/step - loss: 674.7966
Epoch 43/100
16/16 [==============================] - 0s 2ms/step - loss: 673.9340
Epoch 44/100
16/16 [==============================] - 0s 2ms/step - loss: 673.5883
Epoch 45/100
16/16 [==============================] - 0s 2ms/step - loss: 673.2530
Epoch 46/100
16/16 [==============================] - 0s 2ms/step - loss: 672.8389
Epoch 47/100
16/16 [==============================] - 0s 2ms/step - loss: 672.6512
Epoch 48/100
16/16 [==============================] - 0s 2ms/step - loss: 672.6047
Epoch 49/100
16/16 [==============================] - 0s 2ms/step - loss: 672.3368
Epoch 50/100
16/16 [==============================] - 0s 2ms/step - loss: 672.2287
Epoch 51/100
16/16 [==============================] - 0s 2ms/step - loss: 672.0671
Epoch 52/100
16/16 [==============================] - 0s 2ms/step - loss: 672.0101
Epoch 53/100
16/16 [==============================] - 0s 2ms/step - loss: 671.8309
Epoch 54/100
16/16 [==============================] - 0s 2ms/step - loss: 671.6974
Epoch 55/100
16/16 [==============================] - 0s 3ms/step - loss: 671.6188
Epoch 56/100
16/16 [==============================] - 0s 2ms/step - loss: 671.5398
Epoch 57/100
16/16 [==============================] - 0s 2ms/step - loss: 671.3561
Epoch 58/100
16/16 [==============================] - 0s 2ms/step - loss: 671.3818
Epoch 59/100
16/16 [==============================] - 0s 2ms/step - loss: 671.1469
Epoch 60/100
16/16 [==============================] - 0s 2ms/step - loss: 671.0237
Epoch 61/100
16/16 [==============================] - 0s 2ms/step - loss: 670.8895
Epoch 62/100
16/16 [==============================] - 0s 2ms/step - loss: 670.7467
Epoch 63/100
16/16 [==============================] - 0s 2ms/step - loss: 670.6893
Epoch 64/100
16/16 [==============================] - 0s 2ms/step - loss: 670.5098
Epoch 65/100
16/16 [==============================] - 0s 2ms/step - loss: 670.4712
Epoch 66/100
16/16 [==============================] - 0s 3ms/step - loss: 670.2680
Epoch 67/100
16/16 [==============================] - 0s 3ms/step - loss: 670.3395
Epoch 68/100
16/16 [==============================] - 0s 2ms/step - loss: 670.0258
Epoch 69/100
16/16 [==============================] - 0s 2ms/step - loss: 670.1964
Epoch 70/100
16/16 [==============================] - 0s 2ms/step - loss: 669.7410
Epoch 71/100
16/16 [==============================] - 0s 2ms/step - loss: 669.5929
Epoch 72/100
16/16 [==============================] - 0s 2ms/step - loss: 669.4639
Epoch 73/100
16/16 [==============================] - 0s 3ms/step - loss: 669.3311
Epoch 74/100
16/16 [==============================] - 0s 2ms/step - loss: 669.4010
Epoch 75/100
16/16 [==============================] - 0s 2ms/step - loss: 669.0681
Epoch 76/100
16/16 [==============================] - 0s 2ms/step - loss: 669.0442
Epoch 77/100
16/16 [==============================] - 0s 2ms/step - loss: 668.7401
Epoch 78/100
16/16 [==============================] - 0s 2ms/step - loss: 668.9483
Epoch 79/100
16/16 [==============================] - 0s 2ms/step - loss: 668.5505
Epoch 80/100
16/16 [==============================] - 0s 2ms/step - loss: 668.4393
Epoch 81/100
16/16 [==============================] - 0s 2ms/step - loss: 668.2285
Epoch 82/100
16/16 [==============================] - 0s 2ms/step - loss: 668.0378
Epoch 83/100
16/16 [==============================] - 0s 2ms/step - loss: 667.9488
Epoch 84/100
16/16 [==============================] - 0s 2ms/step - loss: 667.7075
Epoch 85/100
16/16 [==============================] - 0s 2ms/step - loss: 667.6132
Epoch 86/100
16/16 [==============================] - 0s 2ms/step - loss: 667.4966
Epoch 87/100
16/16 [==============================] - 0s 2ms/step - loss: 667.4224
Epoch 88/100
16/16 [==============================] - 0s 2ms/step - loss: 667.1114
Epoch 89/100
16/16 [==============================] - 0s 2ms/step - loss: 667.0513
Epoch 90/100
16/16 [==============================] - 0s 2ms/step - loss: 667.2527
Epoch 91/100
16/16 [==============================] - 0s 2ms/step - loss: 666.6097
Epoch 92/100
16/16 [==============================] - 0s 2ms/step - loss: 666.5334
Epoch 93/100
16/16 [==============================] - 0s 2ms/step - loss: 666.3892
Epoch 94/100
16/16 [==============================] - 0s 2ms/step - loss: 666.1669
Epoch 95/100
16/16 [==============================] - 0s 2ms/step - loss: 666.0068
Epoch 96/100
16/16 [==============================] - 0s 2ms/step - loss: 665.8843
Epoch 97/100
16/16 [==============================] - 0s 2ms/step - loss: 665.7877
Epoch 98/100
16/16 [==============================] - 0s 2ms/step - loss: 665.5769
Epoch 99/100
16/16 [==============================] - 0s 2ms/step - loss: 665.4597
Epoch 100/100
16/16 [==============================] - 0s 2ms/step - loss: 665.3188
16/16 [==============================] - 0s 2ms/step
1/1 [==============================] - 0s 65ms/step Previsão de Receita Usando a ANN Treinada = [[136.9302]]
Desafio 4: Implementação end-to-end MLP¶
Realize o treinamento de uma rede MLP para o dataset Fashion MNIST. Um guia passo a passo pode ser encontrado no link https://www.tensorflow.org/tutorials/keras/classification.
### Seu código aqui.....
