title: 神经网络学习(1)
神经网络基础学习(1)
一、NumPy库介绍
1.导入NumPy库
NumPy库是python的外部库,NumPy库给我们提供了许多高效简单的方法来进行深度学习中对数组和矩阵的操作,首先通过以下代码来引入NumPy库
import numpy as np
这样我们就讲numpy库以np的形式导入
2.NumPy库的基本操作
首先我们先学会去生成一个numpy数组
>>>A = np.array([[1, 2], [3, 4]])
>>>print(A)
[[1 2]
[3 4]]
>>>A.shape
(2, 2)
>>>A.dtype
dtype('int64')
这里我们创建一个2*2的矩阵A。另外,我们通过shape函数可以来查看矩阵的形状,矩阵里元素的数据类型可以通过dtype函数来查看,接下来看一下矩阵之间的运算
>>>B = np.array([[3, 0], [0, 6]])
>>>A + B
array([[4, 2],
[3, 10]])
>>>A * B
array([[3, 0],
[0, 24]])
和数组的算术运算相同,矩阵的算术运算也可以在相同形状的矩阵间以对应元素的方式进行,更重要的是,numpy矩阵可以通过广播的形式来进行单一数值对矩阵的算术运算,如下
>>>print(A)
[[1 2]
[3 4]]
>>>A * 10
array([[10, 20],
[30, 40]])
至此,关于nump库最简单的函数介绍完毕,另外一些函数下面碰见的时候会接着介绍
二、感知机
1.感知机is what?
感知机是个什么玩意?上图就是一个非常简单的接受两个输入信号的**感知机。图中X1与X2是输入信号**,y是输出信号,w1与w2表示权重。图中的〇称为”神经元“或者“节点“。
感知机中传递信号也是相当明了,直接将输入值x乘上权重w传送至y,但首先我们得引进“阀值”这个概念,感知机中的y输出是只有1/0两种取值,所以我们要规定一个界线来判断y输出1还是0,我们通常用θ来表示阀值
2.感知机的简单应用
接着,我们用感知机来实现一些简单的应用,例如去完成简单逻辑电路的门电路的功能
在此之前,我们再引入偏置的概念,观察下式
(2)式与(1)式相比,只是将(1)式中的阀值移动到式子的左边,我们将b称为偏置,这一步操作有利于接下来神经网络搭建时函数的定义
OK,我们已经把感知机的基础内容全部介绍完毕,接着我们先来实现与门
(1)与门
我们在高中就已经学习过只有当所有的输入值满足高电平的时候,输出才是高电平,所以我们理所当然的得到了以下的代码
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
现在我们来解读以上的代码,其中权重w1与w2都是0.5,偏置是 -0.7(我们可以理解为二极管的导通电压为0.7V),说明只有当上一层的加权和超过0.7,下一层的神经元才能被激活,例如
>>>AND(1, 1)
1
>>>AND(1, 0)
0
>>>AND(0, 0)
0
(2)与非门&或门
接着我们按照相同的思路来完成与非门、或门的代码
# 与非门
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
# 或门
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
与非门、与门、或门都是相同的原理,所以我们仅需要改变感知机中的权重与偏置的值
3.多层感知机(异或门的实现)
上面我们成功实现了几个简单的门电路,但当我们想用单个感知机来实现异或门的功能,就瞬间傻眼了,在这里我们需要多层感知机配合来实现异或门的功能
我们先写出异或门的表达式(下图)
根据上图,我们可以通过3个感知机来实现异或门
# 异或门
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
二、神经网络(从感知机到神经网络)
1.激活函数
上面我们介绍了什么是感知机,现在我们可以正式踏步进入神经网络的学习,我知道你现在很急,但你先别急,按照传统,我们再引入一个新的概念:激活函数
看上图,我们在感知机的基础上,我们将输出的神经元再进行细分,其中的a就表示上一层的加权和,y表示向后一层神经层传输的值,而连接a和y的函数我们称为激活函数
2.sigmoid函数
sigmoid函数是一个很常见的激活函数,式子如下
用python我们可以写成
# sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
>>>x = np.array([-1.0, 1.0, 2.0])
>>>sigmoid(x)
array([0.26894142, 0.73105858, 0.88079708])
我们运用Matplotlib库来画出sigmoid函数图像
sigmoid函数是一条平滑的曲线,输出会随着输入连续性变化。sigmoid函数的平滑性对神经网络的学习具有重要意义
对于感知机这种只能输出1/0的函数,我们称为阶跃函数,sigmoid函数可以返回0.114514, 0.314159, 0.8878……等实数。感知机中流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号,为了充分发挥多层神经网路的优势,我们在选择激活函数的时候必须使用非线性函数
3.ReLu函数
介绍完sigmoid函数,我们再来介绍另一个目前使用非常广泛的激活汗水——ReLu函数
ReLu函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0
ReLu函数是一个非常简单的函数,所以在实现的时候也很方便,可以写成下面形式
def relu(x):
return np.maximum(0, x)
至此,我们介绍完了有关神经网络的基础函数和概念,下一节会讲到在神经网络中,数据究竟是怎样进行传输和计算
おめでとうございます
编辑者:Ice Man