Principais Funções Transferência no KerasPrincipais Funções de Ativação Disponíveis no KerasLinear (reta)Sigmóide (Sigmoid)Tangente Hiperbólica (Tanh)ReLU (Rectified Linear Unit)Leaky ReLUSeLU (Scaled Exponential Linear Unit)SoftPlusSoftSignSwishExponencialELU (Exponencial Linear Unit)GeLU (Gaussian Error Linear Unit)SoftMaxCódigo para Plotar $f(x)$ e $f'(x)$ExplicaçãoMelhorando o código anterior para outras transfer functionsO que foi alterado?Ocultando mensagens de Warnings no KerasSolução: Suprimir os logs do TensorFlowExplicação dos Níveis de Log
É possível gerar um gráfico usando Matplotlib para exibir tanto a função de ativação quanto sua derivada .
O Keras fornece diversas funções de ativação pré-implementadas na sub-biblioteca keras.activations
, mas a maioria delas não expõe diretamente a derivada. No entanto, é possível calcular a derivada manualmente usando tensorflow.gradients
ou autodiff
do TensorFlow.
É possível gerar um gráfico usando Matplotlib para exibir tanto a função de ativação quanto sua derivada . Vamos tentar mostrar as funções, suas equações e gráficos correspondentes.
O Keras inclui as seguintes funções de ativação, que podem ser passadas como strings:
'linear'
'sigmoid'
: Função Sigmóide (Sigmoid)
Equação:
Faixa de Entrada:
Faixa de Saída:
Derivada:
Uso: principalmente em problemas de classificação binária, onde queremos prever uma probabilidade entre 0 e 1.
Vantagens:
Desvantagens:
Vanishig Gradient Problem 🚨
Não é centrada em zero ⚠️
Computacionalmente mais cara 💰
'tanh'
: Função Tangente Hiperbólica (Tanh)
Equação:
Faixa de Entrada:
Faixa de Saída:
Derivada:
Comparação entre sigmoid tanh:
Característica | sigmoid(x) | tanh(x) |
---|---|---|
Intervalo de Saída | ||
Simetria | Não centrada em zero | Centrada em zero |
Vanishing Gradient | SIm (problema grave) | Sim (mas menos severo) |
Uso recomendado | Classificação binária | Camadas ocultas em RNs |
'relu'
: Rectified Linear Unit, por exemplo:
xfrom tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(64, activation='relu', input_shape=(20,)),
Dense(10, activation='softmax') # Última camada para classificação multiclasse
])
Equação: , ou:
Faixa de Entrada:
Faixa de Saída:
Derivada:
Uso:
Vantagens:
Treina redes profundas melhor que sigmoid e tanh.
Não sofre com o problema de Vanishing Gradient (quase sempre)
Computacionalmente eficiente 💨
Introduz esparsidade na rede
Desvantagens:
Problema do "Neurônio Morto" 🚨
Não é centrada em zero ⚠️
Pode ser instável em algumas redes
Requer: inicialização dos pesos for bem feita (ex: He Initialization).
activation=LeakyReLU(alpha=0.01)
O Keras não aceita leaky_relu
como string na ativação, então deve-se passar a função manualmente, por exemplo:
xxxxxxxxxx
from tensorflow.keras.layers import Dense
from tensorflow.keras.activations import linear
from tensorflow.keras.layers import LeakyReLU
layer = Dense(10, activation=LeakyReLU(alpha=0.01)) # # Alpha padrão = 0.3
ou:
xxxxxxxxxx
from tensorflow.keras.layers import LeakyReLU
model = Sequential([
Dense(64),
LeakyReLU(alpha=0.01), # Define o "leak" para valores negativos
Dense(10, activation='softmax')
])
Equação: , onde é uma pequena constante (e.g., 0.01)
Faixa de Entrada:
Faixa de Saída:
Derivada:
< Curvas >
'selu'
: (Scaled Exponential Linear Unit)
Equação: onde e são constantes escalares, constantes fixas para garantir a normalização da ativação:
Obs: Isso faz com que a SeLU auto-normalize os valores durante o treinamento, garantindo que os dados se mantenham com média zero e variância constante.
Faixa de Entrada:
Faixa de Saída:
Derivada:
Proposta para permitir que redes neurais treinem de forma autônoma e robusta, mantendo a normalização dos dados sem precisar de Batch Normalization.
Vantagens:
Auto-normalização
Evita o problema do "neurônio morto"
Acelera o treinamento
Boa para redes profundas
Desvantagens:
Funciona melhor com inicialização específica (He Initialization Modificada)
SeLU funciona melhor com inicialização LeCun normal:
xxxxxxxxxx
from tensorflow.keras.initializers import lecun_normal
initializer = lecun_normal()
ou:
xxxxxxxxxx
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(64, activation='selu', kernel_initializer='lecun_normal', input_shape=(20,)),
Dense(10, activation='softmax')
])
Requer uma arquitetura específica
Pode explodir ou morrer em certos casos
SeLUs Outras funções:
Função | Características | Problemas Resolvidos |
---|---|---|
ReLU | Simples e eficiente, mas sofre com neurônios mortos. | |
Leaky ReLU | Pequeno valor negativo para | Evita neurônios mortos, mas não auto-normaliza. |
ELU | para | Suaviza valores negativos, mas precisa de mais cálculos. |
SeLU | Auto-normalização + pequeno leak negativo | Mantém a média e variância constantes, acelerando o treinamento. |
Uso:
'softplus'
Equação:
Faixa de Entrada:
Faixa de Saída:
Derivada: (diferenciável em qq ponto).
A Softplus é uma função de ativação que suaviza a ReLU ao substituir o corte brusco em por uma curva suave.
Vantagens:
Diferenciável em todos os pontos
Evita "neurônios mortos"
Boa para propagação do gradiente
Isso mantém um gradiente estável mesmo para valores negativos.
Melhor que a ReLU para algumas redes probabilísticas
Desvantagens:
Mais cara computacionalmente
Pode saturar para valores negativos muito baixos
ReLU ainda é mais popular para deep learning
'softsign'
Equação: Essa função mapeia qualquer valor de entrada para o intervalo de forma suave, semelhante à tangente hiperbólica (tanh), mas com uma transição mais lenta para valores grandes de .
Faixa de Entrada:
Faixa de Saída:
Derivada:
Vattagens:
Menos propensa a saturação extrema
Mais suave do que ReLU e Softplus
Evita explosão de gradiente
Desvantagens:
Mais lenta para grandes valores de xx
Menos popular que tanh e ReLU
Pode sofrer com gradientes pequenos
Uso:
Comparando com funções similares:
Função | Equação | Características |
---|---|---|
Sigmoid | Mapeia para , usada em probabilidades, mas sofre com vanishing gradient. | |
Tanh | Mapeia para , Melhor que sigmoid para redes profundas, mas ainda pode saturar. | |
Softsign | Suave, menos propensa a saturação, mas cresce devagar. | |
ReLU | Simples e eficiente, usada em redes profundas, mas pode ter neurônios mortos. | |
Softplus | Suaviza a ReLU, diferenciável em todos os pontos, mas computacionalmente mais cara. |
'swish'
(no TensorFlow 2.2+)
Desenvolvida pelo Google.
Equação: , onde é a função sigmóide e é um parâmetro aprendido ou fixo, ou:
Faixa de Entrada:
Faixa de Saída:
Derivada:
Vantagens:
Suavidade e continuidade
Evita o problema de neurônios mortos
Melhor desempenho em redes profundas
Geralmente melhora a acurácia
Desvantagens
Mais cara computacionalmente
Nem sempre é melhor que ReLU
Uso:
Tabela Comparativa com funções similares:
Função | Equação | Características |
---|---|---|
ReLU | Simples e eficiente, mas pode causar neurônios mortos. | |
Swish | Melhor que ReLU em redes profundas, suaviza valores negativos. | |
Sigmoid | Sofre com vanishing gradient e saturação. | |
Tanh | Funciona bem, mas ainda pode saturar. | |
Softsign | Suave, menos propensa à saturação que tanh, mas lenta para valores grandes de . |
'exponential'
'elu'
: Exponencial Linear Unit
Equação:
Faixa de Entrada:
Faixa de Saída:
Derivada:
'gelu'
: Gaussian Error Linear Unit
Equação: , onde é a função de distribuição acumulada da distribuição normal padrão.
Faixa de Entrada:
Faixa de Saída:
Derivada:
onde é a função de densidade de probabilidade da distribuição normal padrão.
'softmax'
!?
Equação:
Faixa de Entrada:
Faixa de Saída: , para:
Derivada: A derivada do Softmax é mais complexa e depende da entrada específica. Para uma saída , a derivada parcial em relação a é:
onde é o delta de Kronecker.
A função softmax é bastante usada na camada de saída (a última) para transformar as saídas de uma rede neural em uma distribuição de probabilidade, o que é particularmente útil em tarefas de classificação multi-classe:
sigmoid
em vez de softmax
na última camada.Exemplo de uso:
xxxxxxxxxx
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(64, activation='relu', input_shape=(20,)), # Camada oculta com ReLU
Dense(10, activation='softmax') # Última camada com Softmax para 10 classes
])
Outro exemplo:
xxxxxxxxxx
import tensorflow as tf
from tensorflow.keras.activations import softmax
x = tf.constant([1.0, 2.0, 3.0]) # Tensor 1D
# Expande para 2D (batch_size=1, features=3), aplica softmax e depois reduz de volta
y = softmax(tf.reshape(x, (1, -1)))
y = tf.reshape(y, (-1,)) # Converte de volta para 1D
print(y.numpy()) # Saída correta
'''
Exemplo de saída gerada:
[0.09003057 0.24472848 0.66524094]
'''
O código abaixo gera um gráfico com a função de ativação ReLU e sua derivada sobrepostas:
xxxxxxxxxx
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import activations
def plot_activation_function(act_name, x_range=(-3, 3), num_points=500):
x = np.linspace(x_range[0], x_range[1], num_points)
x_tf = tf.Variable(x, dtype=tf.float32)
# Obtém a função de ativação do Keras
act_func = getattr(activations, act_name)
with tf.GradientTape() as tape:
tape.watch(x_tf)
y = act_func(x_tf) # f(x)
dy_dx = tape.gradient(y, x_tf) # f'(x)
# Plot
plt.figure(figsize=(8, 5))
plt.plot(x, y.numpy(), label=f'{act_name}(x)', color='blue', linewidth=2)
plt.plot(x, dy_dx.numpy(), label=f"{act_name}'(x)", color='red', linestyle='dashed', linewidth=2)
plt.axhline(0, color='black', linewidth=0.5, linestyle='dotted')
plt.axvline(0, color='black', linewidth=0.5, linestyle='dotted')
plt.legend()
plt.title(f'Função de Ativação: {act_name} e sua Derivada')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
# Exemplo: Plotando a função 'relu'
plot_activation_function('relu')
getattr(activations, act_name)
: Obtém a função de ativação pelo nome.
tf.GradientTape()
: Calcula a derivada automaticamente no TensorFlow.
O gráfico exibe:
Basta chamar plot_activation_function('sigmoid')
ou outro nome de ativação do Keras para visualizar diferentes funções.
Saída gerada:
Segue versão melhorada do código anterior, onde o usuário pode inserir a função de ativação desejada como uma string, garantindo compatibilidade com as funções disponíveis no Keras: show_transfer_function.py
xxxxxxxxxx
'''
Gera gráfico de f(x) (transfer funtion) e sua derivada, f´(x) -- disponíveis no Keras
Fernando Passold, em 18/03/2025
'''
import numpy as np
import matplotlib.pyplot as plt
'''
As 2 linhas de código abaixo são para suprimiar mensagens do tipo:
---
2025-03-18 10:38:39.435028: I tensorflow/core/platform/cpu_feature_guard.cc:193]
This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)
to use the following CPU instructions in performance-critical operations: AVX2 FMA
---
'''
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Oculta avisos e informações do TensorFlow
import tensorflow as tf
from tensorflow.keras import activations
def plot_activation_function():
act_name = input("Digite o nome da função de ativação (ex: relu, sigmoid, tanh): ").strip().lower()
# Lista de funções de ativação disponíveis no Keras
available_activations = {
'relu', 'sigmoid', 'tanh', 'softplus', 'softsign',
'selu', 'elu', 'exponential', 'swish', 'gelu',
'exponential', 'linear' #, 'softmax'
}
if act_name not in available_activations:
print(f"Erro: '{act_name}' não é uma função de ativação válida.")
print("Funções válidas:", ", ".join(available_activations))
return
x_range = (-3, 3)
num_points = 500
x = np.linspace(x_range[0], x_range[1], num_points)
x_tf = tf.Variable(x, dtype=tf.float32)
# Obtém a função de ativação do Keras
act_func = getattr(activations, act_name)
with tf.GradientTape() as tape:
tape.watch(x_tf)
y = act_func(x_tf) # f(x)
dy_dx = tape.gradient(y, x_tf) # f'(x)
# Plot
plt.figure(figsize=(8, 5))
plt.plot(x, y.numpy(), label=f'{act_name}(x)', color='blue', linewidth=2)
plt.plot(x, dy_dx.numpy(), label=f"{act_name}'(x)", color='red', linestyle='dashed', linewidth=2)
plt.axhline(0, color='black', linewidth=0.5, linestyle='dotted')
plt.axvline(0, color='black', linewidth=0.5, linestyle='dotted')
plt.legend()
plt.title(f'Função de Ativação: {act_name} e sua Derivada')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
# Chama a função para entrada do usuário
plot_activation_function()
.lower()
) para evitar erros de digitação.Agora, ao rodar o script, ele pedirá a entrada da função de ativação e exibirá seu gráfico com a derivada! 🎨📈
No meu caso, toda vez que executo o script acima é gerado uma mensagem no início do processamento mostrando algo como:
xxxxxxxxxx
2025-03-18 10:38:39.435028: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
É possível evitar essa mensagem de log do TensorFlow ajustando a variável de ambiente TF_CPP_MIN_LOG_LEVEL
.
Adicione este código logo no início do seu script Python:
xxxxxxxxxx
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # Oculta avisos e informações do TensorFlow
import tensorflow as tf
O TensorFlow usa a variável TF_CPP_MIN_LOG_LEVEL
para controlar as mensagens exibidas. Os níveis são:
'0'
→ Mostra todas as mensagens (padrão). '1'
→ Oculta mensagens de INFO. '2'
→ Oculta mensagens de INFO e WARNING. '3'
→ Oculta todas as mensagens, incluindo ERROR. Se quiser esconder apenas as mensagens de otimização da CPU, mas ainda visualizar warnings, use '1'
em vez de '2'
.
18/03/2025