当前位置:   article > 正文

深度学习入门-神经网络_深度学习神经网络 入门

深度学习神经网络 入门

深度学习入门-神经网络

1、神经网络与感知机

​ 感知机对于复杂的处理,理论上是可以将其表示出来的,但是确定其合适的权重,还是需要人工干预。该工作往往是复杂且庞大的,神经网络的出现就是为了解决这个问题的。具体地讲,神经网络的一 个重要性质是它可以自动地从数据中学习到合适的权重参数。

image-20220612102057751

2、感知机函数的新形式

image-20220612103921621
y = h ( b + w 1 x 1 + w 2 x 2 ) y = h(b+w_1x_1+w_2x_2) y=h(b+w1x1+w2x2)

h ( x ) = { 0 ( x ≤ 0 ) 1 ( x > 0 ) h(x) =

{0(x0)1(x>0)
h(x)={01(x0)(x>0)

3、激活函数

​ 上文中的h(x)函数会将输入信号的总和转换为输出信号,这种函数 一般称为激活函数。如“激活”一词所示,激活函数的 作用在于决定如何来激活输入信号的总和。激活函数是连接感知机和神经网络的 桥梁。

image-20220612111408122

​ 形如h(x) 的称为阶跃函数,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。

3.1、sigmoid函数

h ( x ) = 1 1 + e x p ( − x ) h(x)=\frac{1}{1+exp(-x)} h(x)=1+exp(x)1

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return np.array(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

image-20220613103013350

3.2、阶跃函数
import numpy as np
import matplotlib.pylab as plt

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

x = np.arange(-5.0, 5.0, 0.1) #在−5.0到5.0的范围内,以0.1为单位,生成NumPy数组([-5.0, -4.9, ..., 4.9])
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

image-20220612155430167

3.3、ReLU函数

h ( x ) = { 0 ( x ≤ 0 ) x ( x > 0 ) h(x) =

{0(x0)x(x>0)
h(x)={0x(x0)(x>0)

import numpy as np
import matplotlib.pylab as plt

def relu(x):
    return np.maximum(0,x)

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

image-20220613105721693

3.4、为什么激活函数不能用线性函数

​ 线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无 隐藏层的神经网络”。为了具体地(稍微直观地)理解这一点,我们来思 考下面这个简单的例子。这里我们考虑把线性函数 h(x) = cx 作为激活 函数,把y(x) = h(h(h(x)))的运算对应3层神经网络A。这个运算会进行 y(x) = c × c × c × x的乘法运算,但是同样的处理可以由y(x) = ax(注意, a = c^3)这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示, 使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥叠加层所 带来的优势,激活函数必须使用非线性函数。

4、三层神经网络的实现

第一层实现如下

image-20220613161536321

image-20220613161634123

代码

import numpy as np

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

X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])

A1 = np.dot(X, W1) + B1
Z1 = sigmoid(A1)

print(A1)
print(Z1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

​ 第二层和第三层的构造及实现与第一层类似,不做赘述。

三层完整的代码实现

import numpy as np

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

def identity_function(x):
    return x

def init_network(): #进行权重和偏置的初始化
    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
    z1 = sigmoid(a1)
    a2 = np.dot(z1,W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2,W3) + b3
    y = identity_function(a3)
    
    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

5、softmax函数

输 出 层 共 有 n 个 神 经 元 , 计 算 第 k 个 神 经 元 的 输 出 : y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) 输出层共有n个神经元,计算第k个神经元的输出: y_k = \frac{exp(a_k)}{ \sum_{i=1}^{n}{exp(a_i)}} nkyk=i=1nexp(ai)exp(ak)

def softmax(a):
    exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y
  • 1
  • 2
  • 3
  • 4
  • 5
5.1、softmax函数可进行如下改造

image-20220615092129746

​ 上式说明,在进行softmax的指数函数的运算时,加上(或者减去) 某个常数并不会改变运算的结果。这里的C 可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值。

代码实现

def softmax(a):
    exp_a = np.exp(a - np.max(a))
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    return y
  • 1
  • 2
  • 3
  • 4
  • 5

​ softmax函数的输出是0.0到1.0之间的实数。并且,softmax 函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正 因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/280784
推荐阅读
  

闽ICP备14008679号