深度学习入门基于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。