神经网络:多变量反向传播求解问题py代码实现

问题描述:

神经网络:多变量反向传播求解问题py代码实现

神经网络要解决的经典问题就是黑盒测试猜数的过程:

  1. 通过输入值、输出值和期望值之间比较。
  2. 通过损失函数的计算误差值,误差值不理想
  3. 通过反向传播调整输入值。
  4. 反复此过程执行步骤1,直至损失函数误差值无限逼近期望误差结束。

例子,多变量反向传播:我们假设x=2a+3b,y=2b+1,z=x*y
那么当a和b为多少时,可以使期望值z=150?

解决方案:

我们先猜测a,b一个大致的值,使期望值接近150,设a=3,b=4.

  1. 当a=3,b=4,时,我们得到z=162.
  2. 损失函数我们设定为:delte_z=150-z
  3. 我们发现delte_z=-12,进行多变量反向传播调整a和b,利用sympy中diff函数求偏导,并计算delte_a,delte_b,通过反向传播调整a,b。
  4. 再次执行1-3步,循环5次,发现神奇的效果;

公式如下:

  1. 分别对a,b求偏导,带入a=3,b=4的值.
  2. 设置a和b的权重都是0.5.计算delte_a和delte_b
    计算delte

代码实现:

注意:

  1. 注意全局变量和函数局部变量
  2. 注意公式中符号问题
  3. 注意使用sympy时,对公式中参数赋值,先Symbol声明可替换字符,再diff求偏导,再subs赋值。
from sympy import *


# 求解x=2a+3b y=2b+1 z=x*y;输入a和b为34,期望z输出150

def xy_z(a, b):
    x = 2 * a + 3 * b
    y = 2 * b + 1
    z = x * y
    return z


def pd_xy(a1, b1, delta_z):
    # 替换变量也可以写为x,y = symbols('x y')
    a,b=0,0
    a = Symbol('a')  # 声明a是subs可替换的量
    b = Symbol('b')  # 声明b是subs可替换的量
    z = (2 * a + 3 * b) * (2 * b + 1)
    za = diff(z, a).subs(b, b1)  # 对a求偏导
    zb = diff(z, b).subs([(a, a1), (b, b1)])  # 对b求偏导
    delta_a = delta_z * 0.5 / za
    delta_b = delta_z * 0.5 / zb
    print(delta_a,delta_b)
    return delta_a, delta_b


a, b = 3, 4
delta_a, delta_b = 0,0
for i in range(5):
    a = a + delta_a
    b = b + delta_b
    z = xy_z(a, b)
    print(a,b)
    print(z)
    delta_z = 150 - z
    delta_a, delta_b = pd_xy(a, b, delta_z)


运行结果分析:

5次迭代已经找到合适的a和b的值。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

求索永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值