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

    文章

    4771

    浏览量

    100763
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62613
  • 数据集
    +关注

    关注

    4

    文章

    1208

    浏览量

    24700
  • MNIST
    +关注

    关注

    0

    文章

    10

    浏览量

    3375
收藏 人收藏

    评论

    相关推荐

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

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

    基于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

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

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

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

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

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

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

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

    逼近未知非线性对象的特点,使其为手写数字识别提供了一种新的方法。本论文采用一编制了一套基于神经网络手写
    发表于 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>系统的详细资料概述

    谷歌向神经网络手写数字识别发起挑战,竟用量子计算识别

    神经网络做 MNIST 手写数字识别是机器学习小白用来练手的入门项目,业内最佳准确率已经达到了 99.84%。但最近,谷歌向这个「古老」的数据集发起了一项新的挑战:用量子计算来进行
    的头像 发表于 08-17 17:17 1642次阅读
    谷歌向<b class='flag-5'>神经网络</b><b class='flag-5'>手写</b><b class='flag-5'>数字</b><b class='flag-5'>识别</b>发起挑战,竟用量子计算<b class='flag-5'>识别</b>

    神经网络入门:使用Python+Flux+Julia来实现手写数字识别

    使用 MNIST 数据集对 0 到 9 之间的数字进行手写数字识别神经网络的一个典型入门教程。 该技术在现实场景中是很有用的,比如可以把该
    的头像 发表于 11-03 22:02 713次阅读

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

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

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

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

    卷积神经网络如何识别图像

    多层卷积层、池化层和全连接层。CNN模型通过训练识别并学习高度复杂的图像模式,对于识别物体和进行图像分类等任务有着非常优越的表现。本文将会详细介绍卷积神经网络如何识别图像,主要包括以下
    的头像 发表于 08-21 16:49 1937次阅读

    常见的卷积神经网络模型 典型的卷积神经网络模型

    LeNet是卷积神经网络的开山祖师,是由Yan LeCunn在1998年提出的经典卷积神经网络模型。它最初是为手写数字识别而设计的,由卷
    的头像 发表于 08-21 17:11 2842次阅读

    神经网络在图像识别中的应用

    随着人工智能技术的飞速发展,神经网络在图像识别领域的应用日益广泛。神经网络以其强大的特征提取和分类能力,为图像识别带来了革命性的进步。本文将详细介绍
    的头像 发表于 07-01 14:19 682次阅读