Evolução do treino (com gráfico MSE)IntroExemplo_1 de CódigoDetalhes do CódigoExemplo_2: Código Melhorado (plotagem dinâmica)Explicação das ModificaçõesSaída EsperadaObservaçõesObservações Finais
No Keras, a função de custo baseada no Erro Quadrático Médio (MSE) é implementada como MeanSquaredError e pode ser usada diretamente ao compilar o modelo. O MSE é calculado automaticamente durante o treinamento sobre o conjunto de treino. Para calcular o MSE sobre o conjunto de teste, você pode usar o método evaluate do modelo após cada época.
Para acumular os valores de MSE para os conjuntos de treino e teste a cada época e plotá-los em um gráfico, você pode usar callbacks personalizados no Keras. Abaixo, segue um exemplo de como fazer isso.
ximport numpy as npimport matplotlib.pyplot as pltfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Densefrom tensorflow.keras.callbacks import Callback# Dados de exemploX_train = np.random.rand(1000, 10)y_train = np.random.rand(1000, 1)X_test = np.random.rand(200, 10)y_test = np.random.rand(200, 1)# Definindo o modelomodel = Sequential()model.add(Dense(16, input_dim=10, activation='relu'))model.add(Dense(1)) # Saída linear para regressão# Compilando o modelo com MSE como função de customodel.compile(optimizer='adam', loss='mean_squared_error')# Vetores para armazenar os valores de MSEtrain_mse = []test_mse = []# Callback personalizado para calcular MSE no conjunto de teste a cada épocaclass MSECallback(Callback): def on_epoch_end(self, epoch, logs=None): \# Calcula o MSE no conjunto de treino train_loss = logs['loss'] train_mse.append(train_loss) \# Calcula o MSE no conjunto de teste test_loss = self.model.evaluate(X_test, y_test, verbose=0) test_mse.append(test_loss) print(f"Época {epoch + 1}: MSE Treino = {train_loss:.4f}, MSE Teste = {test_loss:.4f}")# Instanciando o callbackmse_callback = MSECallback()# Treinando o modelohistory = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test), callbacks=[mse_callback])# Plotando os valores de MSEplt.plot(train_mse, label='MSE Treino')plt.plot(test_mse, label='MSE Teste')plt.xlabel('Época')plt.ylabel('MSE')plt.title('MSE vs Época')plt.legend()plt.show()Dados de Exemplo:
X_train e y_train são os dados de treino.X_test e y_test são os dados de teste.Modelo:
Função de Custo:
mean_squared_error ao compilar o modelo.Callback Personalizado:
MSECallback é criado para calcular o MSE no conjunto de teste a cada época.on_epoch_end é chamado no final de cada época, onde:logs['loss']).evaluate.Armazenamento e Plotagem:
train_mse e test_mse).matplotlib.Saída Esperada
Para plotar o gráfico dinamicamente (ou seja, atualizar o gráfico enquanto a rede está sendo treinada), você pode usar a biblioteca matplotlib em conjunto com o método plt.pause() para atualizar o gráfico a cada época. Abaixo, vou modificar o código anterior para incluir a plotagem dinâmica.
Código:
xxxxxxxxxximport numpy as npimport matplotlib.pyplot as pltfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Densefrom tensorflow.keras.callbacks import Callback# Dados de exemploX_train = np.random.rand(1000, 10)y_train = np.random.rand(1000, 1)X_test = np.random.rand(200, 10)y_test = np.random.rand(200, 1)# Definindo o modelomodel = Sequential()model.add(Dense(16, input_dim=10, activation='relu'))model.add(Dense(1)) # Saída linear para regressão# Compilando o modelo com MSE como função de customodel.compile(optimizer='adam', loss='mean_squared_error')# Vetores para armazenar os valores de MSEtrain_mse = []test_mse = []# Configuração do gráficoplt.ion() # Ativa o modo interativo do matplotlibfig, ax = plt.subplots()ax.set_xlabel('Época')ax.set_ylabel('MSE')ax.set_title('MSE vs Época')train_line, = ax.plot([], [], label='MSE Treino')test_line, = ax.plot([], [], label='MSE Teste')ax.legend()plt.show()# Callback personalizado para calcular MSE no conjunto de teste a cada épocaclass MSECallback(Callback): def on_epoch_end(self, epoch, logs=None): # Calcula o MSE no conjunto de treino train_loss = logs['loss'] train_mse.append(train_loss) # Calcula o MSE no conjunto de teste test_loss = self.model.evaluate(X_test, y_test, verbose=0) test_mse.append(test_loss) # Atualiza o gráfico train_line.set_xdata(np.arange(len(train_mse))) train_line.set_ydata(train_mse) test_line.set_xdata(np.arange(len(test_mse))) test_line.set_ydata(test_mse) ax.relim() # Recalcula os limites dos eixos ax.autoscale_view() # Ajusta a escala dos eixos plt.draw() plt.pause(0.1) # Pausa para atualizar o gráfico print(f"Época {epoch + 1}: MSE Treino = {train_loss:.4f}, MSE Teste = {test_loss:.4f}")# Instanciando o callbackmse_callback = MSECallback()# Treinando o modelohistory = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test), callbacks=[mse_callback])# Manter o gráfico aberto após o treinamentoplt.ioff()plt.show()plt.ion(): Ativa o modo interativo do matplotlib, permitindo que o gráfico seja atualizado dinamicamente.Configuração do Gráfico:
fig, ax = plt.subplots(): Cria uma figura e um eixo para o gráfico.train_line, = ax.plot([], [], label='MSE Treino'): Cria uma linha vazia para o MSE do treino.test_line, = ax.plot([], [], label='MSE Teste'): Cria uma linha vazia para o MSE do teste.ax.legend(): Adiciona uma legenda ao gráfico.Atualização Dinâmica:
No callback MSECallback, após calcular o MSE para treino e teste, as linhas do gráfico são atualizadas com os novos valores:
xxxxxxxxxxtrain_line.set_xdata(np.arange(len(train_mse)))train_line.set_ydata(train_mse)test_line.set_xdata(np.arange(len(test_mse)))test_line.set_ydata(test_mse)ax.relim() e ax.autoscale_view(): Ajustam os limites e a escala dos eixos para acomodar os novos dados.
plt.draw(): Redesenha o gráfico.
plt.pause(0.1): Pausa a execução por 0.1 segundos para permitir a atualização do gráfico.
Manter o Gráfico Aberto:
plt.ioff(): Desativa o modo interativo após o treinamento.plt.show(): Mantém o gráfico aberto após o término do treinamento.Desempenho:
Personalização:
Outras Bibliotecas:
Plotly ou Bokeh, que oferecem funcionalidades mais avançadas para gráficos dinâmicos.Com essas modificações, você poderá visualizar o progresso do treinamento em tempo real, o que é útil para monitorar o desempenho do modelo e detectar problemas como overfitting ou underfitting.
Validação Automática:
validation_data no método fit. No entanto, o callback personalizado permite maior controle sobre o processo.Eficiência:
Outras Métricas:
Esse método é flexível e pode ser adaptado para diferentes cenários de treinamento e avaliação de modelos.
Outros métodos de testar evolução do treino da rede: .
20/03/2025