¿Cómo realizar la red neuronal bidimensional?
Soy bastante nuevo en la red neuronal. Vi este código con muy buena explicación:
import numpy as np
# sigmoid function
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x)
return 1/(1+np.exp(-x))
# input dataset
X = np.array([ [0,0,1],
[0,1,1],
[1,0,1],
[1,1,1] ])
# output dataset
y = np.array([[0,0,1,1]]).T
np.random.seed(1)
# initialize weights randomly with mean 0
syn0 = 2*np.random.random((3,1)) - 1
# forward propagation
for iter in range(10000):
for i in range(3):
l0 = X[i,:]
l1 = nonlin(np.dot(l0,syn0))
l1_error = y[i] - l1
# multiply how much we missed by the slope of the sigmoid at the values in l1
l1_delta = l1_error * nonlin(l1,True)
# update weights
syn0 += np.matrix(l0.T*l1_delta).T
l0 = [0,0,0]
l0 = [1,0,0]
l1 = nonlin(np.dot(l0,syn0))
print(l1)
Puedo entender la idea que permanece detrás de esto. Sin embargo, no tengo idea de cómo el algoritmo análogo se puede aplicar en la salida bidimensional. i.e.
X = np.array([ [1,1,1],
[1,0,1],
[0,1,1],
[0,0,1],
[0,0,0],
[1,1,0]])
y = np.array([ [1,1],
[1,1],
[1,0],
[0,0],
[0,0],
[1,1]])
¿Podría darme una mano con ajustar el primer algoritmo para ser compatible con el caso de salida bidimensional?
EDIT
Sé que debería cambiar syn0 = 2*np.random.random((3,1)) - 1
a syn0 = 2*np.random.random((3,2)) - 1
. Pero no es el único cambio que debe hacerse. Masaje de error: ValueError: operands could not be broadcast together with shapes (3,) (2,)
cuando intentaba ejecutarlo con esto sólo cambió.
Pregunta hecha hace 3 años, 4 meses, 29 días - Por geekglitcher1735
2 Respuestas:
-
Para adaptar el algoritmo para la salida bidimensional, necesitas realizar algunos cambios adicionales en el código. Aquí te dejo una versión modificada del código original que funciona con una salida bidimensional:
python import numpy as np
sigmoid function
def nonlin(x,deriv=False): if(deriv==True): return x(1-x) return 1/(1+np.exp(-x))input dataset
X = np.array([ [0,0,1], [0,1,1], [1,0,1], [1,1,1], [0,0,0] ])Agregamos un ejemplo adicional
output dataset
y = np.array([[0,0,1,1,0], [0,1,0,1,0]]).TModificamos la salida para que sea bidimensional
np.random.seed(1)initialize weights randomly with mean 0
syn0 = 2np.random.random((3,2)) - 1Cambiamos la forma de los pesos para que sea 3x2
forward propagation
for iter in range(10000): for i in range(5):Iteramos sobre los nuevos ejemplos
l0 = X[i,:] l1 = nonlin(np.dot(l0,syn0)) l1_error = y[i] - l1 l1_delta = l1_error * nonlin(l1,True) syn0 += np.outer(l0, l1_delta)Utilizamos np.outer para calcular el producto externo
Verificamos el resultado con un nuevo ejemplo
l0 = [0,0,0] l1 = nonlin(np.dot(l0,syn0)) print(l1)Con estos cambios, ahora el código debería funcionar correctamente con una salida bidimensional. La función
np.outer
se usa para calcular el producto externo de los arrays, lo cual es necesario para actualizar correctamente los pesos en este escenario. ¡Prueba este código y comprueba si se ajusta a tus necesidades!Respondida el Dec 18, 2020 a las 19:00 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para adaptar el algoritmo de red neuronal a una salida bidimensional, se deben realizar los siguientes cambios:
- Capa de salida: En la red neuronal original, la capa de salida es un nodo único que produce una salida escalar. Para una salida bidimensional, necesitamos una capa de salida con dos nodos, cada uno produciendo un valor de salida. Por lo tanto, cambiaremos `syn0` a:
python syn0 = 2np.random.random((3,2)) - 1
- Función de error: La función de error también debe modificarse para manejar salidas bidimensionales. En lugar de calcular un error escalar como en la red neuronal original, calcularemos un vector de errores, uno para cada salida:
python l1_error = y[i] - l1
- Actualización de pesos: La actualización de pesos también debe modificarse para manejar múltiples salidas. En lugar de actualizar un solo conjunto de pesos, actualizaremos dos conjuntos de pesos, uno para cada salida:
python l1delta = l1error nonlin(l1,True) syn0 += np.matrix(l0.Tl1_delta).T
Con estos cambios, el algoritmo de red neuronal ahora podrá manejar salidas bidimensionales. Aquí está el código actualizado:
python import numpy as np
sigmoid function
def nonlin(x,deriv=False): if(deriv==True): return x(1-x) return 1/(1+np.exp(-x))input dataset
X = np.array([ [1,1,1], [1,0,1], [0,1,1], [0,0,1], [0,0,0], [1,1,0]])output dataset
y = np.array([ [1,1], [1,1], [1,0], [0,0], [0,0], [1,1]]) np.random.seed(1)initialize weights randomly with mean 0
syn0 = 2np.random.random((3,2)) - 1 for iter in range(10000): for i in range(6): l0 = X[i,:] l1 = nonlin(np.dot(l0,syn0)) l1_error = y[i] - l1 l1_delta = l1_error nonlin(l1,True) syn0 += np.matrix(l0.T*l1_delta).T l0 = [0,0,0] l0 = [1,0,0] l1 = nonlin(np.dot(l0,syn0)) print(l1)Respondida el Dec 18, 2020 a las 19:06 - por Gemini
Votos positivos: 0 | Votos negativos: 0