当前位置:   article > 正文

鱼书深度学习入门:gradient_simplenet_numeric_gradient

numeric_gradient
  1. #以一个简单的神经网络为例,来实现求损失函数关于权重参数的梯度
  2. #刚开始看 记录一下笔记
  3. import sys, os
  4. sys.path.append(os.pardir)
  5. import numpy as np
  6. from common.functions import softmax, cross_entropy_error # softmax 交叉熵函数
  7. from common.gradient import numerical_gradient # 求梯度函数
  8. class simpleNet:
  9. def __init__(self): # 用高斯分布进行初始化 2X3 输入层2个 输出层3个神经元
  10. self.W = np.random.randn(2,3)
  11. def predict(self, x):
  12. return np.dot(x, self.W) # NN计算
  13. def loss(self, x, t): # 求损失函数
  14. z = self.predict(x)
  15. y = softmax(z)
  16. loss = cross_entropy_error(y, t)
  17. #print (x,t,fz)
  18. return loss
  19. x = np.array([0.6, 0.9])
  20. t = np.array([0, 0, 1])
  21. #fz=3
  22. net = simpleNet()
  23. #lambda创建匿名函数
  24. #lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数
  25. #这里定义的参数w是一个伪参数。因为numerical_gradient(f,x)会在内部执行f(x),为了与之兼容而定义了f(W) 。(因为numerical_gradient中调的是f(x),所以只能有一个参数)
  26. f = lambda w: net.loss(x, t)
  27. #传参时并没有直接执行它,此时检测f的类型就是function,是一个函数而不是一个值,loss()函数作为一个(可求偏导的)变量来计算梯度
  28. #这里的梯度就是损失函数f对权重net.W的偏微分
  29. dW = numerical_gradient(f, net.W)
  30. print(dW)
  31. #f(0)也可以正常运行获取到x,t,另设fz变量也可以被获取到
  32. #所以与其他无关 simpleNet它本身可以获取到x与t
  33. #类本身获取全局变量√,所以传参时可以不传

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/537965
推荐阅读
相关标签
  

闽ICP备14008679号