为什么relu函数可以拟合非线性函数

吴恩达C2_W2 课程2周数2有讲:

y = relu(w1*x+b1)+relu(w2*x+b2)+...+relu(wn*x+bn)

简陋的代码:

import copy
import math

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider,Button

# 输入n个relu的叠加
n = 8
# 初始化参数
w = np.zeros(n)
b = np.zeros(n)
sliders = []


# 返回n叠加relu函数
def relu(n):
    def n_relu(x):
        res = copy.deepcopy(x)
        # max和maximum有区别
        # numpy广播,relu(w1*x1+b1)+relu(w2*x1+b2),x.T*w+b,然后取0求和
        res = x.reshape((-1,1))*w+b
        res[res < 0] = 0
        # print(res<0) res<0是一个bool数组 数组可以根据bool数组进行筛选操作再对元素进行处理

        res = np.sum(res,axis=1)
        return res

    return n_relu


# 获取n叠加relu函数
f = relu(n)
# 主图
fig, ax = plt.subplots(figsize=(8, 18))
plt.subplots_adjust(bottom=0.5)
x_axis = np.linspace(-1, 20, 1000)
line, = ax.plot(x_axis, f(x_axis), lw=2)
ax.set_ylim(-1, 100)



# 更新函数
def update(val):
    for i, s in enumerate(sliders):
        index = math.floor(i / 2)
        if i % 2 == 0:
            # python中整数乘以整数是浮点数
            w[index] = s.val
        else:
            b[index] = s.val
    line.set_ydata(f(x_axis))
    fig.canvas.draw_idle()

def reset(e):
    global w,b
    w = np.zeros(n)
    b = np.zeros(n)
    for s in sliders:
        s.val = 0
    line.set_ydata(f(x_axis))
    # redraw
    fig.canvas.draw_idle()

for i in range(n):
    w_ = plt.axes([0.15, 0.01 + i * 0.06, 0.65, 0.01])
    w_slider = Slider(
        ax=w_,
        label=f'$w_{i}$',
        valmin=-10,
        valmax=10,
        valinit=0,
        valstep=0.01
    )
    w_slider.on_changed(update)
    sliders.append(w_slider)
    b_ = plt.axes([0.15, 0.04 + i * 0.06, 0.65, 0.01])
    b_slider = Slider(
        ax=b_,
        label=f'$b_{i}$',
        valmin=-20,
        valmax=20,
        valinit=0,
        valstep=0.01
    )
    b_slider.on_changed(update)
    sliders.append(b_slider)

b_ = plt.axes([0.15,0.95,0.08,0.03])
btn = Button(ax=b_,label="reset")
btn.on_clicked(reset)
plt.show()

16参数拟合非线性函数(发现图像是由很多个直线片段连接起来的):

总结:想一下relu层是n个神经元,那么relu层的输出即下一层的输入不就是

 [relu(w1*x+b1),relu(w2*x+b2),...,relu(wn*x+bn)]

吗?假如下一层是线性层,那么其中一个神经元的输出不就是w_1*relu(w1*x+b1)+b_1+...+w_n*relu(w1*x+b1)+b_n,不就达到非线性的效果了吗

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值