深度学习入门——基于numpy(一)
说明:本次练习代码均来自斋藤康毅的《深度学习入门》 ,全文不依赖其他框架,只基于numpy来构建深度学习网络。
一、激活函数
说明:激活函数相当于是神经网络的神经元,他们根据输入信号,反馈输出信号。因此不同类型的激活函数会构建成不同类型、不同敏感度的神经网络。
# 导入包
import numpy as np
# 导入作图包
import matplotlib
import matplotlib.pylab as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
plt.rcParams['axes.unicode_minus'] = False
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
# 激活函数,阶跃函数
def step_function(x):
return np.array(x>0, dtype=np.int)
# 激活函数,连续型,每一处导数均不为0,因此每一个x值都有一个方向以及程度上的反馈信号,因此可以通过反馈信号,不断更新我们的x,而阶跃函数不具有此性质
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.arange(-5,5,0.2)
# 画出阶跃函数
y1=step_function(x)
plt.plot(x,y1)
plt.show()
# 画出sigmoid函数
y2=sigmoid(x)
plt.plot(x,y2)
plt.show()
# relu函数
def relu(x):
return np.maximum(0,x)
y3=relu(x)
plt.plot(x,y3)
plt.show()
二、输出层
说明:神经网络一般有输入层、中间层(也叫隐藏层)、输出层构成。输出层负责获得最终的计算结果,一般是一个概率值。
# softmax函数,可将任意范围的数转换到值域[0,1],因此适合作为输出结果的概率函数。
def softmax(x):
if x.ndim == 2:
x = x.T # 转置后一行表示一个特征向量
x = x - np.max(x, axis=0) # 在该特征向量上,每个特征值减去最大的特征值
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T # 计算完后再转置回来,每行表示一个样本
x = x - np.max(x) # 溢出对策
return np.exp(x) / np.sum(np.exp(x))
x=np.array([10,20,40]) #x.ndim=1
print(softmax(x))
x=np.array([[20,2,3],[40,3,1]]) # x.ndim=2
print(softmax(x))
[9.35762295e-14 2.06115362e-09 9.99999998e-01]
[[9.99999943e-01 1.52299789e-08 4.13993748e-08]
[1.00000000e+00 8.53304763e-17 1.15482242e-17]]
三、损失函数
说明:神经网络需要更新神经元之间连接的权重参数,以使得最终网络预测的结果与真实结果是相近的。因此,整个网络需要有一个优化目标来更新这些参数,我们一般定义计算的结果与真实结果的差异作为优化的目标。这种差异可以有多种定义方式,比如误差、均方误差、交叉熵等。
# 损失函数,均方误差,y为神经网络的输出,t为真实标签
def mean_squared_error(y,t):
return 0.5 * np.sum((y-t)**2)
# 损失函数,交叉熵,y为神经网络的输出,t为真实标签,若t为one-hot编码,假设结果标签是数字1-5的值,则[0,1,0,0,0]表示这个样本的真实值是2。因此t为0的元素其交叉熵也为0,可用t*np.log(y+1e-7)来计算
def cross_entropy_error_onehot(y,t):
if y.ndim==1:
t=t.reshape(1,t.size) # 1行,t.size列
y=y.reshape(1,y.size)
batch_size=y.shape[0] # y的行数
return -np.sum(t*np.log(y+1e-7))/batch_size # 除以batch_size是为了归一化,得到数据的平均交叉熵误差
# 示例数据,y 为(batch_size,3),t为(batch_size,3), batch_size表示样本数,此处为4,3则表示有3种结果
y=np.array([[1,0,0],[0,1,0],[1,0,0],[0,0,1]])
t=np.array([[1,0,0],[0,1,0],[1,0,0],[0