Python 神经网络实现 - Gao 类详解
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)
代码解释:
-
类定义:
class Gao:定义了一个名为 Gao 的类,用于表示神经网络模型。 -
初始化函数:
def __init__(self, n_i, n_h, n_o):初始化 Gao 类实例,接受输入层节点数n_i、隐藏层节点数n_h和输出层节点数n_o作为参数。 -
数据存储: 该函数还初始化了用于存储网络状态的实例变量,例如
data_i、data_net_h、data_net_o等,并初始化权重矩阵wi和wo。 -
计算输出函数:
def calculate_output(self, iggut):接受输入iggut,并根据网络参数进行前向传播计算输出self.data_z。 -
反向传播函数:
def BPBP(self, target, updata_flag, rate_1, rate_2):接受目标值target、更新标志updata_flag和学习率参数rate_1和rate_2。该函数根据误差计算权重更新量,并可选地更新权重。 -
训练函数:
def train(self, patterns, iggut_data, rate_1, rate_2):接受训练样本patterns、测试数据iggut_data和学习率参数rate_1和rate_2。该函数进行多次迭代训练,并打印训练过程中的误差和准确率。
代码中的注释可能有些错误,但是大致上可以理解每行代码的作用。
注意:
- 代码中使用了
ones、dot、gg.array、map、sigmoid等函数,需要导入相应的库,例如numpy、gg等。 - 代码中的
tan_h、diff_sigmoid函数需要根据实际情况进行定义或导入。 - 代码中的
test函数需要根据实际情况进行定义,用于测试模型的性能。
建议:
- 使用更具描述性的变量名,例如将
iggut替换为input_data。 - 在代码中添加更详细的注释,解释每个函数和变量的具体含义。
- 使用代码格式化工具,使代码更易读。
- 使用单元测试,验证代码的正确性。
希望以上信息能帮助你理解代码。
原文地址: https://www.cveoy.top/t/topic/fM5H 著作权归作者所有。请勿转载和采集!