当前位置:   article > 正文

山东大学人工智能导论实验二 前向传播和反向传播_山东大学人工智能实验

山东大学人工智能实验

目录

【实验目标】

【实验内容】

【代码要求】

【文档要求】


【实验目标】

  1. 理解前向传播和反向传播
  2. 应用作业一中提到的基本操作

【实验内容】

假设X有n个样本,属于m=3个类别, 表示样本属于第m类的概率,请实现的三次前向传播及反向传播(更新参数ωb),每次反向传播结束后更新并输出参数ωb的值,计算cross entropy loss,其中σ(∙)表示sigmoid函数。

【代码要求】

按代码模板实现函数功能

【文档要求】

前向传播及反向传播涉及到的公式计算(参考

①在前向传播的过程中,可以如下表示

 粘贴代码输出结果截图。

  1. import os
  2. import numpy as np
  3. import math
  4. def sigmoid(x):
  5. """
  6. Compute the sigmoid of x
  7. Arguments:
  8. x -- A scalar or numpy array of any size
  9. Return:
  10. s -- sigmoid(x)
  11. """
  12. # write your code here
  13. sig = 1 / (1 + np.exp(-x))
  14. return sig
  15. def softmax(x):
  16. """Calculates the softmax for the input x.
  17. Argument:
  18. x -- A numpy matrix of shape (n,)
  19. Returns:
  20. s -- A numpy matrix equal to the softmax of x, of shape (n,)
  21. """
  22. # write your code here
  23. x = np.exp(x) / np.sum(np.exp(x), axis=0, keepdims=True)
  24. return x
  25. def cross_entropy_loss(target, prediction):
  26. """
  27. Compute the cross entropy loss between target and prediction
  28. Arguments:
  29. target -- the real label, a scalar or numpy array size = (n,)
  30. prediction -- the output of model, a scalar or numpy array, size=(n, c)
  31. Return:
  32. mean loss -- cross_entropy_loss(target, prediction)
  33. """
  34. # write your code here
  35. delta = 1e-6
  36. return -np.sum(prediction * np.log(target + delta))
  37. def forward(w, b, x):
  38. """
  39. Arguments:
  40. w -- weights, a numpy array of size (m, 1)
  41. b -- bias, a scalar
  42. x -- data of size (n, m)
  43. Return:
  44. prediction
  45. """
  46. ## write your code here
  47. prediction = sigmoid(x @ w + b)
  48. # print(prediction.shape)
  49. return prediction
  50. def backward(x, target, prediction):
  51. """
  52. Arguments:
  53. x -- data of size (n, m)
  54. target -- data of size (n, num_class)
  55. prediction -- data of size (n, num_class)
  56. Return:
  57. dw, db
  58. """
  59. delta = target - prediction
  60. db = delta
  61. dw = sigmoid(x.T) @ delta
  62. return dw, db
  63. # don't edit
  64. if __name__ == '__main__':
  65. ## three samples
  66. x = np.array([[12, 3, 7, 4], [3, 10, 4, 9], [9, 6, 2, 0]])
  67. target = np.array([0, 1, 2])
  68. num_class = 3
  69. ## learning rate of the gradient descent update rule
  70. learning_rate = 0.001
  71. ## one-hot label
  72. target = np.eye(num_class)[target]
  73. n, m = x.shape
  74. w = np.zeros([m, num_class])
  75. b = 0
  76. # three iterations of forward and backward
  77. for i in range(3):
  78. prediction = forward(w, b, x)
  79. loss = cross_entropy_loss(target, softmax(prediction))
  80. dw, db = backward(x, target, prediction)
  81. # update w and b
  82. w = w - learning_rate * dw
  83. b = b - learning_rate * db
  84. print("iter = {}, w = {}, b = {}, loss= {}".format(i, w, b, loss))
'
运行

初次的实验结果如下:

        可见按照定义写出函数时结果并不理想,因为在main代码中设置的参数权重都设置为0了,导致log以后数值无穷,导致内存溢出,且一般这样做的效果并不好,在Andrew Ng的DL课程中有对应的解释。

        把权重或者参数都初始化为0,那么梯度下降将不会起作用。把权重都初始化为0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。这个问题的解决方法就是随机初始化参数。把声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/910138

推荐阅读
相关标签