深度学习框架(字体识别)
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类中
def defineANN(self):
"""
定义神经网络的结构
"""
# self.input是训练数据里自变量
prevSize = self.input.shape[1].value
prevOut = self.input
# self.size是神经网络的结构,也就是每一层的神经元个数
size = self.size
layer = 1
# 定义隐藏层
for currentSize in size[:-1]:
weights = tf.Variable(
tf.truncated_normal([prevSize, currentSize],
stddev=1.0 / np.sqrt(float(prevSize))))
# 记录隐藏层的模型参数
tf.summary.histogram("hidden%s" % layer, weights)
layer += 1
biases = tf.Variable(tf.zeros([currentSize]))
prevOut = tf.nn.sigmoid(tf.matmul(prevOut, weights) + biases)
prevSize = currentSize
# 定义输出层
weights = tf.Variable(
tf.truncated_normal([prevSize, size[-1]],
stddev=1.0 / np.sqrt(float(prevSize))))
biases = tf.Variable(tf.zeros([size[-1]]))
self.out = tf.matmul(prevOut, weights) + biases
return self
第二步:定义模型损失函数,并在其中加入惩罚项
def defineLoss(self):
"""
定义神经网络的损失函数
"""
# 定义单点损失,self.label是训练数据里的标签变量
loss = tf.nn.softmax_cross_entropy_with_logits(
labels=self.label, logits=self.out, name="loss")
# 定义整体损失
self.loss = tf.reduce_mean(loss, name="average_loss")
return self
第三步:对未知参数做预测
def predict_proba(self, X):
"""
使用神经网络对未知数据进行预测
"""
sess = self.sess
pred = tf.nn.softmax(logits=self.out, name="pred")
prob = sess.run(pred, feed_dict={self.input: X})
return prob
第四步:训练评估模型
def SGD(self, X, Y, learningRate, miniBatchFraction, epoch):
"""
使用随机梯度下降法训练模型
参数
----
X : np.array, 自变量
Y : np.array, 因变量
"""
# 记录训练的细节
tf.summary.scalar("loss", self.loss)
summary = tf.summary.merge_all()
method = tf.train.GradientDescentOptimizer(learningRate)
optimizer= method.minimize(self.loss)
batchSize = int(X.shape[0] * miniBatchFraction)
batchNum = int(np.ceil(1 / miniBatchFraction))
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
summary_writer = tf.summary.FileWriter(self.logPath, graph=tf.get_default_graph())
step = 0
while (step < epoch):
for i in range(batchNum):
batchX = X[i * batchSize: (i + 1) * batchSize]
batchY = Y[i * batchSize: (i + 1) * batchSize]
sess.run([optimizer],
feed_dict={self.input: batchX, self.label: batchY})
step += 1
# 将日志写入文件
summary_str = sess.run(summary, feed_dict={self.input: X, self.label: Y})
summary_writer.add_summary(summary_str, step)
summary_writer.flush()
self.sess = sess
return self
def fit(self, X, Y, learningRate=0.3, miniBatchFraction=0.1, epoch=2500):
"""
训练模型
参数
----
X : np.array, 自变量
Y : np.array, 因变量
"""
self.input = tf.placeholder(tf.float32, shape=[None, X.shape[1]], name="X")
self.label = tf.placeholder(tf.int64, shape=[None, self.size[-1]], name="Y")
self.defineANN()
self.defineLoss()
self.SGD(X, Y, learningRate, miniBatchFraction, epoch)
不关注
就捣蛋
长按上方二维码
以上是关于深度学习框架(字体识别)的主要内容,如果未能解决你的问题,请参考以下文章