文档章节

Neural Networks Backpropagation做MNIST数字识别

C
 CharlesLiu
发布于 2017/08/09 17:31
字数 1140
阅读 5
收藏 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
0
我们建了个模型,搞定了 MNIST 数字识别任务

雷锋网(公众号:雷锋网)按:本文为雷锋字幕组编译的技术博客,原标题 A simple 2D CNN for MNIST digit recognition ,作者为 Sambit Mahapatra 。 翻译 | 王祎 霍雷刚 整理 | MY 对于图像分...

雷锋字幕组
07/09
0
0
[MXnet] Simple Introduction to the Example

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

ToeKnee
2016/05/20
0
0
卷积神经网络(CNN)介绍与实践

1 CNN的前生今世 1.1 大脑 作为人类,我们不断地通过眼睛来观察和分析周围的世界,我们不需要刻意的“努力”思考,就可以对岁看到的一切做出预测,并对它们采取行动。当我们看到某些东西时,...

致Great
07/19
0
0
Deep Learning方向的paper

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

langb2014
2016/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

配置Spring的注解支持

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 配置Spring的注解支持 以上也提到了使用注解来配...

凯哥学堂
41分钟前
0
0
关于Spring Aop存在的一点问题的思考

在本人前面的文章Spring Aop原理之切点表达式解析中讲解了Spring是如何解析切点表达式的,在分析源码的时候,出现了如下将要讲述的问题,我认为是不合理的,后来本人单纯使用aspectj进行试验...

爱宝贝丶
42分钟前
0
0
JavaScript 概述

JavaScript是面向Web的编程语言。绝大多数现代网站都使用了JavaScript,并且所有的现代Web浏览器——基于桌面系统、游戏机、平板电脑和智能手机的浏览器——均包含了JavaScript解释器。这使得...

Mr_ET
今天
0
0
Java Run-Time Data Areas(Java运行时数据区/内存分配)

Java运行时数据区(内存分配) 本文转载官网 更多相关内容可查看官网 中文翻译可参考 2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are use...

lichuangnk
今天
0
0
docker learn :services docker-compose.yml

docker-compose.yml定义了服务的运行参数 version: "3" services: web: # replace username/repo:tag with your name and image details image: hub.c.163.com/dog948453219/friendlyhello d......

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部