MPL中的梯度下降函数与后向传播函数应该怎么写

时间: 2024-04-24 20:26:17 浏览: 12
在多层感知机(Multilayer Perceptron)中,梯度下降和后向传播是密切相关的。下面是一个示例,展示了如何在 MultilayerPerceptron 类中实现梯度下降函数和后向传播函数: ```python import numpy as np class MultilayerPerceptron: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重和偏置 self.weights1 = np.random.randn(self.input_size, self.hidden_size) self.bias1 = np.zeros((1, self.hidden_size)) self.weights2 = np.random.randn(self.hidden_size, self.output_size) self.bias2 = np.zeros((1, self.output_size)) def forward(self, X): # 前向传播 self.z1 = np.dot(X, self.weights1) + self.bias1 self.a1 = np.tanh(self.z1) self.z2 = np.dot(self.a1, self.weights2) + self.bias2 self.a2 = self.z2 return self.a2 def backward(self, X, y, learning_rate): m = X.shape[0] # 计算输出层的梯度 delta2 = self.a2 - y dw2 = 1/m * np.dot(self.a1.T, delta2) db2 = 1/m * np.sum(delta2, axis=0) # 计算隐藏层的梯度 delta1 = np.dot(delta2, self.weights2.T) * (1 - np.power(self.a1, 2)) dw1 = 1/m * np.dot(X.T, delta1) db1 = 1/m * np.sum(delta1, axis=0) # 参数更新 self.weights2 -= learning_rate * dw2 self.bias2 -= learning_rate * db2 self.weights1 -= learning_rate * dw1 self.bias1 -= learning_rate * db1 def gradient_descent(self, X, y, epochs, learning_rate): for epoch in range(epochs): # 前向传播 output = self.forward(X) # 反向传播和参数更新 self.backward(X, y, learning_rate) # 计算损失 loss = np.mean(np.square(output - y)) # 打印每个epoch的损失 if epoch % 100 == 0: print(f"Epoch {epoch}: Loss = {loss}") ``` 在上述示例中,`backward` 函数实现了后向传播过程,根据输出层的梯度 `delta2` 和隐藏层的梯度 `delta1` 来计算参数的梯度。然后,通过梯度下降法更新参数。`gradient_descent` 函数实现了梯度下降过程,它在每个epoch中进行前向传播、反向传播和参数更新,并计算损失。 请注意,示例中使用的是均方误差作为损失函数,如果您希望使用其他损失函数,可以相应地修改损失的计算方法。另外,示例代码中的激活函数使用的是双曲正切函数(tanh),您也可以根据需要选择其他激活函数。

相关推荐

#外点法(能运行出来) import math import sympy import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D plt.ion() fig = plt.figure() ax = Axes3D(fig) def draw(x,index,M): # F = f + MM * alpha # FF = sympy.lambdify((x1, x2), F, 'numpy') Z = FF(*(X, Y,M)) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow',alpha=0.5) ax.scatter(x[0], x[1], FF(*(x[0],x[1],M)), c='r',s=80) ax.text(x[0], x[1], FF(*(x[0],x[1],M)), 'here:(%0.3f,%0.3f)' % (x[0], x[1])) ax.set_zlabel('F') # 坐标轴 ax.set_ylabel('X2') ax.set_xlabel('X1') plt.pause(0.1) # plt.show() # plt.savefig('./image/%03d' % index) plt.cla() C = 10 # 放大系数 M = 1 # 惩罚因子 epsilon = 1e-5 # 终止限 x1, x2 = sympy.symbols('x1:3') MM=sympy.symbols('MM') f = -x1 + x2 h = x1 + x2 - 1 # g=sympy.log(x2) if sympy.log(x2)<0 else 0 g = sympy.Piecewise((x2-1, x2 < 1), (0, x2 >= 1)) # u=lambda x: alpha = h ** 2 + g ** 2 F = f + MM * alpha # 梯度下降来最小化F def GD(x,M,n): # F = f + M * alpha # delta_x = 1e-11 # 数值求导 # t = 0.0001 # 步长 e = 0.001 # 极限 # my_print(e) np.array(x) for i in range(15): t = sympy.symbols('t') grad = np.asarray( [sympy.diff(F, x1).subs([(x1, x[0]), (x2, x[1]),(MM,M)]), sympy.diff(F, x2).subs([(x1, x[0]), (x2, x[1]),(MM,M)])]) # print('g',grad) # print((x-t*grad)) # print(F.subs([(x1,(x-t*grad)[0]),(x2,(x-t*grad)[1])])) t = sympy.solve(sympy.diff(F.subs([(x1, (x - t * grad)[0]), (x2, (x - t * grad)[1]),(MM,M)]), t), t) print('t',t) x = x - t * grad print('x', x) # print('mmm',M) draw(x,n*10+i,M) # my_print(np.linalg.norm(grad)) # print(type(grad)) if (abs(grad[0]) < e and abs(grad[1]) < e): # print(np.linalg.norm(grad)) print('g', grad) break return list(x) pass x = [-0.5, 0.2] X = np.arange(0, 4, 0.25) Y = np.arange(0, 4,

最新推荐

recommend-type

keras 自定义loss损失函数,sample在loss上的加权和metric详解

在keras中实现自定义loss, 可以有两种方式,一种自定义 loss function, 例如: # 方式一 def vae_loss(x, x_decoded_mean): xent_loss = objectives.binary_crossentropy(x, x_decoded_mean) kl_loss = - 0.5 * ...
recommend-type

Python的mpl_finance模块从2020年已经提醒弃用,新mplfinance模块详解(一)

python中调用mpl_finance已经出现警告: ================================================================= WARNING: `mpl_finance` is deprecated: Please use `mplfinance` instead (no hyphen, no un
recommend-type

js 开发之autocomplete=”off”在chrom中失效的解决办法

js 开发之autocomplete=”off”在chrom中失效的解决办法 问题:在表单的输入框中,有时候我们并不希望点击输入框时,会出现提示信息。这时,在输入框中添加属性:autocomplete=”off”,一般能达到目的。而在chrom...
recommend-type

z-blog模板网站导航网站源码 带后台管理.rar

z-blog模板网站导航网站源码 带后台管理.rarz-blog模板网站导航网站源码 带后台管理.rar
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依