【深度学习】嘿马深度学习系统性知识教程第3篇:深度学习进阶,2.1 多分类与TensorFlow【附代码文档】

举报
程序员一诺python 发表于 2025/07/14 22:04:31 2025/07/14
【摘要】 本教程的知识点为:

教程总体简介:在职高新课-深度学习、1.1 深度学习介绍、深度学习与神经网络、1.2 神经网络基础、循环神经网络、4.2 词嵌入与NLP、4.3 seq2seq与Attention机制、总结、每日作业、5.1 生成对抗网络(GAN)、高级主题、5.2 自动编码器、5.3 CapsuleNet(了解)、1.3 浅层神经网络、1.4 深层神经网络、深度学习进阶、2.1 多分类与TensorFlow、2.2 梯度下降算法改进、2.3 深度学习正则化、2.4 BN与神经网络调优、2.5 总结、2.6 每日作业、卷积神经网络、3.1 图像数据与边缘检测、3.2 卷积神经网络(CNN)原理、3.3 经典分类网络结构、3.5 CNN网络实战技巧、4.1 循环神经网络

https://bbs.huaweicloud.com/blogs/454418


全套教程部分目录:

深度学习进阶

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
知道softmax回归的原理
应用softmax_cross_entropy_with_logits实现softamx以及交叉熵损失计算
应用matmul实现多隐层神经网络的计算
应用TensorFlow完成Mnist手写数字势识别

了解深度学习遇到的一些问题
知道批梯度下降与MiniBatch梯度下降的区别
知道指数加权平均的意义
知道动量梯度RMSPropAdam算法的公式意义
知道学习率衰减方式
知道参数初始化策略的意义

了解偏差与方差的意义
知道L2正则化与L1正则化的数学意义
知道Droupout正则化的方法
了解早停止法数据增强法的其它正则化方式

知道常用的一些神经网络超参数
知道BN层的意义以及数学原理

2.1 多分类与TensorFlow

学习目标

  • 目标

  • 知道softmax回归的原理

  • 应用softmax_cross_entropy_with_logits实现softamx以及交叉熵损失计算
  • 应用matmul实现多隐层神经网络的计算

  • 应用

  • 应用TensorFlow完成Mnist手写数字势识别

到目前为止,我们所接触的都是二分类问题,神经网络输出层只有一个神经元,表示预测输出y^\hat{y}​y​^​​P(y=1∣x),y^>0.5{P}(y=1|x), \hat{y} > {0.5}P(y=1∣x),​y​^​​>0.5

2.1.1 Softmax 回归

对于多分类问题,用 N表示种类个数,那么神经网络的输出层的神经元个数必须为L[output]=N, 每个神经元的输出依次对应属于N个类别当中某个具体类别的概率,即P(y=N1∣x),..,P(y=Nn∣x)P(y=N_1|x),..,P(y=N_n|x)P(y=N​1​​∣x),..,P(y=N​n​​∣x)

输出层即:

Z[L]=W[L]a[L−1]+b[L]Z^{[L]} = W^{[L]}a^{[L-1]} + b^{[L]}Z​[L]​​=W​[L]​​a​[L−1]​​+b​[L]​​

需要对所有的输出结果进行一下softmax公式计算:

ai[L]=eZi[L]∑i=1CeZi[L]a^{[L]}i = \frac{e^{Z^{[L]}_i}}{\sum^Ce^{Z^{[L]}i}}a​i​[L]​​=​∑​i=1​C​​e​Z​i​[L]​​​​​​e​Z​i​[L]​​​​​​∑i=1Cai[L]=1\sum^Ca^{[L]}_i = 1∑​i=1​C​​a​i​[L]​​=1

2.1.2 交叉熵损失

对于softmax回归(逻辑回归代价函数的推广,都可称之为交叉熵损失),它的代价函数公式为:

L(y^,y)=−∑j=1Cyjlogy^jL(\hat y, y) = -\sum^C_{j=1}y_jlog\hat y_jL(​y​^​​,y)=−∑​j=1​C​​y​j​​log​y​^​​​j​​

总损失函数可以记为J=1m∑i=1mL(y^,y)J = \frac{1}{m}\sum^m_{i=1}L(\hat y, y)J=​m​​1​​∑​i=1​m​​L(​y​^​​,y)

逻辑回归的损失也可以这样表示,:

所以与softmax是一样的,一个二分类一个多分类衡量。

对于真实值会进行一个one-hot编码,每一个样本的所属类别都会在某个类别位置上标记。

上图改样本的损失值为:

0log(0.10)+0log(0.05)+0log(0.15)+0log(0.10)+0log(0.05)+0log(0.20)+1log(0.10)+0log(0.05)+0log(0.10)+0log(0.10)0log(0.10)+0log(0.05)+0log(0.15)+0log(0.10)+0log(0.05)+0log(0.20)+1log(0.10)+0log(0.05)+0log(0.10)+0log(0.10)0log(0.10)+0log(0.05)+0log(0.15)+0log(0.10)+0log(0.05)+0log(0.20)+1log(0.10)+0log(0.05)+0log(0.10)+0log(0.10)

注:关于one_hot编码

框架使用

  • 便于编程:包括神经网络的开发和迭代、配置产品;

  • 运行速度:特别是训练大型数据集时;

目前最火的深度学习框架大概是 Tensorflow 了。Tensorflow 框架内可以直接调用梯度下降算法,极大地降低了编程人员的工作量。例如以下代码:

2.1.3 案例:Mnist手写数字识别神经网络实现

2.1.3.1 数据集介绍

文件说明:

  • train-images-idx3-ubyte.gz: training set images (9912422 bytes)
  • train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
  • t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
  • t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

    网址:[

2.1.3.2 特征值

2.1.3.3 目标值

2.1.3.4 Mnist数据获取API

TensorFlow框架自带了获取这个数据集的接口,所以不需要自行读取。

  • from tensorflow.examples.tutorials.mnist import input_data

  • mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

    • mnist.train.next_batch(100)(提供批量获取功能)
    • mnist.train.images、labels
    • mnist.test.images、labels

2.1.3.5 网络设计

我们采取两个层,除了输入层之外。第一个隐层中64个神经元,最后一个输出层(全连接层)我们必须设置10个神经元的神经网络。

2.1.3.6 全连接层计算

  • tf.matmul(a, b,name=None)+bias

  • return:全连接结果,供交叉损失运算

  • tf.train.GradientDescentOptimizer(learning_rate)

  • 梯度下降

  • learning_rate:学习率
  • method:

    • minimize(loss):最小优化损失

2.1.3.7 前期确定事情与流程

  • 确定网络结构以及形状

  • 第一层参数:输入:x [None, 784] 权重:[784, 64] 偏置[64],输出[None, 64]

  • 第二层参数:输入:[None, 64] 权重:[64, 10] 偏置[10],输出[None, 10]

  • 流程:

  • 获取数据

  • 前向传播:网络结构定义
  • 损失计算
  • 反向传播:梯度下降优化

  • 功能完善

  • 准确率计算

  • 添加Tensorboard观察变量、损失变化
  • 训练模型保存、模型存在加载模型进行预测

2.1.3.8 主网络搭建流程

  • 获取数据
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)
  • 定义数据占位符,Mnist数据实时提供给placeholder
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1、准备数据




# x [None, 784] y_true [None. 10]


with tf.variable_scope("mnist_data"):

    x = tf.placeholder(tf.float32, [None, 784])

    y_true = tf.placeholder(tf.int32, [None, 10])
  • 两层神经元网络结果计算
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 2、全连接层神经网络计算


    # 类别:10个类别  全连接层:10个神经元
    # 参数w: [784, 10]   b:[10]
    # 全连接层神经网络的计算公式:[None, 784] * [784, 10] + [10] = [None, 10]
    # 随机初始化权重偏置参数,这些是优化的参数,必须使用变量op去定义
    # 要进行全连接层的矩阵运算 [None, 784]*[784, 64] + [64] = [None,64]
    # [None, 64]*[64, 10] + [10] = [None,10]
    with tf.variable_scope("fc_model"):
         # 第一层:随机初始化权重和偏置参数,要使用变量OP 定义
        weight_1 = tf.Variable(tf.random_normal([784, 64], mean=0.0, stddev=1.0),
                             name="weightes_1")

        bias_1 = tf.Variable(tf.random_normal([64], mean=0.0, stddev=1.0),
                           name='biases_1')

        # 第二层:随机初始化权重和偏置参数,要使用变量OP 定义
        weight_2 = tf.Variable(tf.random_normal([64, 10], mean=0.0, stddev=1.0),
                             name="weightes_2")

        bias_2 = tf.Variable(tf.random_normal([10], mean=0.0, stddev=1.0),
                           name='biases_2')

        # 全连接层运算
        # 10个神经元
        # y_predict = [None,10]
        y1 = tf.matmul(x, weight_1) + bias_1

        y_predict = tf.matmul(y1, weight_2) + bias_2
  • 损失计算与优化 ```python

3、softmax回归以及交叉熵损失计算

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
with tf.variable_scope("softmax_crossentropy"):

    # labels:真实值 [None, 10]  one_hot
    # logits:全脸层的输出[None,10]
    # 返回每个样本的损失组成的列表
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,
                                                                  logits=y_predict))

# 4、梯度下降损失优化
with tf.variable_scope("optimizer"):

    # 学习率
    tra
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。