文档章节

Neural Networks Backpropagation做MNIST数字识别

C
 CharlesLiu
发布于 2017/08/09 17:31
字数 1140
阅读 5
收藏 0
点赞 0
评论 0

Neural Networks Backpropagation做MNIST数字识别

Neural Networks

  不同种属的生物大脑所含有的神经元数量有着显著的不同,一个成年人的大脑约含有850亿~860亿神经元,其中163亿位于大脑皮质,690亿位于小脑。相比而言,秀丽隐杆线虫线虫仅仅只有302个神经元,而黑腹果蝇则有约100000神经元,并且能表现出比较复杂的行为。本例所使用的神经元数量大约只有1000个,三层神经网络,只有一层hidden layer。
  对于人的大脑来说,不同的部分之间具有通用性,一个有语言障碍的人,负责语言部分的大脑会适应于其他部分的行为。就好比有的聋哑人视觉会比较好,有的瞎子听觉却比常人更好,其原因就是他们的缺陷导致相应的大脑部位去适应另外的能力。
  神经元的行为非常复杂,我们只抽象出我们所能理解的比较简单的一部分,但是Neural Networks的对不同问题领域的适应能力和学习能力还是保留了的。一个神经元简化为树突,对应input,胞体对应f(x),早期Perceptron神经元设计比较简单,f(x) = b + W*X,局限性比较大,只能输出01,不过能实现所有的门电路逻辑。后来发展为sigmoid神经元,f(x) = 1 / (1 + e^-(W*X + b)),输出是一个平滑的从0到1的S曲线。然后轴突对应output。神经元在输入达到一个阈值的时候才会被激发,这样通过动态调整weights和biases来控制Neural Networks的神经元行为进而学习一个问题领域。下面是一个简单的神经网络,input layer拥有784个神经元,hidden layer有15个神经元,output layer有10个神经元:
  

Weights And Biases

  对于上图,如果我们有M个training data,则一次正向的传导为sigmoid(W2 * sigmoid(W1 * R^(M*784) + b1) + b2),最终得到R^(M*10)的output矩阵,然后计算Cost,然后多次迭代得到优化后的Weights和Biases。本例用上篇提到的Stochastic Gradient Descent去找优化的解。

Backpropagation

  下面是Backpropagation的公式,我们来一一推导:
  
  

MNIST

  MNIST包含手写的数字,有60000条training data,10000条test data。下面的图片提取自MNIST:
  
 提取training data

def load_train_data():
    fimg = gzip.open('train-images-idx3-ubyte.gz', 'rb')
    flabel = gzip.open('train-labels-idx1-ubyte.gz', 'rb')
    magic_img, total_img, rows, cols = struct.unpack('>IIII', fimg.read(16))
    magic_label, total_label = struct.unpack('>II', flabel.read(8))
    train_data = list()
    for i in xrange(total_img):
        img = np.reshape(np.fromstring(fimg.read(rows * cols), dtype = np.uint8), (rows * cols, 1))
        train_data.append(img)
    train_label = vectorize_result(np.fromstring(flabel.read(total_label), dtype = np.uint8))
    train = zip(train_data, train_label)

    fimg.close()
    flabel.close()

    return train

 提取test data

def load_test_data():
    fimg = gzip.open('t10k-images-idx3-ubyte.gz', 'rb')
    flabel = gzip.open('t10k-labels-idx1-ubyte.gz', 'rb')
    magic_img, total_img, rows, cols = struct.unpack('>IIII', fimg.read(16))
    magic_label, total_label = struct.unpack('>II', flabel.read(8))
    test_data = list()
    for i in xrange(total_img):
        img = np.reshape(np.fromstring(fimg.read(rows * cols), dtype = np.uint8), (rows * cols, 1))
        test_data.append(img)
    test_label = np.fromstring(flabel.read(total_label), dtype = np.uint8)
    test = zip(test_data, test_label)

    fimg.close()
    flabel.close()

    return test

Neural Networks & Backpropagation

 定义Neural Network

class NeuralNetwork(object):
    def __init__(self, sizes):
        self.num_layers = len(sizes)
        self.sizes = sizes
        self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
        self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]

 sigmoid函数和导数

def sigmoid(z):
    for (x, y), val in np.ndenumerate(z):
        if val >= 100:
            z[x][y] = 1.
        elif val <= -100:
            z[x][y] = 0.
        else:
            z[x][y] = 1.0 / (1.0 + np.exp(-val))

    return z

def sigmoid_derivative(z):
    return sigmoid(z) * (1. - sigmoid(z))

 Stochastic Gradient Descent

# eta is learning rate
def stochasticGradientDescent(self, training_data, epochs, mini_batch_size, eta, test_data = None):
    if test_data:
        n_test = len(test_data)
    n_train = len(training_data)
    for j in xrange(epochs):
        random.shuffle(training_data)
        mini_batches = [training_data[k: k + mini_batch_size] for k in xrange(0, n_train, mini_batch_size)]
        for mini_batch in mini_batches:
            self.updateMiniBatch(mini_batch, eta)
        if test_data:
            print 'Epoch %s: %s / %s' % (j, self.evaluate(test_data), n_test)
        else:
            print 'Epoch %s complete.' % j

def updateMiniBatch(self, mini_batch, eta):
    nabla_b = [np.zeros(b.shape) for b in self.biases]
    nabla_w = [np.zeros(w.shape) for w in self.weights]
    for x, y in mini_batch:
        delta_nabla_b, delta_nabla_w = self.backprob(x, y)
        nabla_b = [nb + dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
        nabla_w = [nw + dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
    self.weights = [w - (eta / len(mini_batch)) * nw for w, nw in zip(self.weights, nabla_w)]
    self.biases = [b - (eta / len(mini_batch)) * nb for b, nb in zip(self.biases, nabla_b)]

 Backpropagation

def backprob(self, x, y):
    nabla_b = [np.zeros(b.shape) for b in self.biases]
    nabla_w = [np.zeros(w.shape) for w in self.weights]

    activation = x
    activations = [x]
    zs = []
    for b, w in zip(self.biases, self.weights):
        z = np.dot(w, activation) + b
        zs.append(z)
        activation = sigmoid(z)
        activations.append(activation)
    delta = self.cost_derivative(activations[-1], y) * sigmoid_derivative(zs[-1])
    nabla_b[-1] = delta
    nabla_w[-1] = np.dot(delta, activations[-2].transpose())
    for l in xrange(2, self.num_layers):
        z = zs[-l]
        sd = sigmoid_derivative(z)
        delta = np.dot(self.weights[-l + 1].transpose(), delta) * sd
        nabla_b[-l] = delta
        nabla_w[-l] = np.dot(delta, activations[-l - 1].transpose())
    return (nabla_b, nabla_w)

  hidden layer 30个Neurons,准确率约为82%.
  
  hidden layer 100个Neurons,准确率约为90%.
  完整代码见Digit Recognition

Reference

小结

  Learning is a HOBBY!
  原文在我的GitHub

© 著作权归作者所有

共有 人打赏支持
C
粉丝 0
博文 1
码字总数 1140
作品 0
利用pytorch实现Fooling Images(添加特定噪声到原始图像,使神经网络误识别)

It suggests that it is the space, rather than the individual units, that contains the semantic information in the high layers of neural networks. 在深层的神经网络中,真正影响特征......

oldpan ⋅ 2017/11/30 ⋅ 0

[MXnet] Simple Introduction to the Example

MXnet的学习笔记,这次主要是MXnet提供的example的综述介绍。关于MXnet在OSX下的编译安装,可以看这里Mac下编译安装MXNet!!! 简介 MXnet的样例程序分为5个部分,分别是 Deep Learning Ex...

ToeKnee ⋅ 2016/05/20 ⋅ 0

Deep Learning方向的paper

个人阅读的Deep Learning方向的paper整理,分了几部分吧,但有些部分是有交叉或者内容重叠,也不必纠结于这属于DNN还是CNN之类,个人只是大致分了个类。目前只整理了部分,剩余部分还会持续更...

langb2014 ⋅ 2016/03/06 ⋅ 0

awesome-very-deep-learning

awesome-very-deep-learning is a curated list for papers and code about implementing and training very deep neural networks. Deep Residual Learning Deep Residual Networks are a f......

wangxiaocvpr ⋅ 2016/08/30 ⋅ 0

资源 | 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)

编辑 | MingMing 尽管机器学习的历史可以追溯到1959年,但目前,这个领域正以前所未有的速度发展。最近,我一直在网上寻找关于机器学习和NLP各方面的好资源,为了帮助到和我有相同需求的人,...

dqcfkyqdxym3f8rb0 ⋅ 2017/12/29 ⋅ 0

feiwang/Awesome-TensorFlow-Chinese

Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解。 安装教程,安装之后跑起来。 入门教程,简单的模型学习和运行。 实战项目,根据自己的需求进行开...

feiwang ⋅ 2017/09/07 ⋅ 0

Machine Learning 机器学习笔记

目录 前言 第一周:Welcome 1.1 What is Machine Learning? 1.2 Linear Regression with One Variable 第二周:Linear Regression with Multiple Variables 2.1 Multivariate Linear Regress......

一缕殇流化隐半边冰霜 ⋅ 03/27 ⋅ 0

利用卷积神经网络识别mnist手写数字

利用卷积神经网络识别mnist手写数字,python程序来源于: TensorFlow卷积神经网络(CNN)示例 - 高级API Convolutional Neural Network Example - tf.layers API CNN网络结构图示 MNIST数据库 ...

zxszxs ⋅ 05/28 ⋅ 0

Machine Learning 机器学习笔记目录

目录 前言 第一周:Welcome 1.1 What is Machine Learning? 1.2 Linear Regression with One Variable 第二周:Linear Regression with Multiple Variables 2.1 Multivariate Linear Regress......

一缕殇流化隐半边冰霜 ⋅ 04/01 ⋅ 0

【推荐】Keras教程:Python深度学习超级入门指南

2016-11-27 机器学习研究会 点击上方“机器学习研究会”可以订阅哦 摘要 转自:爱可可-爱生活 In this step-by-step Keras tutorial, you’ll learn how to build a convolutional neural ne...

Betty__ ⋅ 2016/12/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 36分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 38分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 49分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 51分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 52分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 52分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 56分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部