Como actualizar de forma automática los pesos de la red neuronal
El framework hasta el momento ya es capaz de realizar la retropropagacion automáticamente, pero todavía no actualiza todos los pesos de forma automática, para definiremos la clase SGD
que realiza Stochastic Gradient Descent
o Descenso de gradiente Estocastico
import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
sys.path.append(module_path)
class SGD(object):
def __init__(self, parameters, alpha=0.1):
self.parameters = parameters
self.alpha = alpha
def zero(self):
for p in self.parameters:
p.grad.data *= 0
def step(self, zero=True):
for p in self.parameters:
p.data = p.data - (self.alpha * p.grad.data)
if(zero):
p.grad.data *= 0
La misma red neuronal del notebook anterior, utilizando stochastic gradient descent
para optimizarla
from lightdlf_old.cpu.core import Tensor
import numpy as np
np.random.seed(0)
data = Tensor(np.array([[0,0],[0,1],[1,0],[1,1]]), autograd=True) # (4,2)
target = Tensor(np.array([[0],[1],[0],[1]]), autograd=True) # (4,1)
w = list()
w.append(Tensor(np.random.rand(2,3), autograd=True)) # (2,3)
w.append(Tensor(np.random.rand(3,1), autograd=True)) # (3,1)
optim = SGD(w, alpha=0.1)
for i in range(10):
pred = data.mm(w[0]).mm(w[1])
loss = ((pred - target) * (pred - target)).sum(0)
loss.backward(Tensor(np.ones_like(loss.data)))
optim.step()
print(loss)