深度学习入门——基于numpy(一)

深度学习入门——基于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
  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值