exts.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from functools import reduce
  2. def relu(x):
  3. """激活函数-阶跃函数
  4. :param x: 输入值
  5. :return:
  6. """
  7. return 1 if x > 0 else 0
  8. def gradient_check(network, x, y):
  9. """梯度检查
  10. :param network: 神经网络对象
  11. :param x: 样本的特征
  12. :param y: 样本的标签
  13. :return:
  14. """
  15. # 计算网络误差
  16. network_error = lambda vec1, vec2: \
  17. 0.5 * reduce(lambda a, b: a + b,
  18. map(lambda v: (v[0] - v[1]) * (v[0] - v[1]),
  19. zip(vec1, vec2)))
  20. # 获取网络在当前样本下每个连接的梯度
  21. network.get_gradient(x, y)
  22. # 对每个权重做梯度检查
  23. for conn in network.connections.connections:
  24. # 获取指定连接的梯度
  25. actual_gradient = conn.get_gradient()
  26. # 增加一个很小的值,计算网络的误差
  27. epsilon = 0.0001
  28. conn.weight += epsilon
  29. error1 = network_error(network.predict(x), y)
  30. # 减去一个很小的值,计算网络的误差
  31. conn.weight -= 2 * epsilon # 刚才加过了一次,因此这里需要减去2倍
  32. error2 = network_error(network.predict(x), y)
  33. # 根据式6计算期望的梯度值
  34. expected_gradient = (error2 - error1) / (2 * epsilon)
  35. # 打印
  36. print('expected gradient: \t%f\nactual gradient: \t%f' % (expected_gradient, actual_gradient))