【神经网络和深度学习-开发案例】第四章 神经网络如何对数字进行分类

该博客介绍了如何使用神经网络对手写数字进行分类,通过一个74行的Python程序,利用MNIST数据集和随机梯度下降进行训练。程序涉及到网络初始化、激活函数、反向传播算法和随机梯度下降的学习过程。
摘要由CSDN通过智能技术生成

【神经网络和深度学习】

第四章 神经网络如何对数字进行分类


案例:使用神经网络识别手写数字

好了,让我们来写一个程序,学习如何识别手写的数字,使用随机梯度下降和MNIST的训练数据。我们将用一个简短的Python(2.7)程序来完成这项工作,只需要74行代码!我们需要的第一件事就是获取MNIST的数据。如果您是一个git用户,那么您可以通过克隆这本书的代码库来获得数据

git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git

顺便说一下,当我更早地描述MNIST的数据时,我说它被分成了6万个训练图像和1万个测试图像。这是官方的MNIST描述。但后来在书中我们会发现它有用的在搞清楚如何设置神经网络的某些超级参数—诸如学习速率,等等。尽管验证数据并不是原始的MNIST规范的一部分,但是许多人以这种方式使用MNIST,并且在神经网络中使用验证数据是很常见的。当我提到“MNIST训练数据”如前所述,MNIST数据集是基于NIST收集的两个数据集,美国国家标准与技术研究院。为了构建NIST的数据集,NIST的数据集被精简了,并被Yann LeCun、科琳娜科尔特斯和克里斯托弗j.c.Burges所采用的更方便的格式。有关更多细节,请参见此链接。我的存储库中的数据集是以一种形式,使得在Python中加载和操纵nist的数据变得很容易。我从蒙特利尔大学的LISA机器学习实验室(链接)获得了这种特殊形式的数据。
除了MNIST的数据之外,我们还需要一个名为Numpy的Python库,用于快速线性代数。如果你还没有安装Numpy,你可以在这里找到它。
在给出完整的清单之前,让我解释一下神经网络代码的核心特性。中心是一个网络类,我们用它来表示一个神经网络。下面是我们用来初始化一个网络对象的代码:

class Network(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:])]

在这段代码中,列表大小包含了各个层中神经元的数量。举个例子,如果我们想要创建一个网络对象在第一层有两个神经元,第二层的3个神经元,最后一层的1个神经元,我们会用代码来做这个。

           $net = Network([2, 3, 1])

网络对象中的偏差和权重都是随机初始化的,使用np.random.randn函数生成高斯分布的平均值0和标准差1。这个随机初始化给出了我们的随机梯度下降算法一个起点。在后面的章节中,我们会找到更好的方法来初始化权重和偏差,但现在就可以了。请注意,网络初始化代码假设第一层神经元是一个输入层,并省略了对这些神经元的任何偏见,因为偏差只用于计算后期的输出。

这里写图片描述
这个方程里有很多东西,让我们把它拆开。 a a 是第二层神经元激活的载体。为了得到 a ,我们把 a a 乘以权重矩阵 w ,然后加上偏差的向量 b b 。然后我们将这个函数元素应用到向量 w a + b 的每一个条目上。(这被称为矢量化函数。)

考虑到这一点,可以很容易地从网络实例中编写代码来计算输出。我们首先定义sigmoid函数:
根据:

这里写图片描述

def sigmoid(z):
return 1.0/(1.0+np.exp(-z))

再根据:

这里写图片描述

def feedforward(self, a):
    """Return the output of the network if "a" is input."""
    for b, w in zip(self.biases, self.weights):
        a = sigmoid(np.dot(w, a)+b)
    return a

当然,我们希望我们的网络对象所做的主要事情是学习。为了达到这个目的,我们将给他们一个SGD方法来实现随机梯度下降。这里的代码。在一些地方有点神秘,但我将在列表之后把它分解。

 def SGD(self, training_data, epochs, mini_batch_size, eta,
        test_data=None):
    """Train the neural network using mini-batch stochastic
    gradient descent.  The "training_data" is a list of tuples
    "(x, y)" representing the training inputs and the desired
    outputs.  The other non-optional parameters are
    self-explanatory.  If "test_data" is provided then the
    network will be evaluated against the test data after each
    epoch, and partial progress printed out.  This is useful for
    tracking progress, but slows things down substantially."""
    if test_data: n_test = len(test_data)
    n = 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, mini_batch_size)]
        for mini_batch in mini_batches:
            self.update_mini_batch(mini_batch, eta)
        if test_data:
            print "Epoch {0}: {1} / {2}".format(
                j, self.evaluate(test_data), n_test)
        else:
            print "Epoch {0} complete".format(j)

训练数据是一组元组 xy ( x , y ) 表示训练输入和相应的期望输出。你所期望的变量的大小和小批量的大小是你所期望的,在采样时使用的小批量的数量和小批量的大小。 et

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值