Función PyTorch torch.nn.Tanh
Manual de referencia de PyTorch torch.nn
torch.nn.TanhEs la función de activación tangente hiperbólica en PyTorch.
Asigna los valores de entrada a entre -1 y 1, con salida centrada en cero, comúnmente utilizada en redes neuronales recurrentes.
Definición de la función
torch.nn.Tanh()
Principio matemático
Tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
Ejemplo de uso
Ejemplo 1: Uso básico
Ejemplo
import torch
import torch.nn as nn
tanh = nn.Tanh()
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
output = tanh(x)
print("Entrada:", x.tolist())
print("Salida:", output.tolist())
print("Características: rango de salida [-1, 1], centrado en cero")
import torch.nn as nn
tanh = nn.Tanh()
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
output = tanh(x)
print("Entrada:", x.tolist())
print("Salida:", output.tolist())
print("Características: rango de salida [-1, 1], centrado en cero")
Ejemplo 2: Uso en LSTM
Ejemplo
import torch
import torch.nn as nn
class SimpleLSTMCell(nn.Module):
def __init__(self, input_size, hidden_size):
super(SimpleLSTMCell, self).__init__()
self.hidden_size = hidden_size
# El mecanismo de compuerta usa Tanh y Sigmoid
self.tanh = nn.Tanh()
self.sigmoid = nn.Sigmoid()
def forward(self, x, hidden):
h, c = hidden
# Cálculo de compuerta simplificado
gates = self.sigmoid(x @ torch.randn(x.shape[1], self.hidden_size * 4))
# Tanh se usa para la memoria candidata
candidate = self.tanh(x @ torch.randn(x.shape[1], self.hidden_size))
return candidate, torch.zeros_like(h)
# Prueba
cell = SimpleLSTMCell(10, 20)
x = torch.randn(1, 10)
h = torch.randn(1, 20)
c = torch.randn(1, 20)
new_h, new_c = cell(x, (h, c))
print("Forma de entrada:", x.shape)
print("Forma del estado oculto:", new_h.shape)
import torch.nn as nn
class SimpleLSTMCell(nn.Module):
def __init__(self, input_size, hidden_size):
super(SimpleLSTMCell, self).__init__()
self.hidden_size = hidden_size
# El mecanismo de compuerta usa Tanh y Sigmoid
self.tanh = nn.Tanh()
self.sigmoid = nn.Sigmoid()
def forward(self, x, hidden):
h, c = hidden
# Cálculo de compuerta simplificado
gates = self.sigmoid(x @ torch.randn(x.shape[1], self.hidden_size * 4))
# Tanh se usa para la memoria candidata
candidate = self.tanh(x @ torch.randn(x.shape[1], self.hidden_size))
return candidate, torch.zeros_like(h)
# Prueba
cell = SimpleLSTMCell(10, 20)
x = torch.randn(1, 10)
h = torch.randn(1, 20)
c = torch.randn(1, 20)
new_h, new_c = cell(x, (h, c))
print("Forma de entrada:", x.shape)
print("Forma del estado oculto:", new_h.shape)
Ejemplo 3: Comparación con Sigmoid
Ejemplo
import torch
import torch.nn as nn
import numpy as np
x = np.linspace(-3, 3, 11)
x_tensor = torch.tensor(x, dtype=torch.float32)
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()
print("x Sigmoid Tanh")
print("-" * 35)
for i in range(0, 11, 2):
xi = x_tensor[i:i+2]
print(f"{xi[0].item():5.1f} {sigmoid(xi)[0].item():9.4f} {tanh(xi)[0].item():9.4f}")
import torch.nn as nn
import numpy as np
x = np.linspace(-3, 3, 11)
x_tensor = torch.tensor(x, dtype=torch.float32)
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()
print("x Sigmoid Tanh")
print("-" * 35)
for i in range(0, 11, 2):
xi = x_tensor[i:i+2]
print(f"{xi[0].item():5.1f} {sigmoid(xi)[0].item():9.4f} {tanh(xi)[0].item():9.4f}")
Preguntas frecuentes
P1: ¿Diferencia entre Tanh y Sigmoid?
El rango de salida de Tanh es [-1,1] (centrado en cero), mientras que Sigmoid produce [0,1].
P2: ¿Por qué LSTM usa Tanh?
La característica de centrado en cero de Tanh hace que el flujo de gradientes sea más estable.
Casos de uso
- Redes neuronales recurrentes: activación predeterminada de LSTM, GRU
- Modelos generativos: generador de GAN
- Mecanismo de compuerta: controlar el rango de información
Otras extensiones