0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手写数字识别神经网络的实现(1)

CHANBAEK 来源:小小研究生 作者:小小研究生 2023-06-23 16:57 次阅读

对MNIST数据集使用2层神经网络(1层隐藏层)实现。

1、2层神经网络的类

将2层神经网络实现为一个TwoLayerNet的类:

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):
        # 初始化权重
        self.params = {}
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)
    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)
        return y
    # x:输入数据, t:监督数据
    def loss(self, x, t):
        y = self.predict(x)
        return cross_entropy_error(y, t)
    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)
        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy
    # x:输入数据, t:监督数据
    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)
        grads = {}
        grads['W1'] = numerical_gradient(loss_W, self.params['W1'])
        grads['b1'] = numerical_gradient(loss_W, self.params['b1'])
        grads['W2'] = numerical_gradient(loss_W, self.params['W2'])
        grads['b2'] = numerical_gradient(loss_W, self.params['b2'])
        return grads
    def gradient(self, x, t):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']
        grads = {}
        batch_num = x.shape[0]
        # forward
        a1 = np.dot(x, W1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, W2) + b2
        y = softmax(a2)
        # backward
        dy = (y - t) / batch_num
        grads['W2'] = np.dot(z1.T, dy)
        grads['b2'] = np.sum(dy, axis=0)
        da1 = np.dot(dy, W2.T)
        dz1 = sigmoid_grad(a1) * da1
        grads['W1'] = np.dot(x.T, dz1)
        grads['b1'] = np.sum(dz1, axis=0
        return grads

定义了初始化函数__init__,其中params变量W1,2分别是第1,2层的权重,b1,2分别是1,2层的偏置。初始化函数中包含输入层、隐藏层和输出层的神经元数,W1是随机生成的大小为输入层神经元数量(m)*隐藏层神经元数量的矩阵(n),b1是隐藏层神经元数量(n)的全0一维数组,W2是随机生成的大小为隐藏层神经元数量(n)*输出层神经元数量(k)的矩阵,b2是输出层神经元数量(k)的全0一维数组。

图片

定义了predict函数,表明网络结构,输入x权重+偏置进行激活得到隐藏层z1,z1权重+偏置进行激活得到输出y。

定义损失函数loss,使用的是交叉熵误差。

定义精确度函数accuracy,计算输出与标签一致(即正确识别)的概率。

定义了数值微分求权重梯度的函数numerical_gradient,返回梯度值,之前介绍过。

定义了另一种求权重梯度的方法,后面介绍。

上述代码中涉及的两个变量params和grads是字典型实例变量,前者保存了神经网络中全部的参数,后者保存了各个参数的梯度。

2、Mini-batch的实现

定义了2层神经网络的类相当于对神经网络进行封装形成一个模块,需要的时候设计参数即可直接调用。现在对MNIST数据集进行学习,使用这个封装好的2层神经网络。

# 读入数据
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
iters_num = 10000  # 适当设定循环的次数
train_size = x_train.shape[0]
batch_size = 100
learning_rate = 0.1


# 获取mini-batch
for i in range(iters_num):
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
# 计算梯度
    #grad = network.numerical_gradient(x_batch, t_batch)
    grad = network.gradient(x_batch, t_batch)
# 更新参数
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]
# 记录学习过程    
    loss = network.loss(x_batch, t_batch)
    train_loss_list.append(loss)

读入数据后,调用了2层神经网络的类,设置好函数完成调用,其中输入神经元为784个(图片像素为28*28),隐藏层50个神经元,输出层10个神经元(对应0-9的分类)。

设置超参数,包括学习的次数iters_num,训练数据的数量train_size,一次随机选取的训练数据的个数batch_size,学习率learning_rate。

获取mini-batch,计算mini-batch中的梯度,有两种计算方法数值微分和后面会介绍的高效方法,任意一种都行。通过grad函数更新参数W1,W2,b1,b2,使参数向梯度方向即使损失函数减小的方向移动,保存每一次更新的损失函数的值,后续绘图可以观察损失函数的变化。损失函数在不断减小,说明神经网络确实在学习。

图片

3、基于测试数据的评价

损失函数的值是某一个mini-batch的损失函数的值,不能说明在其他数据集上也能有同等程度的表现,神经网络的学习必须确认是否能识别训练数据之外的其他数据,即确认是否会发生过拟合。

下面的代码会对训练和测试数据的每一个epoch记录识别精度。一个epoch表示学习中所有数据均被使用过一次的更新次数,训练数据有60000个,mini-batch是100个,那么重复随机梯度下降法600次,所有训练数据就都被看过了,因此600次是一个epoch。

train_acc_list = []
test_acc_list = []
iter_per_epoch = max(train_size / batch_size, 1)


if i % iter_per_epoch == 0:
  train_acc = network.accuracy(x_train, t_train)
  test_acc = network.accuracy(x_test, t_test)
  train_acc_list.append(train_acc)
  test_acc_list.append(test_acc)
  print("train acc, test acc | " + str(train_acc) + ", " + str(test_acc))
# 绘制图形
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, label='train acc')
plt.plot(x, test_acc_list, label='test acc', linestyle='--')
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.show()

每经历一个epoch就会对所有训练和测试数据计算精度,然后绘制训练和测试精确度的变化,训练和测试的精度在慢慢提高且基本重叠,说明没有过拟合。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4575

    浏览量

    98764
  • 函数
    +关注

    关注

    3

    文章

    3900

    浏览量

    61310
  • 数据集
    +关注

    关注

    4

    文章

    1179

    浏览量

    24356
  • MNIST
    +关注

    关注

    0

    文章

    10

    浏览量

    3319
收藏 人收藏

    评论

    相关推荐

    粒子群优化模糊神经网络在语音识别中的应用

    的收敛速度和识别率【关键词】:粒子群优化;;模糊神经网络;;语音识别【DOI】:CNKI:SUN:SSJS.0.2010-06-018【正文快照】:1引言语音
    发表于 05-06 09:05

    labview BP神经网络实现

    请问:我在用labview做BP神经网络实现故障诊断,在NI官网找到了机器学习工具包(MLT),但是里面没有关于这部分VI的帮助文档,对于”BP神经网络分类“这个范例有很多不懂的地方,比如
    发表于 02-22 16:08

    基于BP神经网络的手势识别系统

    特征向量作为神经网络的输入,所以神经的输入层神经元个数等于特征向量的维数,即9×18=162 个输入神经元。输出层神经元个数的确定因为要
    发表于 11-13 16:04

    【PYNQ-Z2申请】基于PYNQ-Z2的神经网络图形识别

    神经网络的学习,讲解其工作原理。4.基于PYNQ-Z2,用python实现一个神经网络。5.训练和测试神经网络,完成神经网络最经典的入门实
    发表于 01-09 14:48

    【PYNQ-Z2试用体验】神经网络基础知识

    前言前面我们通过notebook,完成了在PYNQ-Z2开发板上编写并运行python程序。我们的最终目的是基于神经网络,完成手写数字识别。在这之前,有必要讲一下
    发表于 03-03 22:10

    【PYNQ-Z2试用体验】基于PYNQ-Z2的神经网络图形识别[结项]

    前言前面我们简单讲解了神经网络的基本概念和工作原理,接下来,将通过具体的python代码来完成基于神经网络的图形识别。这里使用手写数字图像
    发表于 03-18 21:51

    基于赛灵思FPGA的卷积神经网络实现设计

    FPGA 上实现卷积神经网络 (CNN)。CNN 是一类深度神经网络,在处理大规模图像识别任务以及与机器学习类似的其他问题方面已大获成功。在当前案例中,针对在 FPGA 上
    发表于 06-19 07:24

    【案例分享】ART神经网络与SOM神经网络

    是一种常用的无监督学习策略,在使用改策略时,网络的输出神经元相互竞争,每一时刻只有一个竞争获胜的神经元激活。ART神经网络由比较层、识别层、
    发表于 07-21 04:30

    人工神经网络实现方法有哪些?

    人工神经网络(Artificial Neural Network,ANN)是一种类似生物神经网络的信息处理结构,它的提出是为了解决一些非线性,非平稳,复杂的实际问题。那有哪些办法能实现人工神经
    发表于 08-01 08:06

    可分离卷积神经网络在 Cortex-M 处理器上实现关键词识别

    我们可以对神经网络架构进行优化,使之适配微控制器的内存和计算限制范围,并且不会影响精度。我们将在本文中解释和探讨深度可分离卷积神经网络在 Cortex-M 处理器上实现关键词识别的潜力
    发表于 07-26 09:46

    matlab实现神经网络 精选资料分享

    神经神经网络,对于神经网络实现是如何一直没有具体实现一下:现看到一个简单的神经网络模型用于训
    发表于 08-18 07:25

    如何使用STM32F4+MPU9150实现神经网络识别手势?

    如何使用STM32F4+MPU9150实现神经网络识别手势?
    发表于 11-19 07:06

    人工神经网络手写数字识别系统的详细资料概述

    逼近未知非线性对象的特点,使其为手写数字识别提供了一种新的方法。本论文采用一编制了一套基于神经网络手写
    发表于 05-27 08:00 18次下载
    人工<b class='flag-5'>神经网络</b><b class='flag-5'>手写</b><b class='flag-5'>数字</b><b class='flag-5'>识别</b>系统的详细资料概述

    使用PyhonFluxJulia实现手写数字识别神经网络入门教程

    使用 MNIST 数据集对 0 到 9 之间的数字进行手写数字识别神经网络的一个典型入门教程。该技术在现实场景中是很有用的,比如可以把该技
    发表于 12-08 00:23 7次下载

    手写数字识别神经网络实现(2)

    在练习二中,手写数字识别使用数值微分的方式实现神经网络,现在用误差反向传播法来实现。两者的区别
    的头像 发表于 06-23 16:57 468次阅读