吴恩达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,不就达到非线性的效果了吗