import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
plt.style.use('./deeplearning.mplstyle')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LeakyReLU
from tensorflow.keras.activations import linear, relu, sigmoid
%matplotlib widget
from matplotlib.widgets import Slider
from lab_utils_common import dlc
from autils import plt_act_trio
from lab_utils_relu import *
import warnings
warnings.simplefilter(action='ignore', category=UserWarning)
2-Relu激活
本周,引入了一种新的激活方式,即整流线性单元(ReLU)。
𝑎=𝑚𝑎𝑥(0,𝑧) # ReLU函数
plt_act_trio()


👆讲座中的例子展示了ReLU的应用。在本例中,派生的“感知”特征不是二进制的,而是具有连续的值范围。sigmoid最适合开/关或二进制情况。ReLU提供了连续的线性关系。此外,它还有一个输出为零的“关闭”范围。“关闭”功能使ReLU成为非线性激活。为什么需要这样做?让我们在下面检查一下。
为什么是非线性激活?

所示的函数由线性片段(分段线性)组成。斜率在线性部分期间是一致的,然后在过渡点处突然变化。在过渡点,添加一个新的线性函数,当添加到现有函数时,将产生新的斜率。新函数是在过渡点添加的,但对该点之前的输出没有贡献。非线性激活函数负责在转换点之前和之后禁用输入。下面的练习提供了一个更具体的例子。
该练习将在回归问题中使用以下网络,其中您必须对分段线性目标进行建模:
网络在第一层有3个单元。每个人将对目标的一部分负责。单元0被预先编程并固定为映射第一个段。您将修改第一单元和第2单元中的权重和偏差,以对第2段和第3段进行建模。输出单元也是固定的,并且简单地对第一层的输出求和。
使用下面的滑块,修改权重和偏移以匹配目标。提示:从w1和b1开始,让w2和b2为零,直到匹配第二个线段。点击比滑动更快。如果你有麻烦,别担心,下面的文字会更详细地描述这一点。
_ = plt_relu_ex()
未匹配前:

匹配第二个线段

匹配第三条直线:

本练习的目的是了解ReLU的非线性行为如何提供所需的能力,以关闭功能,直到需要为止。让我们看看这在这个例子中是如何工作的。

右边的图包含第一层中单位的输出。
从顶部开始,Unit 0负责标记为1的第一个段。两个线性函数𝑧以及ReLU之后的函数𝑎
如图所示。您可以看到ReLU在区间[0,1]之后截断了函数。这是关键,因为它可以防止干扰以下片段。
Unit 1负责第二段。在这里,ReLU使该单元保持安静,直到x为1之后。由于Unit 1 𝑤[1]1没有贡献,只是目标线的斜率。必须调整偏置以保持输出为负,直到x达到1。
Unit 2负责第三段。ReLU再次将输出归零,直到x达到正确的值。单元的坡度,𝑤[1]2
,必须设置为使得Unit 1和2的总和具有期望的斜率。再次调整偏置以保持输出为负,直到x达到2。
ReLU激活的“关闭”或禁用功能使模型能够将线性段缝合在一起,以对复杂的非线性函数进行建模。
====新材料结束=
新激活
本周推出了一种新的激活方式,即整流线性单元(ReLU)。
def plt_act_trio():
X = np.linspace(-5,5,100)
fig,ax = plt.subplots(1,3, figsize=(6,2))
widgvis(fig)
ax[0].plot(X,tf.keras.activations.linear(X))
ax[0].axvline(0, lw=0.3, c="black")
ax[0].axhline(0, lw=0.3, c="black")
ax[0].set_title("linear")
ax[1].plot(X,tf.keras.activations.sigmoid(X))
ax[1].axvline(0, lw=0.3, c="black")
ax[1].axhline(0, lw=0.3, c="black")
ax[1].set_title("sigmoid")
ax[2].plot(X,tf.keras.activations.relu(X))
ax[2].axhline(0, lw=0.3, c="black")
ax[2].axvline(0, lw=0.3, c="black")
ax[2].set_title("relu")
fig.suptitle("Common Activation Functions", fontsize=14)
fig.tight_layout(pad=0.2)
plt.show()
plt_act_trio()

右边的例子展示了ReLu的一个应用程序。在本例中,“感知”功能不是二进制的,但其范围从0到更大的值不等。sigmoid最适合开/关或二进制情况。ReLu提供了一个线性关系和一个输出为零的“关”范围。“关闭”功能使ReLu成为非线性激活。为什么需要这样做?让我们用下面的例子来检查一下。
X = np.linspace(0,2*np.pi, 100)
y = np.cos(X)+1
y[50:100]=0
fig,ax = plt.subplots(1,1, figsize=(2,2))
widgvis(fig)
ax.plot(X,y)
plt.show()

w10 = np.array([[-1]])
b10 = np.array([2.6])
d10 = Dense(1, activation = "linear", input_shape = (1,), weights=[w10,b10])
z10 = d10(X.reshape(-1,1))
a10 = relu(z10)
def plt_act1(y,z,a):
fig,ax = plt.subplots(1,3, figsize=(6,2.5)) #创建一个包含一行三列子图的图形对象 fig,并返回包含这些子图坐标轴的数组 ax。
widgvis(fig)
ax[0].plot(X,y,label="target")#在第一个子图中绘制了目标输出 y 的折线图,并设置了标签为 "target"。
ax[0].axvline(0, lw=0.3, c="black")#在第一个子图中添加了一条垂直于 x 轴的黑色虚线,位置在 x=0 处。
ax[0].axhline(0, lw=0.3, c="black")#在第一个子图中添加了一条水平于 y 轴的黑色虚线,位置在 y=0 处。
ax[0].set_title("y - target")#设置第一个子图的标题为 "y - target"。
ax[1].plot(X,y, label="target")
ax[1].plot(X,z, c=dlc["dldarkred"],label="z")#颜色为预定义的深红色
ax[1].axvline(0, lw=0.3, c="black")
ax[1].axhline(0, lw=0.3, c="black")
ax[1].set_title("z = wX+b")
ax[1].legend(loc="upper center")
ax[2].plot(X,y, label="target")
ax[2].plot(X,a, c=dlc["dldarkred"],label="ReLu(z)")
ax[2].axhline(0, lw=0.3, c="black")
ax[2].axvline(0, lw=0.3, c


1638

被折叠的 条评论
为什么被折叠?



