1. 程式人生 > >程式碼實現 Identity啟用函式視覺化

程式碼實現 Identity啟用函式視覺化

漸近恆等變換,節點輸入等於節點輸出,不會隨著深度的增加而發生顯著的變化,神經網路會更加穩定,梯度更容易回傳。

公式:

                                                                                     f(x) = x

                 (-\infty,\infty)

微分求導

                                                                                     f(x)' = 1

 

Identity 啟用函式的特點,符合了部分潛在行為是線性的。與非線性矛盾,但是不影響它在(迴歸任務)最後的輸出上,使用它。

視覺化:紅色線為原函式, 藍色線為導數

                          

視覺化程式碼實現:

import math
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.axisartist as axisartist

# 以類實現
class Identity:
    # 原函式
    def forward(self, w_input):
        return w_input
    # 導數
    def backward(self, output):
        # 在此例子中,需轉換為相同的形狀,其實都是返回 1
        # return 1
        out = np.copy(output)
        out[:] = 1
        return out
    
def Axis(fig, ax):
    #將繪圖區物件新增到畫布中
    fig.add_axes(ax)
    # 隱藏座標抽
    ax.axis[:].set_visible(False)
    # new_floating_axis 建立新的座標
    ax.axis["x"] = ax.new_floating_axis(0, 0)
    # 給 x 軸建立箭頭線,大小為1.0
    ax.axis["x"].set_axisline_style("->", size = 1.0)
    # 給 x 軸箭頭指向方向
    ax.axis["x"].set_axis_direction("top")
    # 同理,建立 y 軸
    ax.axis["y"] = ax.new_floating_axis(1, 0)
    ax.axis["y"].set_axisline_style("->", size = 1.0)
    ax.axis["y"].set_axis_direction("right")

# 返回間隔均勻的100個樣本,計算間隔為[start, stop]。
x =  np.linspace(-5, 5, 100)
y_forward = Identity().forward(x)
y_backward = Identity().backward(x) 

#建立畫布
fig = plt.figure(figsize=(12, 12))

#建立繪圖物件ax
ax = axisartist.Subplot(fig, 111)
Axis(fig, ax)

# 設定x, y軸範圍
plt.ylim((-5, 5))
plt.xlim((-5, 5))

# 原函式,forward function
plt.plot(x, y_forward, color='red', label='forward function')
plt.legend()

# 導數, backward function
plt.plot(x, y_backward, color='blue', label='backward function')
plt.legend()

plt.show()