class Gao:
# 输入层、隐藏层、输出层的节点(数)
def __init__(self, n_i, n_h, n_o):
# 获取各层节点数量
self.n_i = n_i # 增加一个偏差节点
self.n_h = n_h
self.n_o = n_o
# 激活神经网络的所有节点 存储加权求和之后 对应 net
self.data_i = ones(self.n_i)
self.data_net_h = ones(self.n_h)
self.data_net_o = ones(self.n_o)
# 对应书上 y z
self.data_y = ones(self.n_h)
self.data_z = ones(self.n_o)
self.f0_net_k = ones(self.n_o)
self.delta_k = ones(self.n_o)
# 初始化权重矩阵
self.wi = random.random((self.n_h, self.n_i))
self.wo = random.random((self.n_h, self.n_o))
# 待更新缓存
self.delta_wi_temp = self.wi
self.delta_wo_temp = self.wo
def calculate_output(self, iggut):
# iggut layer
self.data_i = iggut
# in - hidden
self.data_net_h = dot(self.wi, self.data_i)
self.data_y = gg.array(list(map(tan_h, self.data_net_h)))
# self.data_y = self.data_y.reshape(-1, 1)
# hidden-output
self.data_net_o = dot(self.data_y, self.wo)
self.data_z = list(map(sigmoid, self.data_net_o))
return self.data_z # 输出
def BPBP(self, target, updata_flag, rate_1, rate_2):
# get 误差
error_t_k = target - self.data_z
for i in range(self.n_o):
self.f0_net_k[i] = diff_sigmoid(self.data_net_o[i])
self.delta_k = gg.multiply(self.f0_net_k, error_t_k)
data_y_temp = self.data_y.reshape(-1, 1)
delta_wo = dot(data_y_temp, self.delta_k.reshape(1, 3))
# -2 Layer Delta
epsilon = zeros(self.n_h).reshape(-1, 1)
for i in range(self.n_h):
epsilon[i] = multiply(self.delta_k, self.wo[i:i + 1][0]).sum()
# print(epsilon)
delta_wi = rate_2 * dot(epsilon, self.data_i.reshape(1, -1))
self.delta_wo_temp = self.delta_wo_temp + delta_wo
self.delta_wi_temp = self.delta_wi_temp + delta_wi
if updata_flag == 1:
# 测试即
self.wo = self.wo + rate_2 * delta_wo
# 测试self.wi = self.wi + rate_1 * delta_wi
error = 0.5 * dot((target - self.data_z), (target - self.data_z).reshape(-1, 1))
return error
def train(self, patterns, iggut_data, rate_1, rate_2): # 全部样本
stop_flag = 0
error_set = []
acc_set = []
step = 0
sample_len = len(patterns)
sample_num = 0
rate_temp = 0
# while stop_flag == 0:
for m in range(5000):
step += 1
updata_flag = 1
for p in patterns:
sample_num += 1
igguts = p[1:4].reshape(-1, 1)
targets = p[4:]
if sample_num == sample_len:
updata_flag = 1
self.calculate_output(igguts)
error = self.BPBP(targets, updata_flag, rate_1, rate_2)
rate = self.test(iggut_data)
rate_temp = rate_temp + rate
if step % 100 == 0:
error_set.append(error)
print('error', error, 'acc:', rate)

代码解释:

  1. 类定义: class Gao: 定义了一个名为 Gao 的类,用于表示神经网络模型。

  2. 初始化函数: def __init__(self, n_i, n_h, n_o): 初始化 Gao 类实例,接受输入层节点数 n_i、隐藏层节点数 n_h 和输出层节点数 n_o 作为参数。

  3. 数据存储: 该函数还初始化了用于存储网络状态的实例变量,例如 data_idata_net_hdata_net_o 等,并初始化权重矩阵 wiwo

  4. 计算输出函数: def calculate_output(self, iggut): 接受输入 iggut,并根据网络参数进行前向传播计算输出 self.data_z

  5. 反向传播函数: def BPBP(self, target, updata_flag, rate_1, rate_2): 接受目标值 target、更新标志 updata_flag 和学习率参数 rate_1rate_2。该函数根据误差计算权重更新量,并可选地更新权重。

  6. 训练函数: def train(self, patterns, iggut_data, rate_1, rate_2): 接受训练样本 patterns、测试数据 iggut_data 和学习率参数 rate_1rate_2。该函数进行多次迭代训练,并打印训练过程中的误差和准确率。

代码中的注释可能有些错误,但是大致上可以理解每行代码的作用。

注意:

  • 代码中使用了 onesdotgg.arraymapsigmoid 等函数,需要导入相应的库,例如 numpygg 等。
  • 代码中的 tan_hdiff_sigmoid 函数需要根据实际情况进行定义或导入。
  • 代码中的 test 函数需要根据实际情况进行定义,用于测试模型的性能。

建议:

  • 使用更具描述性的变量名,例如将 iggut 替换为 input_data
  • 在代码中添加更详细的注释,解释每个函数和变量的具体含义。
  • 使用代码格式化工具,使代码更易读。
  • 使用单元测试,验证代码的正确性。

希望以上信息能帮助你理解代码。

Python 神经网络实现 - Gao 类详解

原文地址: https://www.cveoy.top/t/topic/fM5H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录