Practice-2 ANN识别模型

1.实验目的

掌握BP神经网络理论知识和分类方法,对阿拉伯数字数据集进行训练

2.理论方法介绍

在神经网络中,输入层与输出层之间的层称为隐含层或隐层(hidden layer),隐层和输出层的神经元都是具有激活函数的功能神经元。只需包含一个隐层便可以称为多层神经网络,常用的神经网络称为“多层前馈神经网络”(multi-layer feedforward neural network)(这里的层实际上是隐含层的个数),该结构满足以下几个特点:

  • 每层神经元与下一层神经元之间完全互连

  • 神经元之间不存在同层连接

  • 神经元之间不存在跨层连接

BP(Back Propagation)网络,实际上,也是是多层感知器的一种,是1986年由Rumelhart和Hinton为首的科学家小组提出,相比于多层感知机,BP网络除了具有前馈神经网络的是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛、最成功的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。
具体来说,对于如下的只含一个隐层的神经网络模型:BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
在这里插入图片描述
神经网络利用现有的数据找出输入与输出之间得权值关系(近似),然后利用这样的权值关系进行仿真,例如输入一组数据仿真出输出结果,当然你的输入要和训练时采用的数据集在一个范畴之内。例如预报天气:温度 湿度 气压等作为输入 天气情况作为输出利用历史得输入输出关系训练出神经网络,然后利用这样的神经网络输入今天的温度 湿度 气压等 得出即将得天气情况。

3.实验数据及方法

本实验使用从互联网搜集手写数字数据集,共60000张,包含0~9的手写数字图片,图片格式为bmp文件,部分数字如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导入必要的库

import numpy as np
import os
from PIL import Image

定义一个函数将图片转换成向量的形式,储存在数组中

def img2vec(fname):
    '''将jpg等格式的图片转为向量'''
    im = Image.open(fname).convert('L')
    im = im.resize((28,28))
    tmp = np.array(im)
    vec = tmp.ravel()
    return vec
y = []
x = []
path = os.walk(r'D:\Working\trainimage\pic2')
for a,b,c in path:
    label = a.split('\\')[-1]
    # print(label)
    for n in c:
        path_obj = a + '\\' + n
        x.append(img2vec(path_obj))
        y.append(label)

将储存的向量分为训练集和测试集,使用BP神经网络进行分类训练

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y,
                                                    test_size=0.3,
                                                    random_state=3)
solvers = ['lbfgs', 'sgd', 'adam']
from sklearn.neural_network import MLPClassifier
import time
for kk in solvers:
    start = time.perf_counter()
    clf= MLPClassifier(solver=kk, alpha=1e-5, hidden_layer_sizes=(10,10), random_state=1)
    clf.fit(X_train,y_train)
    print('选用的优化器: ',kk)
    print('准确率:', clf.score(X_test,y_test))
    print('损失:', clf.loss_)
    print('使用的激活函数:', clf.out_activation_)
    print('迭代次数:', clf.n_iter_)
    print('层数:', clf.n_layers_)
    elapsed = (time.perf_counter() - start)
    print('使用的时间:', elapsed)
    print('-----------------------------------')
print('end')

输出的结果:

选用的优化器: lbfgs
准确率: 0.3436111111111111
损失: 1.6555131568592278
使用的激活函数:softmax
迭代次数: 201
层数: 4
使用的时间: 75.6750577
-----------------------------------
选用的优化器: sgd
准确率:0.11288888888888889
损失: 2.301280936273047
使用的激活函数: softmax
迭代次数: 22
层数: 4
使用的时间: 11.023432400000004
-----------------------------------
选用的优化器: adam
准确率: 0.8979444444444444
损失: 0.2622838070829675
使用的激活函数:softmax
迭代次数: 153
层数: 4
使用的时间: 80.78417149999999
----------------------------------- end

我们在选用不同的迭代器发现,sgd迭代器虽然速度最快,但是其准确率也是最低的;其次是lbfgs;adam为基于随机梯度的优化器,虽然运行速度慢,但是其准确率是最高的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值