深度学习实战篇之 ( 八) -- TensorFlow学习之路(五)

2022-06-01 20:09:29 浏览数 (1)

科普篇

CPU:Central Processing Unit中央处理器,是一台计算机的运算核心和控制核心,

GRU:Graphic Processing Unit图形处理器,一个专门的图形核心处理器,GRU是显示卡的“大脑”,决定了该显卡的档次和大部分性能

CPU虽然有多核,但一般也就几个,每个核都有足够大的缓存和足够多的数字和逻辑运算单元,需要很强的通用性处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分歧跳转和中断处理,并辅助很多加速分支判断甚至更复杂的逻辑判断的硬件。这些都使得CPU的内部结构异常复杂,而GPU面对的则是类型高度统一的、相互依赖的大规模数据和不需要被打断的纯净的计算环境

GPU的核数远超过CPU,被称为众核,每个核拥有的缓存大小相对小,数字逻辑运算单元也少而简单,面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。GPU的工作大部分是这样的:计算量大,但没什么技术含量,而且要重复很多很多次。

前言

前面我们学习了深度学习图像分类任务的模型搭建,也就是网络层次的构建,今天,我们紧接着来学习神经网络是如何训练和验证的。

一、模型训练

神经网络模型的训练过程:首先网络初始化,得出第一次的输出结果,然后将输出结果和真实的标签传递给损失函数,损失函数计算出当前的损失,根据当前损失进行反向梯度计算,得出梯度后更新当前的所有权重值,也就是网络中的各种变量,即卷积一类网络层的参数。

其实,对于以上步骤我们从逻辑上得出过程,首先,之前我们已经进行了数据处理,得到了批处理数据和其标签,随后进行了网络模型搭建,那么下一步就是将数据进行传入网络进行训练,进行训练之前,肯定需要进行变量初始化,不然神经元的值无法确定。这需要根据每一次的训练结果进行更新,因此第一次初始化就需要进行手动指定参数初始化的方式(有随机初始化,满足一定概率分布的初始化等等),初始化之后就有了权重,即可以进行第一次前向计算,根据这个计算得出的结果与当前的标签进行比较(结果与标签同时传入损失函数中),即可得出当前的损失值,根据损失值进行梯度计算,从而进行反向更新,随后进行下一次前向计算(这个时候神经网络中的权重已经被梯度更新公式进行了改变)。

1.全局变量初始化

代码语言:javascript复制
# 所有节点初始化,一句代码即可
sess.run(tf.global_variables_initializer())

2.损失函数

代码语言:javascript复制
# loss计算
# 传入参数:logits,网络计算输出值。labels,真实值,
#在这里是0或者1
# 返回参数:loss,损失值


def losses(logits, labels):
    with tf.variable_scope('loss') as scope:
        # 采用sparse_softmax_cross_entropy_with_logits 
        #交叉熵损失函数进行损失值计算
        cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels,
                                                                       name='xentropy_per_example')
        # print("ncross_entropy:{},cross_entropy.shape:{}".format(cross_entropy,cross_entropy.shape))
        print("---------cross_entropy:{}".format(cross_entropy))
        # 对一个batch的loss取平均值 作为当前批数据的loss值
        loss = tf.reduce_mean(cross_entropy, name='loss')
        # loss保存,方便后期查看训练曲线
        tf.summary.scalar(scope.name   '/loss', loss)
    return loss

3.反向传播

代码语言:javascript复制
# loss损失值优化
# 输入参数:loss。learning_rate,学习速率。
# 返回参数:train_op,训练op,这个参数要输入sess.run中让模型去训练。
def trainning(loss, learning_rate):
    with tf.name_scope('optimizer'):
        # 采用AdamOptimizer优化器进行更好的梯度更新
        optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
        global_step = tf.Variable(0, name='global_step', trainable=False)
        # 更新方式为最小化loss值
        train_op = optimizer.minimize(loss, global_step=global_step)
    return train_op

二、模型验证

模型训练过程中的验证,主要是准确率和损失值的验证,准确率包含了训练集和验证集的,观察准确率是否在稳步提升,同时观察损失值是否稳步下降。

准确率计算

代码语言:javascript复制
# -----------------------------------------------------------------------
# 评价/准确率计算
# 输入参数:logits,网络计算值。labels,标签,也就是真实值,在这里是0或者1。
# 返回参数:accuracy,当前step的平均准确率,也就是在这些batch中多少张图片被正确分类了。
def evaluation(logits, labels):
    # 计算当前batch的准确率
    with tf.variable_scope('accuracy') as scope:
        # 对每一个样本的预测值取最大的一个值与当前标签比较
        # 正确就返回True,错误就返回False
        correct = tf.nn.in_top_k(logits, labels, 1)
        correct = tf.cast(correct, tf.float16)
        #当前batch的准确率取平均值
        accuracy = tf.reduce_mean(correct)
        tf.summary.scalar(scope.name   '/accuracy', accuracy)
    return accuracy

训练过程中打印训练情况

结语

本次文章主要分享了模型训练过程中的权重初始化和损失函数构建以及模型准确率评判,下一期文章,小编将会分享数据是如何传入网络中,以及如何查看模型的训练结果,同时会采用实际的训练效果来展示给大家,以便清晰的观察acc和loss的变化情况,同时保存训练模型用于后期的模型预测。

各位老铁,周末愉快!

编辑:玥怡居士|审核:小圈圈居士

0 人点赞