头图

教程总体简介:在职高新课-深度学习 要求 目标 环境要求 1.1 深度学习介绍 学习目标 1.1.1 区别 1.1.3 深度学习代表算法-神经网络 1.1.4 为什么深度学习现在效果非常好 深度学习与神经网络 1.2 神经网络基础 循环神经网络 4.2 词嵌入与NLP 4.3 seq2seq与Attention机制 5.1 生成对抗网络(GAN) 高级主题 5.2 自动编码器 5.3 CapsuleNet(了解) 1.3 浅层神经网络 深度学习进阶 2.1 多分类与TensorFlow 2.2 梯度下降算法改进 2.4 BN与神经网络调优 3.1 图像数据与边缘检测 3.2 卷积神经网络(CNN)原理 3.3 经典分类网络结构 3.5 CNN网络实战技巧

完整笔记资料代码:https://gitee.com/yinuo112/AI/tree/master/深度学习/嘿马深度学...

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

深度学习进阶

知道softmax回归的原理
应用softmax_cross_entropy_with_logits实现softamx以及交叉熵损失计算
应用matmul实现多隐层神经网络的计算
应用TensorFlow完成Mnist手写数字势识别

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

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

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

2.1 多分类与TensorFlow

学习目标

  • 目标

    • 知道softmax回归的原理
    • 应用softmax_cross_entropy_with_logits实现softamx以及交叉熵损失计算
    • 应用matmul实现多隐层神经网络的计算
  • 应用

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

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

2.1.1 Softmax 回归

对于多分类问题,用 N表示种类个数,那么神经网络的输出层的神经元个数必须为L[output]=N, 每个神经元的输出依次对应属于N个类别当中某个具体类别的概率,即<span>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)</span>

输出层即:

<span>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]​​</span>

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

<span>ai[L]=eZi[L]∑i=1CeZi[L]a^{[L]}_i = \frac{e^{Z^{[L]}_i}}{\sum^C_{i=1}e^{Z^{[L]}_i}}a​i​[L]​​=​∑​i=1​C​​e​Z​i​[L]​​​​​​e​Z​i​[L]​​​​​​</span><span>∑i=1Cai[L]=1\sum^C_{i=1}a^{[L]}_i = 1∑​i=1​C​​a​i​[L]​​=1</span>

2.1.2 交叉熵损失

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

<span>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​​</span>

总损失函数可以记为<span>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)</span>

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

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

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

上图改样本的损失值为:

<span>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)</span>

注:关于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 主网络搭建流程
  • 获取数据
mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)
  • 定义数据占位符,Mnist数据实时提供给placeholder
  
  
# 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])
  • 两层神经元网络结果计算
  
  
# 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
  • 损失计算与优化
  
  
# 3、softmax回归以及交叉熵损失计算
  
  
    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"):

        # 学习率
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
2.1.3.9 完善模型功能
  • 1、增加准确率计算
  • 2、增加变量tensorboard显示
  • 3、增加模型保存加载
  • 4、增加模型预测结果输出
如何计算准确率

  • equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))
  • accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
  • 模型评估(计算准确性)
  
  
# 5、得出每次训练的准确率(通过真实值和预测值进行位置比较,每个样本都比较)
  
  
    with tf.variable_scope("accuracy"):

        equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))

        accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

增加变量tensorboard显示
  • 在会话外当中增加以下代码
  
  
# (1)、收集要显示的变量
  
  
    # 先收集损失和准确率
    tf.summary.scalar("losses", loss)
    tf.summary.scalar("acc", accuracy)

    # 维度高的张量值
    tf.summary.histogram("w1", weight_1)
    tf.summary.histogram("b1", bias_1)
    # 维度高的张量值
    tf.summary.histogram("w2", weight_2)
    tf.summary.histogram("b2", bias_2)

    # 初始化变量op
    init_op = tf.global_variables_initializer()

    # (2)、合并所有变量op
    merged = tf.summary.merge_all()
  • 在会话当中去创建文件写入每次的变量值
  
  
# (1)创建一个events文件实例
  
  
file_writer = tf.summary.FileWriter("./tmp/summary/", graph=sess.graph)

  
  
# 运行合变量op,写入事件文件当中
  
  
summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})

file_writer.add_summary(summary, i)
增加模型保存加载

创建Saver,然后保存

  
  
# 创建模型保存和加载
  
  
saver = tf.train.Saver()

  
  
# 每隔100步保存一次模型
  
  
if i % 100 == 0:

    saver.save(sess, "./tmp/modelckpt/fc_nn_model")

在训练之前加载模型

  
  
# 加载模型
  
  
if os.path.exists("./tmp/modelckpt/checkpoint"):

程序员一诺python
16 声望18 粉丝

python技术发烧友 资料收集狂