1、 问题描述及实验要求
(1)写出包含单隐层的正向和反向推倒过程
(2)画出网络结构图
(3)完成算法代码(要求体现推倒过程,也可采用tensorflow完成)
(4)画出误差随迭代次数变化曲线、测试数据图
(5)尝试不同激活函数和隐含层神经元数目,研究其对精度的影响并分析
2、 推导过程
3、 网络结构图
4、 算法代码
import numpy as np import matplotlib.pyplot as plt import random from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] x = np.linspace(1, np.pi / 2, 10) y = 2 * np.sin(x) - 0.7 x_test = np.random.random(10) * (np.pi / 2 - 1) + 1 y_test = 2 * np.sin(x_test) - 0.7 plt.scatter(x, y, marker='o') plt.scatter(x_test, y_test, marker='+') plt.title('训练集:红点,测试集:加号') plt.show() hide = 10 # 隐藏层神经元个数 W1 = np.random.random((hide, 1)) # 权重 B1 = np.random.random((hide, 1)) # 偏置 W2 = np.random.random((1, hide)) B2 = np.random.random((1, 1)) learningrate = 0.005 # 学习率 iteration = 10000 # 迭代次数 def sigmoid(x): return 1 / (1 + np.exp(-x)) E = np.zeros((iteration, 1)) # 存放误差 Y = np.zeros((10, 1)) # 存放训练结果 for k in range(iteration): temp = 0 for i in range(10): hide_in = np.dot(x[i], W1) - B1 hide_out = np.zeros((hide, 1)) for j in range(hide): hide_out[j] = sigmoid(hide_in[j]) y_out = np.dot(W2, hide_out) - B2 Y[i] = y_out e = y_out - y[i] dB2 = -1 * learningrate * e dW2 = e * learningrate * np.transpose(hide_out) dB1 = np.zeros((hide, 1)) for j in range(hide): dB1[j] = np.dot(np.dot(W2[0][j], sigmoid(hide_in[j])), (1 - sigmoid(hide_in[j])) * (-1) * e * learningrate) dW1 = np.zeros((hide, 1)) for j in range(hide): dW1[j] = np.dot(np.dot(W2[0][j], sigmoid(hide_in[j])), (1 - sigmoid(hide_in[j])) * x[i] * e * learningrate) W1 = W1 - dW1 B1 = B1 - dB1 W2 = W2 - dW2 B2 = B2 - dB2 temp = temp + abs(e) E[k] = temp plt.scatter(x, y, c='r') plt.plot(x, Y) plt.title('训练集:红点,训练结果:蓝线') plt.show() plt.scatter(x_test, y_test, c='y', marker='+') plt.plot(x, Y) plt.title('测试集:加号,训练结果:蓝线') plt.show() xx = np.linspace(0, iteration, iteration) plt.plot(xx, E) plt.title('训练误差随迭代次数趋势图')
5、 实验结果
实验结果截图:
图1-散点图观察训练集与测试集
图2-训练集与训练结果
图3-测试集与训练结果
图4-误差分析
6、 算法分析
不同激活函数对实验结果的影响误差不大,但是随着隐含神经元数目、迭代次数的增加,实验结果会越来越准确,越趋近于函数。