深度学习框架(字体识别)

Posted 数据飞习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习框架(字体识别)相关的知识,希望对你有一定的参考价值。

深度学习


深度学习方法由多个层组成,以学习具有多个抽象层次的数据特征。为了学习复杂的功能,深度架构被用于多个抽象层次,即非线性操作;例如 ANNs,具有许多隐藏层。用准确的话总结就是,深度学习是机器学习的一个子领域,它使用了多层次的非线性信息处理和抽象,用于有监督或无监督的特征学习、表示、分类和模式识别。

深度学习网络与“典型”的前馈多层网络之间是有一些区别的,如下:

(1)深度学习网络比之前的网络有更多的神经元

(2)深度学习网络具有更复杂的连接层的方式

(3)深度学习网络需要用强大的计算能力来训练

(4)深度学习网络能够进行自动特征提取

深度学习可以被定义为在以下四个基本网络框架:

(1)无监督预训练网络

(2)卷积神经网络

(3)循环神经网络

(4)递归神经网络 

利用深度学习网咯识别数字

模型搭建


搭建神经网络对minist图片集进行识别,图片集是0~9的手写数字图片,包含了6000张训练图片和10000张测试图片。与日常使用的图片数据不同,minist里的图片已经转换为数字形式。

每张图片在由28×28的像素点组成。因为图片是黑白的,每个 像素点由一个正数表示,表示该店的黑白程度。如果图片不是数字形式,就必须用到其他工具(第三方库pillow),将其转化为数字形式。

那么如何搭建神经网络呢?对于输入层,由于数据有784个自变量,因此这一层有784个神经元,每个神经元代表一个变量。对于输出层,由于数据分为10类,因此这一层有10个神经元,每个神经元对应一个输出类别概率。对于隐藏层,选择的自由比较大,由于深度学习网络很难训练,因此只搭建两层隐藏层,个数分别为30和20

防止过拟合


神经网络模型及其复杂,极易发生过拟合现象,因此需要运用一些方法防止模型过拟合,比如添加惩罚项、使用dropout方法

这里,主要说明dropout方法,这一方法的思路是:在训练模型的每一步中,随机地暂时剔除掉一些神经元。最后,在使用神经网络对未知数据做预测时,会使用完整的网络。

具体步骤:

·在训练之前,先从神经网络中随机剔除一些神经元,使之变成一个新的神经网络

·然后根据新的神经网络结构,使用反向传播算法更新神经元参数,而不更新之前剔除的神经元参数

·每次训练结束之后,将神经网络恢复到最初的结构,并进行下一次训练。


代码实现

第一步:定义神经网络结构,并加入dropout方法。将方法放入ANN类中

        
          
          
        
  1. def defineANN(self):

  2.        """

  3.        定义神经网络的结构

  4.        """

  5.        # self.input是训练数据里自变量

  6.        prevSize = self.input.shape[1].value

  7.        prevOut = self.input

  8.        # self.size是神经网络的结构,也就是每一层的神经元个数

  9.        size = self.size

  10.        layer = 1

  11.        # 定义隐藏层

  12.        for currentSize in size[:-1]:

  13.            weights = tf.Variable(

  14.                tf.truncated_normal([prevSize, currentSize],

  15.                    stddev=1.0 / np.sqrt(float(prevSize))))

  16.            # 记录隐藏层的模型参数

  17.            tf.summary.histogram("hidden%s" % layer, weights)

  18.            layer += 1

  19.            biases = tf.Variable(tf.zeros([currentSize]))

  20.            prevOut = tf.nn.sigmoid(tf.matmul(prevOut, weights) + biases)

  21.            prevSize = currentSize

  22.        # 定义输出层

  23.        weights = tf.Variable(

  24.            tf.truncated_normal([prevSize, size[-1]],

  25.                stddev=1.0 / np.sqrt(float(prevSize))))

  26.        biases = tf.Variable(tf.zeros([size[-1]]))

  27.        self.out = tf.matmul(prevOut, weights) + biases

  28.        return self


第二步:定义模型损失函数,并在其中加入惩罚项

        
          
          
        
  1. def defineLoss(self):

  2.        """

  3.        定义神经网络的损失函数

  4.        """

  5.        # 定义单点损失,self.label是训练数据里的标签变量

  6.        loss = tf.nn.softmax_cross_entropy_with_logits(

  7.            labels=self.label, logits=self.out, name="loss")

  8.        # 定义整体损失

  9.        self.loss = tf.reduce_mean(loss, name="average_loss")

  10.        return self


第三步:对未知参数做预测

        
          
          
        
  1. def predict_proba(self, X):

  2.        """

  3.        使用神经网络对未知数据进行预测

  4.        """

  5.        sess = self.sess

  6.        pred = tf.nn.softmax(logits=self.out, name="pred")

  7.        prob = sess.run(pred, feed_dict={self.input: X})

  8.        return prob


第四步:训练评估模型

        
          
          
        
  1. def SGD(self, X, Y, learningRate, miniBatchFraction, epoch):

  2.        """

  3.        使用随机梯度下降法训练模型

  4.        参数

  5.        ----

  6.        X : np.array, 自变量


  7.        Y : np.array, 因变量

  8.        """

  9.        # 记录训练的细节

  10.        tf.summary.scalar("loss", self.loss)

  11.        summary = tf.summary.merge_all()

  12.        method = tf.train.GradientDescentOptimizer(learningRate)

  13.        optimizer= method.minimize(self.loss)

  14.        batchSize = int(X.shape[0] * miniBatchFraction)

  15.        batchNum = int(np.ceil(1 / miniBatchFraction))

  16.        sess = tf.Session()

  17.        init = tf.global_variables_initializer()

  18.        sess.run(init)

  19.        summary_writer = tf.summary.FileWriter(self.logPath, graph=tf.get_default_graph())

  20.        step = 0

  21.        while (step < epoch):

  22.            for i in range(batchNum):

  23.                batchX = X[i * batchSize: (i + 1) * batchSize]

  24.                batchY = Y[i * batchSize: (i + 1) * batchSize]

  25.                sess.run([optimizer],

  26.                    feed_dict={self.input: batchX, self.label: batchY})

  27.            step += 1

  28.            # 将日志写入文件

  29.            summary_str = sess.run(summary, feed_dict={self.input: X, self.label: Y})

  30.            summary_writer.add_summary(summary_str, step)

  31.            summary_writer.flush()

  32.        self.sess = sess

  33.        return self


        
          
          
        
  1. def fit(self, X, Y, learningRate=0.3, miniBatchFraction=0.1, epoch=2500):

  2.        """

  3.        训练模型

  4.        参数

  5.        ----

  6.        X : np.array, 自变量


  7.        Y : np.array, 因变量

  8.        """

  9.        self.input = tf.placeholder(tf.float32, shape=[None, X.shape[1]], name="X")

  10.        self.label = tf.placeholder(tf.int64, shape=[None, self.size[-1]], name="Y")

  11.        self.defineANN()

  12.        self.defineLoss()

  13.        self.SGD(X, Y, learningRate, miniBatchFraction, epoch)




深度学习框架(字体识别)

不关注



就捣蛋

长按上方二维码





以上是关于深度学习框架(字体识别)的主要内容,如果未能解决你的问题,请参考以下文章

深度学习---手写字体识别程序分析(python)

Tensorflow 实战Google深度学习框架 第五章 5.2.1Minister数字识别 源代码

九大深度学习框架

深度学习框架比较,我该选择哪一个?

分享 :深度学习框架比较,我该选择哪一个?

原创 | 深度学习框架比较,我该选择哪一个?