示例#1
0
	def numerical_gradient(self, X, T):
		"""勾配を求める(数値微分)

		Parameters
		----------
		X : 入力データ
		T : 教師ラベル

		Returns
		-------
		各層の勾配を持ったディクショナリ変数
			grads['W1']、grads['W2']、...は各層の重み
			grads['b1']、grads['b2']、...は各層のバイアス
		"""
		loss_W = lambda W: self.loss(X, T, train_flg=True)

		grads = {}
		for idx in range(1, self.hidden_layer_num+2):
			grads['w' + str(idx)] = numericalGradient(loss_W, self.params['w' + str(idx)])
			grads['b' + str(idx)] = numericalGradient(loss_W, self.params['b' + str(idx)])
			
			if self.use_batchnorm and idx != self.hidden_layer_num+1:
				grads['gamma' + str(idx)] = numericalGradient(loss_W, self.params['gamma' + str(idx)])
				grads['beta' + str(idx)] = numericalGradient(loss_W, self.params['beta' + str(idx)])

		return grads
示例#2
0
 def getNumericalGradient(self, x, t):
     loss = lambda W: self.getLoss(x, t)
     gradients = {}
     gradients['w1'] = numericalGradient(loss, self.params['w1'])
     gradients['b1'] = numericalGradient(loss, self.params['b1'])
     gradients['w2'] = numericalGradient(loss, self.params['w2'])
     gradients['b2'] = numericalGradient(loss, self.params['b2'])
     return gradients
示例#3
0
	def getNumericalGradient(self, x, t):
		wLossFunc = lambda w: self.getLoss(x, t)
		
		gradients = {}
		gradients['w1'] = numericalGradient(wLossFunc, self.params['w1'])
		gradients['b1'] = numericalGradient(wLossFunc, self.params['b1'])
		gradients['w2'] = numericalGradient(wLossFunc, self.params['w2'])
		gradients['b2'] = numericalGradient(wLossFunc, self.params['b2'])
		return gradients
示例#4
0
def gradientDescent(f, initialX, learningRate = 0.01, stepNum = 100):
	x = initialX
	
	for i in range(stepNum):
		gradient = numericalGradient(f, x)
		x -= learningRate * gradient
	
	return x
示例#5
0
def gradientDescent(f, initialX, learningRate=0.01, stepNum=100):
    x = initialX
    history = []

    for i in range(stepNum):
        history.append(x.copy())

        gradient = numericalGradient(f, x)
        x -= learningRate * gradient

    return x, np.array(history)
示例#6
0
	def numerical_gradient(self, x, t):
		"""勾配を求める(数値微分)
		
		Parameters
		----------
		x : 入力データ
		t : 教師ラベル
		
		Returns
		-------
		各層の勾配を持ったディクショナリ変数
			grads['w1']、grads['w2']、...は各層の重み
			grads['b1']、grads['b2']、...は各層のバイアス
		"""
		loss_w = lambda w: self.loss(x, t)
		
		grads = {}
		for idx in (1, 2, 3):
			grads['w' + str(idx)] = numericalGradient(loss_w, self.params['w' + str(idx)])
			grads['b' + str(idx)] = numericalGradient(loss_w, self.params['b' + str(idx)])
		
		return grads
示例#7
0
    def numerical_gradient(self, x, t):
        """勾配を求める(数値微分)

        Parameters
        ----------
        x : 入力データ
        t : 教師ラベル

        Returns
        -------
        各層の勾配を持ったディクショナリ変数
            grads['W1']、grads['W2']、...は各層の重み
            grads['b1']、grads['b2']、...は各層のバイアス
        """
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        for idx in range(1, self.hidden_layer_num+2):
            grads['w' + str(idx)] = numericalGradient(loss_W, self.params['w' + str(idx)])
            grads['b' + str(idx)] = numericalGradient(loss_W, self.params['b' + str(idx)])

        return grads
示例#8
0
def gradientDescent(f, initX, lr=0.0001, step=100):
    x = initX
    for i in range(step):
        grad = numericalGradient(f, x)
        x -= x * lr
    return x
示例#9
0
            [-0.63929169, 0.59491399, 0.67441589],
            [-1.4568322, -1.79286679, 0.1717967],
        ])

    def predict(self, x):
        return np.dot(x, self.w)

    def loss(self, x, t):
        y = self.predict(x)
        y = softmax(y)
        loss = crossEntropyErrorMB(y, t)
        print(y)
        return loss


if (__name__ == "__main__"):
    result = getMnist(True, True, True)
    net = simpleNet()
    x = np.array([1.3, 6.0])
    t = np.array([0, 0, 1])
    net.loss(x, t)

    def funcNet(w):
        return net.loss(x, t)

    for i in range(100):
        grad = numericalGradient(funcNet, net.w)
        net.w -= grad * 0.01
        # print(grad);
    print(net.w)
示例#10
0
#coding: utf-8

import sys
import matplotlib.pylab as plt
import numpy as np
sys.path.append('../../')
from common.gradient import numericalGradient


def f(x):
    return np.sum(x**2)


print(numericalGradient(f, np.array([3.0, 4.0])))
print(numericalGradient(f, np.array([0.0, 2.0])))
print(numericalGradient(f, np.array([3.0, 0.0])))
print(numericalGradient(f, np.array([99.0, 100.0, 5.0, 300.0])))
def line(f, x):
    a = numericalGradient(f, x)
    y = f(x) - a * x
    return lambda t: a * t + y
    for i in range(stepNum):
        history.append(x.copy())

        gradient = numericalGradient(f, x)
        x -= learningRate * gradient

    return x, np.array(history)


# gradient
x0 = np.arange(-4.0, 4.0, 0.25)
x1 = np.arange(-4.0, 4.0, 0.25)
x, y = np.meshgrid(x0, x1)
x = x.flatten()
y = y.flatten()
gradient = numericalGradient(f, np.array([x, y]))
print(gradient)

# history
initialX = np.array([-3.0, 4.0])
dummy, history = gradientDescent(f, initialX, 0.1, 100)
print(dummy)
print(history)

# plot
plt.figure()
plt.quiver(x,
           y,
           -gradient[0],
           -gradient[1],
           angles="xy",
示例#13
0
#coding: utf-8

import sys
import numpy as np
from SimpleNet import SimpleNet
from common.gradient import numericalGradient

net = SimpleNet()
print(net.w)

x = np.array([0.6, 0.9])
p = net.predict(x)
print(p)
print(np.argmax(p))  # index of max number

t = np.array([0, 0, 1])
loss = net.loss(x, t)
print(loss)

#def f(w):
#	return net.loss(x, t)
#dw = numericalGradient(f, net.w)
dw = numericalGradient(lambda w: net.loss(x, t), net.w)
print(dw)