神经网络手写数字识别

聊了几天理论,是该弄一个 Hello World 了,在人工智能领域,或者说深度学习领域,Hello World 程序就是手写数字识别,今天我们就来看看手写数字识别的程序怎么写。不愿意看代码吗,那我就说一说这段代码干了点什么:先通过 keras 内置的数据集下载测试数据,是 60000 长手写图片的训练集和 10000 张测试集,随后定义了一个神经网络的模型,设置网络中的层参数,随后配置训练网络的参数,包括损失函数和评测模型,设置迭代次数,启动训练网络,最后将测试数据喂给网络,得出训练效果是否有效。还是建议看仔细看一下代码:

#!/usr/bin/env python3
from keras import layers
from keras import models
from keras.datasets import mnist
from keras.utils import to_categorical
?
def hello_world():
    # 下载手写数字数据集, https://s3.amazonaws.com/img-datasets/mnist.npz
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
?
    print('训练集:', train_images.shape)   # (60000, 28, 28)
    print('训练集:', len(train_labels))    # 60000
    print('训练集:', train_labels)         # [5 0 4 ... 5 6 8]
?
    print()
    print('测试集:', test_images.shape)    # (10000, 28, 28)
    print('测试集:', len(test_labels))     # 10000
    print('测试集:', test_labels)          # [7 2 1 ... 4 5 6]
?
    # 模型,可以理解为就是前文说的黑盒子
    network = models.Sequential()
    # 神经网络的核心就是 layer,是真正用来加工处理数据的,Dense 是定义网络层的基础方法
    # 512 定义神经元个数,activation 定义激活函数,input_shape 定义输入尺寸
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
    network.add(layers.Dense(10, activation='softmax'))
?
    # 配置训练模型,optimizer 优化器名,loss 损失函数,metrics 模型评估标准
    network.compile(optimizer='rmsprop',
                    loss='categorical_crossentropy',
                    metrics=['accuracy'])
?
    # 不改变数组内容,改变数组格式
    train_images = train_images.reshape((60000, 28 * 28))
    # 数据类型转换
    train_images = train_images.astype('float32') / 255
?
    test_images = test_images.reshape((10000, 28 * 28))
    test_images = test_images.astype('float32') / 255
?
    # 转换成二进制
    train_labels = to_categorical(train_labels)
    test_labels = to_categorical(test_labels)
?
    # 在数据集上进行迭代
    network.fit(train_images, train_labels, epochs=5, batch_size=128, callbacks=[TensorBoard(log_dir='./log')])
    # 测试模式下损失值和指标值
    test_loss, test_acc = network.evaluate(test_images, test_labels)
?
    print('test_loss', test_loss, ', test_acc:', test_acc)
?
if __name__ == "__main__":
    hello_world()

TensorFlow 作为其运行引擎,输出数据集格式:

这是运行过程简图,可以看出准确率随着迭代次数,越来越高,训练后模型在测试集上运行识别准确率差不多为 98%:

这里我们思考几个问题:

  1. 这个网络真的好像一个黑盒子,给了一些训练数据,然后就得出了一个模型,但是这个训练过程中,究竟向量间是怎么运算的,究竟特征值是怎么取的,每次运算的结果还不一样,那是不是就没有办法分析这个网络中究竟发生了什么,是不是觉得有点慌。如果一个人工智能指挥的战争,我们是不是都没有办法预测究竟发生了什么,指挥的命令是否符合人类最高价值观,想一想就会觉得有点可怕。
  2. 这个训练过程其实还是挺耗时的,或者说神经网络运行一般都是挺耗时的,因此这个问题怎么去处理,怎么去剪枝,让其可以在有限的时间内就可以得到可以接受的结果。这是不是就对 AlphaGo 有了一点不一样的理解。
  3. 这个网络究竟是怎么训练数据的,似乎也没写什么相关代码呀,好像也可以完成不少的事情,神经网络都这么简单吗?当然不是。在 network.fit 中最后最后一个参数是设置了callback,在控制台用 tensorboard --logdir=log 命令可以查看运行过程图,看不懂没关系,以后我们慢慢分析,截图如下:


今天,我们写了一个 Hello World,用的是 Keras,其底层内核是 TensorFlow,直观感性的复习一下之前聊过的知识,只看无益,去试一试吧!

原文地址:https://www.cnblogs.com/renyuzhuo/p/12222548.html

时间: 2024-11-05 23:33:42

神经网络手写数字识别的相关文章

基于Numpy的神经网络+手写数字识别

基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class definition class neuralNetwork: # initialise the neural network def __init__(): pass # train the neural network def train(): pass # query the neural netwo

使用cuda加速卷积神经网络-手写数字识别准确率99.7%

源码和运行结果 cuda:https://github.com/zhxfl/cuCNN-I C语言版本参考自:http://eric-yuan.me/ 针对著名手写数字识别的库mnist,准确率是99.7%,在几分钟内,CNN的训练就可以达到99.60%左右的准确率. 参数配置 网络的配置使用Config.txt进行配置##之间是注释,代码会自动过滤掉,其他格式参考如下: #Comment# #NON_LINEARITY CAN = NL_SIGMOID , NL_TANH , NL_RELU#

C#中调用Matlab人工神经网络算法实现手写数字识别

手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写阿拉伯数字识别是图像内容识别中较为简单的一个应用领域,原因有被识别的模式数较少(只有0到9,10个阿拉伯数字).阿拉伯数字笔画少并且简单等.手写阿拉伯数字的识别采用的方法相对于人脸识别.汉字识别等应用领域来说可以采用更为灵活的方法,例如基于规则的方法.基于有限状态自动机的方法.基于统计的方法和基于神

第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器      感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695      感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1.这种算法的局限性很大: 只能将数据分为 2 类 数据必须是线性可分的 虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的. 感知器可以表示为

Pytorch入门实战一:LeNet神经网络实现 MNIST手写数字识别

记得第一次接触手写数字识别数据集还在学习TensorFlow,各种sess.run(),头都绕晕了.自从接触pytorch以来,一直想写点什么.曾经在2017年5月,Andrej Karpathy发表的一片Twitter,调侃道:l've been using PyTorch a few months now, l've never felt better, l've more energy.My skin is clearer. My eye sight has improved.确实,使用p

利用手写数字识别项目详细描述BP深度神经网络的权重学习

本篇文章是针对学习<深度学习入门>(由日本学者斋藤康毅所著陆羽杰所译)中关于神经网络的学习一章来总结归纳一些收获. 本书提出神经网络的学习分四步:1.mini-batch 2.计算梯度 3.更新参数 4.重复前面步骤 1.从识别手写数字项目学习神经网络 所谓“从数据中学习”是指 可以由数据#自动决定权重#.当解决较为简单的问题,使用简单的神经网络时,网络里的权重可以人为的手动设置,去提取输入信息中特定的特征.但是在实际的神经网络中,参数往往是成千上万,甚至可能上亿的权重,这个时候人为手动设置是

C++使用matlab卷积神经网络库MatConvNet来进行手写数字识别

环境:WIN10(64 bit)+VS2010(64 bit)+Matlab2015b(64 bit) 关于MatConvNet的介绍参考:http://www.vlfeat.org/matconvnet/ Github下载地址为:https://github.com/vlfeat/matconvnet/ 我们的目的是将MatConvNet自带的手写数字识别DEMO移植到一个简单的WIN32 DEMO中使用,主要过程有以下几个步骤: (1)配置MatConvNet,然后将手写数字识别DEMO编译

keras入门实战:手写数字识别

近些年由于理论知识的硬件的快速发展,使得深度学习达到了空前的火热.深度学习已经在很多方面都成功得到了应用,尤其是在图像识别和分类领域,机器识别图像的能力甚至超过了人类. 本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别.mnist手写数字识别是机器学习和深度学习领域的"hello world",MNIST数据集是手写数字的数据集合,训练集规模为60000,测试集为10000. 本文的内容包括: 如何用Keras加载MNIST数据集 对于MNIST问题如何

Tensorflow实践 mnist手写数字识别

minst数据集                                         tensorflow的文档中就自带了mnist手写数字识别的例子,是一个很经典也比较简单的入门tensorflow的例子,非常值得自己动手亲自实践一下.由于我用的不是tensorflow中自带的mnist数据集,而是从kaggle的网站下载下来的,数据集有些不太一样,所以直接按照tensorflow官方文档上的参数训练的话还是踩了一些坑,特此记录. 首先从kaggle网站下载mnist数据集,一份是