【小白必看】神经网络中的激活函数

深度学习入门基于Python的理论与实现笔记(二)

一、激活函数

激活函数的作用在于决定来激活输入信号的总和。

1.1 sigmoid函数

h ( x ) = 1 / ( 1 + e x p ( − x ) ) h(x)=1/(1+exp(-x)) h(x)=1/(1+exp(x))

1.2 sigmoid函数的代码实现

import numpy as np

def sigmoid(x):
    return 1/(1+np.exp(-x))

1.2 阶跃函数及实现

def step_function(x):
    if x <= 0:
        return 0
    else:
        return 1

def step_function(x):
    y = x > 0
    return y.astype(int)

1.3 绘制阶跃函数

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x>0, dtype=int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) #指定y轴范围
plt.show()    

1.4 绘制sigmoid函数

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return 1/(1+np.exp(-x))
    
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) #指定y轴范围
plt.show() 

1.5 sigmoid函数与阶跃函数的比较

sigmoid函数是一条平滑的曲线,输出随着输入发生连续性变化。
阶跃函数以0为界,输出发生急剧性的变化。
sigmoid函数与阶跃函数的共同点:两者均为非线性函数。

神经网络的激活函数必须是非线性函数。为什么不能使用线性函数呢?因为使用线性函数的话,加深神经网络的层数就没有意义了。

例子:这里我们考虑把线性函数 h ( x ) = c x h(x)=cx h(x)=cx作为激活函数,把 y ( x ) = h ( h ( h ( x ) ) ) y(x)=h(h(h(x))) y(x)=h(h(h(x)))的运算对应3层激活函数。这个运算会进行 y ( x ) = c × c × c × x y(x)=c×c×c×x y(x)=c×c×c×x的运算,但是同样的处理可以由 y ( x ) = a x y(x)=ax y(x)=ax来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。因此为了发挥叠加层所带来的优势,激活函数必须使用非线性函数。

1.6 ReLu函数

ReLu函数在输入大于0时,直接输出该值;在输入小于0时,直接输出0。

1.7 ReLu函数的实现

import numpy as np  
def relu(x):
    return np.maxium(x, 0)

二、三层神经网络的实现

一般地,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题可以使用softmax函数。

import numpy as np
def init_network():
    network={}
    network['w1']=np.array([0.1, 0.3, 0.5], [0.2, 0.4, 0.6])
    network['b1']=np.array([0.1, 0.2, 0.3])
    network['w2']=np.array([0,1, 0.4], [0.2, 0.5], [0.3, 0.6])
    network['b2']=np.array([0.1, 0.2])
    network['w3']=np.array([0.1, 0.3], [0.2, 0.4])
    network['b3']=np.array([0.1, 0.2])
    
    return network
    
    def forward(network, x):
        w1, w2, w3 = network['w1'], network['w2'], network['w3']
        b1, b2, b3 = network['b1'], network['b2'], network['b3']
        
        a1 = np.dot(x, w1) + b1
        a2 = np.dot(a1, w2) + b2
        a3 = np.dot(a2, w3) + b3
        y = a3
        
        return y
        
network = init_network()
x = np.array([1.0, 0.5])
y = network.forward(network, x)
print(y)

init_work()函数进行权重和偏置的初始化,并将他们保存在字典network中。forward()函数中则封装了将输入信号转为输出信号的处理过程。

2.1 softmax函数的实现

import numpy as np

def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a/sum_exp_a
    
    return y
    
a = np.array([0.3, 2.9, 4.0])    
exp_a = np.exp(a)
print(exp_a)
sum_exp_a = np.sum(exp_a)
y = exp_a/sum_exp_a
print(y)

2.2 softmax函数的特征

softamx函数的输出是0.0-1.0之间的实数。并且softmax的输出值的总和是1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值