一 Python入门
1.1 NumPy
在深度学习的实现中,经常出现数组和矩阵的计算。NumPy的数组类中提供了很多便捷的方法。实践内容如下:
- 导入NumPy库
- 生成NumPy数组
- NumPy的算术运算
- 广播
- 访问元素
import numpy as np
x = np.array([1, 2, 3])
y = np.array([[0, 1, 0],
[1, 2, 1],
[0, 2, 1]])
print(x)
print(y)
z = x * y
print(z)
i = 10
q = y * i
print(q)
print(x[0])
[1 2 3]
[[0 1 0]
[1 2 1]
[0 2 1]]
[[0 2 0]
[1 4 3]
[0 4 3]]
[[ 0 10 0]
[10 20 10]
[ 0 20 10]]
1
1.2 Matplotlib
在深度学习的实现中,图形的绘制和可视化非常重要。Matplotlib是用于绘制图形的库,使用Matplotlib.pyplot可以轻松绘制图形并实现数据的可视化。实践内容如下:
- 绘制sin&cos函数图像
- pyplot的其它功能
- 显示图像
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle="--", label="cos")
plt.xlabel("x")
plt.ylabel("y")
plt.title("sin & cos")
plt.legend()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.image import imread
img = imread('dataset\\lena.png')
plt.imshow(img)
plt.show()
二 感知机
2.1 感知机简介
感知机接收多个信号,输出一个信号,输入信号被送往感知机时,会被分别乘以固定的权重,感知机计算传送过来的信号总和,当总和超过一个界限值(阈值)时,感知机输出信号1(传递信号)。
y = { 0 if w 1 x 1 + w 2 x 2 < θ 1 if w 1 x 1 + w 2 x 2 ≥ θ y = \begin{cases} 0 & \text{if } w_{1}x_{1}+w_{2}x_{2} < \theta \\ 1 & \text{if } w_{1}x_{1}+w_{2}x_{2} \geq \theta \end{cases} y={
01if w1x1+w2x2<θif w1x1+w2x2≥θ
其中 y y y代表输出信号, x 1 , x 2 x_{1},x_{2} x1,x2分别代表两个输入信号, w 1 , w 2 w_{1},w_{2} w1,w2为输入信号的权重, θ \theta θ为阈值。
2.2 简单逻辑电路
通过编写函数实现简单逻辑电路中的与门、非门、与非门、或门。
import numpy as np
# 与门
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
# 非门
def NOT(x1):
b = 0.7
tmp = -x1+b
if tmp <= 0:
return 0
else:
return 1
# 与非门
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
对于感知机而言,异或门无法直接表示,但是感知机可以通过“叠加层”来表示异或门,通过叠加的方法,利用已有的与门、或门和非门,可以巧妙地实现异或门。
# 异或门
def XOR(x1, x2):
x_n1 = NOT(x1)
x_n2 = NOT(x2)
x3 = AND(x2, x_n1)
x4 = AND(x1, x_n2)
tmp = OR(x3, x4)
return tmp
print(XOR(1, 1))
Plus:异或门的实现可能会有不同方法,在此列举的为本人在Turing Complete上实现的方法。
三 神经网络
3.1 阶跃函数
在第二节感知机中我们了解到:当输入信号的加权和达到阈值时,输出信号将被激活。这时,将阈值移项不等式左边,令 b = − θ b=-\theta b=−θ,记 b b b为偏置,令 a = b + w 1 x 1 + w 2 x 2 a=b+w_{1}x_{1}+w_{2}x_{2} a=b+w1x1+w2x2,则有阶跃函数:
y = { 0 if a < 0 1 if a ≥ 0 y = \begin{cases} 0 & \text{if } a < 0 \\ 1 & \text{if } a \geq 0 \end{cases} y={
01if a<0if a≥0
import numpy as np
import matplotlib.pyplot as plt
def step_function(a):
return np.array(a > 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()
3.2 sigmoid激活函数
令 y = h ( a ) y=h(a) y=h(a),称 h ( ) h() h()为激活函数, a a a为自变量参数。对于神经网络中常用的激活函数 s i g m o i d sigmoid sigmoid而言,其激活函数表达式为:
h ( x ) = 1 1 + e x p ( − x ) h(x)=\frac{1}{1+exp(-x)} h(x)=1+exp(−x)1
def sigmoid(a):
return 1 / (1 + np.exp(-a))
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()
3.3 softmax函数
分类问题中使用的softmax函数可以用下式表示:
y = e x p ( a k ) ∑ i = 1 n e x p ( a i ) y=\frac{exp(a_{k})}{\sum\limits_{i=1}^{n}exp(a_{i})} y=i=1∑