关于本章之前内容可以参考以下之前文章:
1 https://blog.csdn.net/Raine_Yang/article/details/128473486?spm=1001.2014.3001.5501
2 https://blog.csdn.net/Raine_Yang/article/details/128584916?spm=1001.2014.3001.5501
神经网络的输出层设计
机器学习问题一般分为分类问题和回归问题。分类文件判断数据属于哪一类别,输出层一般使用softmax函数。回归问题即根据输入预测一个连续的数值,输出层一般使用恒等函数
设有n个输出层,其中第k个神经元的输出值yk
softmax函数表达式:
在实际应用中,由于e ^ x 的值往往较大,容易导致变量溢出。利用以下简单变换可以很好避免这一问题:
这里我们将分数上下同乘以常数C,把ln©代入到指数函数内,最后把ln©即为C’。我们将C’取输入数据最大值即可很好避免溢出
程序实现如下:
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
2 softmax函数特征
softman函数输出是0到1之间实数,并且输出值总和恒为1。这一性质使得我们将softmax函数输出解释为分类问题各项的概率
network = init_network()
x = np.array([1.6, 5.5])
y = forward(network, x)
print(y)
# output: [0.36750414 0.63249586]
将x代入我们上一篇文章中搭建的神经网络里得到以下结果,输出可以被解释为x[0]的概率是0.36,x[1]的概率是0.63
输出层的神经元个数又问题而定,一般来说对于分类问题神经元个数即为类别的个数,而每个输出值即为对应类别的概率
3 手写数字识别
要实现首先数字识别,我们先引入常用的手写数字库mnist用于训练。运行下面程序前需要先将mnist库下载到该程序文件父文件夹下
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
img = x_train[0]
label = t_train[0]
print(label) #