神经网络介绍
网络结构
我们把最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。中间层有时也称为隐藏层。如图,3 层神经网络:输入层(第 0 层)有 2 个神经元,第 1 个隐藏层(第 1 层)有 3 个神经元,第 2 个隐藏层(第 2 层)有 2 个神经元,输出层(第 3 层)有 2 个神经元。
上图中节点“1”表示偏置,节点a1(1)的计算公式为:
每一层之间信息传递:多维数组的计算
神经网络的每一层,都以多维数组表示,并通过矩阵相乘向下一层传递信息:
其中矩阵相乘规则如下:
第一层用矩阵相乘表示:
其中:
激活函数
多维数组运算(点积,加权求和)之后,会得到一个值,但不一定直接将这个值传递给下一层的神经元,而是通过某个函数转换,这个函数就叫激活函数,即是下图中的h():
常见的激活函数有如下:
- 阶跃函数
阶跃函数以 0 为界,输出从 0 切换为 1(或者从 1 切换为 0)。它的值呈阶梯式变化。
图像如下:
- sigmoid 函数:
图像如下:
Sigmoid函数是输出0~1之间平滑的直线,因此常用来表示概率、置信度 - ReLU函数
其图像如下:
输出层函数
输出层函数可以理解为最后一层隐藏层到输出层之间的激活函数。神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用 softmax 函数。
- 恒等函数
恒等函数,即原样输出: f ( x ) = x f(x)=x f(x)=x - softmax 函数
表示假设输出层共有 n 个神经元,计算第 k 个神经元的输出 y_k。如上式,softmax 函数的分子是输入信号 a_k 的指数函数,分母是所有输入信号的指数函数的和
在实际使用中,为防止exp(ak)指数结果太大而溢出,一般优化为下式,其中C表示任意常数。
softmax 函数的输出是 0.0 到 1.0 之间的实数。并且,softmax 函数的输出值的总和是 1。输出总和为 1 是 softmax 函数的一个重要性质。正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”。例如在手写数字识别的例子中,输出10个不同的概率,表示预测为相应数字(0…9)的可能性概率。
神经网络的计算过程
- 使用MNIST手写数字数据,演示神经网络预测计算过程。数据获取方法见前一篇:手写图像数据集MNIST下载,处理为Numpy格式后存为.pkl格式
- 默认神经网络已经训练好,存为pkl格式
- 神经网络的学习过程,将在下一篇博文呈现。
- 以每100组数据为一批,进行批量预测,矩阵计算过程如下:
# coding: utf-8
import sys, os
import numpy as np
import pickle
#导入MNIST数据,方法见博文:https://blog.csdn.net/aitizhiren/article/details/106887584
from MNISTData import load_mnist
# 获取MNIST训练数据、测试数据
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False)
return x_test, t_test
# 假定神经网络已经训练好,包括3个隐藏层和3个偏置
# 获取训练好的神经网络数据(文末提供下载)
def init_network():
with open("sample_weight.pkl", 'rb') as f:
network = pickle.load(f)
return network
# 输出函数:softmax函数
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))
# 通过神经网络预测
def predict(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 = softmax(a3)
return y
# 激活函数:sigmoid
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x, t = get_data() #获取数据
network = init_network() # 初始化神经网络
batch_size = 100 # 批处理数量
accuracy_cnt = 0 # 准确度
for i in range(0, len(x), batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:" + str(float(accuracy_cnt) / len(x)))
计算结果:
Accuracy:0.9352
注:本文内容和代码总结自[日]斋藤康毅 所著《深度学习入门-基于Python的理论与实现》