神经网络介绍及其计算过程:python实现MINIST手写数字预测

目录

  • 神经网络介绍
    • 网络结构
    • 每一层之间信息传递:多维数组的计算
    • 激活函数
    • 输出层函数
  • 神经网络的计算过程

神经网络介绍

网络结构

我们把最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。中间层有时也称为隐藏层。如图,3 层神经网络:输入层(第 0 层)有 2 个神经元,第 1 个隐藏层(第 1 层)有 3 个神经元,第 2 个隐藏层(第 2 层)有 2 个神经元,输出层(第 3 层)有 2 个神经元。
神经网络介绍及其计算过程:python实现MINIST手写数字预测_第1张图片
上图中节点“1”表示偏置,节点a1(1)的计算公式为:

每一层之间信息传递:多维数组的计算

神经网络的每一层,都以多维数组表示,并通过矩阵相乘向下一层传递信息:
神经网络介绍及其计算过程:python实现MINIST手写数字预测_第2张图片
其中矩阵相乘规则如下:
神经网络介绍及其计算过程:python实现MINIST手写数字预测_第3张图片
第一层用矩阵相乘表示:
在这里插入图片描述
其中:
神经网络介绍及其计算过程:python实现MINIST手写数字预测_第4张图片

激活函数

多维数组运算(点积,加权求和)之后,会得到一个值,但不一定直接将这个值传递给下一层的神经元,而是通过某个函数转换,这个函数就叫激活函数,即是下图中的h():
神经网络介绍及其计算过程:python实现MINIST手写数字预测_第5张图片
常见的激活函数有如下:

  1. 阶跃函数
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第6张图片
    阶跃函数以 0 为界,输出从 0 切换为 1(或者从 1 切换为 0)。它的值呈阶梯式变化。
    图像如下:
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第7张图片
  2. sigmoid 函数:
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第8张图片
    图像如下:
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第9张图片
    Sigmoid函数是输出0~1之间平滑的直线,因此常用来表示概率、置信度
  3. ReLU函数
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第10张图片
    其图像如下:
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第11张图片

输出层函数

输出层函数可以理解为最后一层隐藏层到输出层之间的激活函数。神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用 softmax 函数。

  1. 恒等函数
    恒等函数,即原样输出: f ( x ) = x f(x)=x f(x)=x
  2. softmax 函数
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第12张图片
    表示假设输出层共有 n 个神经元,计算第 k 个神经元的输出 y_k。如上式,softmax 函数的分子是输入信号 a_k 的指数函数,分母是所有输入信号的指数函数的和
    在实际使用中,为防止exp(ak)指数结果太大而溢出,一般优化为下式,其中C表示任意常数。
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第13张图片
    softmax 函数的输出是 0.0 到 1.0 之间的实数。并且,softmax 函数的输出值的总和是 1。输出总和为 1 是 softmax 函数的一个重要性质。正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”。例如在手写数字识别的例子中,输出10个不同的概率,表示预测为相应数字(0…9)的可能性概率。

神经网络的计算过程

  1. 使用MNIST手写数字数据,演示神经网络预测计算过程。数据获取方法见前一篇:手写图像数据集MNIST下载,处理为Numpy格式后存为.pkl格式
  2. 默认神经网络已经训练好,存为pkl格式
  3. 神经网络的学习过程,将在下一篇博文呈现。
  4. 以每100组数据为一批,进行批量预测,矩阵计算过程如下:
    神经网络介绍及其计算过程:python实现MINIST手写数字预测_第14张图片
# 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的理论与实现》

你可能感兴趣的:(算法和AI思想,Python)