TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络

转载请注明作者:梦里风林
Github工程地址:https://github.com/ahangchen/GDLnotes
欢迎star,有问题可以到Issue区讨论
官方教程地址
视频/字幕下载

全连接神经网络

辅助阅读:TensorFlow中文社区教程 - 英文官方教程

代码见:full_connect.py

Linear Model

  • 加载lesson 1中的数据集
  • 将Data降维成一维,将label映射为one-hot encoding

    def reformat(dataset, labels):
    dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)
    # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]
    labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32)
    return dataset, labels

    TensorFlow Graph

  • 使用梯度计算train_loss,用tf.Graph()创建一个计算单元
  • 用tf.constant将dataset和label转为tensorflow可用的训练格式(训练中不可修改)
  • 用tf.truncated_normal生成正太分布的数据,作为W的初始值,初始化b为可变的0矩阵
  • 用tf.variable将上面的矩阵转为tensorflow可用的训练格式(训练中可以修改)
  • 用tf.matmul实现矩阵相乘,计算WX+b,这里实际上logit只是一个变量,而非结果
  • 用tf.nn.softmax_cross_entropy_with_logits计算WX+b的结果相较于原来的label的train_loss,并求均值
  • 使用梯度找到最小train_loss

      optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
  • 计算相对valid_dataset和test_dataset对应的label的train_loss

上面这些变量都是一种Tensor的概念,它们是一个个的计算单元,我们在Graph中设置了这些计算单元,规定了它们的组合方式,就好像把一个个门电路串起来那样

TensorFLow Session

Session用来执行Graph里规定的计算,就好像给一个个门电路通上电,我们在Session里,给计算单元冲上数据,That’s Flow.

  • 重复计算单元反复训练800次,提高其准确度
  • 为了快速查看训练效果,每轮训练只给10000个训练数据(subset),恩,每次都是相同的训练数据
  • 将计算单元graph传给session
  • 初始化参数
  • 传给session优化器 - train_loss的梯度optimizer,训练损失 - train_loss,每次的预测结果,循环执行训练
  with tf.Session(graph=graph) as session:
        tf.initialize_all_variables().run()
        for step in range(num_steps):
            _, l, predictions = session.run([optimizer, loss, train_prediction])
  • 在循环过程中,W和b会保留,并不断得到修正
  • 在每100次循环后,会用验证集进行验证一次,验证也同时修正了一部分参数

      valid_prediction.eval()
  • 最后用测试集进行测试
  • 注意如果lesson 1中没有对数据进行乱序化,可能训练集预测准确度很高,验证集和测试集准确度会很低

这样训练的准确度为83.2%

SGD

  • 每次只取一小部分数据做训练,计算loss时,也只取一小部分数据计算loss
  • 对应到程序中,即修改计算单元中的训练数据,
    • 每次输入的训练数据只有128个,随机取起点,取连续128个数据:

        offset = (step * batch_size) % (train_labels.shape[0] - batch_size)
        batch_data = train_dataset[offset:(offset + batch_size), :]
        batch_labels = train_labels[offset:(offset + batch_size), :]
  • 由于这里的数据是会变化的,因此用tf.placeholder来存放这块空间

      tf_train_dataset = tf.placeholder(tf.float32,
                                          shape=(batch_size, image_size * image_size))
      tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
  • 计算3000次,训练总数据量为384000,比之前8000000少

准确率提高到86.5%,而且准确率随训练次数增加而提高的速度变快了

神经网络

  • 上面SGD的模型只有一层WX+b,现在使用一个RELU作为中间的隐藏层,连接两个WX+b
  • 仍然只需要修改Graph计算单元为

      Y = W2 * RELU(W1*X + b1) + b2
  • 为了在数学上满足矩阵运算,我们需要这样的矩阵运算:

      [n * 10] = RELU([n * 784] · [784 * N] + [n * N]) · [N * 10] + [n * 10]  
  • 这里N取1024,即1024个隐藏结点
  • 于是四个参数被修改

      weights1 = tf.Variable(
            tf.truncated_normal([image_size * image_size, hidden_node_count]))
      biases1 = tf.Variable(tf.zeros([hidden_node_count]))
      weights2 = tf.Variable(
            tf.truncated_normal([hidden_node_count, num_labels]))
      biases2 = tf.Variable(tf.zeros([num_labels]))
  • 预测值计算方法改为

      ys = tf.matmul(tf_train_dataset, weights1) + biases1
      hidden = tf.nn.relu(ys)
      logits = tf.matmul(hidden, weights2) + biases2
  • 计算3000次,可以发现准确率一开始提高得很快,后面提高速度变缓,最终测试准确率提高到88.8%

深度神经网络实践

代码见nn_overfit.py

优化

Regularization

在前面实现的RELU连接的两层神经网络中,加Regularization进行约束,采用加l2 norm的方法,进行调节:

代码实现上,只需要对tf_sgd_relu_nn中train_loss做修改即可:

  • 可以用tf.nn.l2_loss(t)对一个Tensor对象求l2 norm
  • 需要对我们使用的各个W都做这样的计算(参考tensorflow官方example

    l2_loss = tf.nn.l2_loss(weights1) + tf.nn.l2_loss(weights2)
  • 添加到train_loss上
  • 这里还有一个重要的点,Hyper Parameter: β
  • 我觉得这是一个拍脑袋参数,取什么值都行,但效果会不同,我这里解释一下我取β=0.001的理由
  • 如果直接将l2_loss加到train_loss上,每次的train_loss都特别大,几乎只取决于l2_loss
  • 为了让原本的train_loss与l2_loss都能较好地对参数调整方向起作用,它们应当至少在同一个量级
  • 观察不加l2_loss,step 0 时,train_loss在300左右
  • 加l2_loss后, step 0 时,train_loss在300000左右
  • 因此给l2_loss乘0.0001使之降到同一个量级

      loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels)) + 0.001 * l2_loss
  • 所有其他参数不变,训练3000次,准确率提高到92.7%
  • 黑魔法之所以为黑魔法就在于,这个参数可以很容易地影响准确率,如果β = 0.002,准确率提高到93.5%

OverFit问题

在训练数据很少的时候,会出现训练结果准确率高,但测试结果准确率低的情况

  • 缩小训练数据范围:将把batch数据的起点offset的可选范围变小(只能选择0-1128之间的数据):

    offset_range = 1000
    offset = (step * batch_size) % offset_range
  • 可以看到,在step500后,训练集就一直是100%,验证集一直是77.6%,准确度无法随训练次数上升,最后的测试准确度是85.4%

DropOut

采取Dropout方式强迫神经网络学习更多知识

参考aymericdamien/TensorFlow-Examples中dropout的使用

  • 我们需要丢掉RELU出来的部分结果
  • 调用tf.nn.dropout达到我们的目的:

    keep_prob = tf.placeholder(tf.float32)
    if drop_out:
    hidden_drop = tf.nn.dropout(hidden, keep_prob)
    h_fc = hidden_drop
  • 这里的keep_prob是保留概率,即我们要保留的RELU的结果所占比例,tensorflow建议的语法是,让它作为一个placeholder,在run时传入
  • 当然我们也可以不用placeholder,直接传一个0.5:

    if drop_out:
    hidden_drop = tf.nn.dropout(hidden, 0.5)
    h_fc = hidden_drop
  • 这种训练的结果就是,虽然在step 500对训练集预测没能达到100%(起步慢),但训练集预测率达到100%后,验证集的预测正确率仍然在上升
  • 这就是Dropout的好处,每次丢掉随机的数据,让神经网络每次都学习到更多,但也需要知道,这种方式只在我们有的训练数据比较少时很有效
  • 最后预测准确率为88.0%

Learning Rate Decay

随着训练次数增加,自动调整步长

  • 在之前单纯两层神经网络基础上,添加Learning Rate Decay算法
  • 使用tf.train.exponential_decay方法,指数下降调整步长,具体使用方法官方文档说的特别清楚
  • 注意这里面的cur_step传给优化器,优化器在训练中对其做自增计数
  • 与之前单纯两层神经网络对比,准确率直接提高到90.6%

Deep Network

增加神经网络层数,增加训练次数到20000

  • 为了避免修改网络层数需要重写代码,用循环实现中间层

    # middle layer
    for i in range(layer_cnt - 2):
     y1 = tf.matmul(hidden_drop, weights[i]) + biases[i]
     hidden_drop = tf.nn.relu(y1)
     if drop_out:
         keep_prob += 0.5 * i / (layer_cnt + 1)
         hidden_drop = tf.nn.dropout(hidden_drop, keep_prob)
  • 初始化weight在迭代中使用

    for i in range(layer_cnt - 2):
     if hidden_cur_cnt > 2:
         hidden_next_cnt = int(hidden_cur_cnt / 2)
     else:
         hidden_next_cnt = 2
     hidden_stddev = np.sqrt(2.0 / hidden_cur_cnt)
     weights.append(tf.Variable(tf.truncated_normal([hidden_cur_cnt, hidden_next_cnt], stddev=hidden_stddev)))
     biases.append(tf.Variable(tf.zeros([hidden_next_cnt])))
     hidden_cur_cnt = hidden_next_cnt
  • 第一次测试时,用正太分布设置所有W的数值,将标准差设置为1,由于网络增加了一层,寻找step调整方向时具有更大的不确定性,很容易导致loss变得很大
  • 因此需要用stddev调整其标准差到一个较小的范围(怎么调整有许多研究,这里直接找了一个来用)

  stddev = np.sqrt(2.0 / n)
  • 启用regular时,也要适当调一下β,不要让它对原本的loss造成过大的影响
  • DropOut时,因为后面的layer得到的信息越重要,需要动态调整丢弃的比例,到后面的layer,丢弃的比例要减小

    keep_prob += 0.5 * i / (layer_cnt + 1)
  • 训练时,调节参数,你可能遇到消失(或爆炸)的梯度问题
    训练到一定程度后,梯度优化器没有什么作用,loss和准确率总是在一定范围内徘徊
  • 官方教程表示最好的训练结果是,准确率97.5%,
  • 我的nn_overfit.py开启六层神经网络,
    启用Regularization、DropOut、Learning Rate Decay,
    训练次数20000(应该还有再训练的希望,在这里虽然loss下降很慢了,但仍然在下降),训练结果是,准确率95.2%

深度学习经典trick汇总 trick这个词或许有投机取巧的意味,但深度学习论文中出现的很多这个trick确实对模型更方面性能有所提高,而且它们中的很多还具有普适性,那么这种“trick“或许应该被叫“技术”。 阅读详情

相关推荐

机器人行人识别跟随 (OPENCV DNN Tensorflow ROS)(只有链接)

OpenPose 基于OpenCV DNN 的多人姿态估计 基于OpenCV使用OpenPose进行多个人体姿态估计 Opencv之HOG特征SVM相结合的人体检测 行人检测 基于 OpenCV 的人体检测 基于opencv的行人检测(支持图片,视频) opencv︱opencv中实现行人检测:HOG+SVM(二) Tensorflow+OpenCV实战行人检测(笔记) 基于Tensorflow和Opencv的行人检测 细致 行人检测--OpenCVTensorFlow SSD对比...

light169的专栏 3655

【Keras】Keras入门指南

https://www.jianshu.com/p/e9c1e68a615e 参考资料 keras中文文档(官方) keras中文文档(非官方) 莫烦keras教程代码 莫烦keras视频教程 一些keras的例子 Keras开发者的github keras在imagenet以及VGG19上的应用 一个不负责任的Keras介绍(上) 一个不负责任的Keras介绍(中) 一个不...

zzx3163967592的博客 890

TensorFlow 深度学习 | Python 使用 TensorFlow 读取 CSV 文件并训练 DNN 模型

使用 Python 和 TensorFlow 从 CSV 文件读取数据并训练 DNN 模型,涵盖二分类和多分类任务。

Kant2048的博客 1111

深度学习深度学习刷SOTA的一堆trick

一般通用的trick都被写进论文和代码库里了,像优秀的优化器,学习率调度方法,数据增强,dropout,初始化,BN,LN,确实是调参大师的宝贵经验,大家平常用的也很多。这里主要有几个,我们分成三部分,稳定有用型trick,场景受限型trick,性能加速型trick。稳定有用型trick0.模型融合懂得都懂,打比赛必备,文章没卵用的人人皆知trick,早年模型小的时候还...

fengdu78的博客 811

深度学习模型训练调参的tricks总结

学习率是一个非常非常重要的超参数,这个参数呢,面对不同规模、不同batch-size、不同优化方式、不同数据集,其最合适的值都是不确定的,我们无法光凭经验来准确地确定lr的值,我们唯一可以的,就是在训练中不断寻找最合适当前状态的学习率。比如下图利用fastai中的lr_find()函数寻找合适的学习率,根据下方的学习率-损失曲线得到此时合适的学习率为1e-2。

ytusdc的博客 7848

Google深度学习笔记 TensorFlow实现优化深度神经网络

Google深度学习笔记 TensorFlow实现优化深度神经网络

梦里风林的专栏 5562

TensorFlow深度学习笔记 实现优化深度神经网络

Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 Google深度学习 官方教程地址 视频/字幕下载 全连接神经网络 辅助阅读:TensorFlow中文社区教程 - 英文官方教程 代码见:full_connect.py Linear Model 加载lesson 1中的

技术博客 4166

《学习《推荐系统深度学习》读书笔记1》

2019.10.11至2019.10.13期间,自己阅读了《推荐系统深度学习》这本书。通过对书中的内容的学习,自己了解和掌握了推荐系统的基本知识、算法和架构。下面,自己将按照书中的内容顺序对每章的内容进行整理。 第一章 什么是推荐系统(对相关内容的简介) 1.1 推荐算法和系统 基于内容的推荐算法:涉及TF-IDF。 主流推荐算法:基于协同过滤的推荐算法。 ...

PasPerCon 451

【机器学习】基于tensorflow实现你的第一个DNN网络

本文先对tensorflow深度学习框架历史、特点及安装方法进行介绍,接下来基于tensorflow带读者一步步开发一个简单的三层神经网络程序,最后附可执行的代码供读者进行测试学习。个人感觉tensorflow封装程度高于pytorch,网络结构也更加清晰,但pytorch更加透明。

人工智能领域博客 4537

深度学习】最强算法之:深度神经网络(DNN)

深度学习必会之:深度神经网络DNN

商务合作 | 面试培训 | 职场规划 ==>主页扫码 8151

深度神经网络Python实现:DNN.py全解析

TensorFlow是由谷歌开发的开源机器学习框架,首个版本在2015年发布,迅速成为业界首选的深度学习平台。TensorFlow的设计理念是使模型的构建、训练和部署能够无缝进行,同时提供跨平台支持,包括桌面操作系统和移动设备。随着技术的演进,TensorFlow经历了多个版本的更新,尤其在2019年发布的TensorFlow 2.x,该版本引入了eager execution模式,使得编写代码的方式更接近传统的Python开发体验,极大地提升了易用性。

weixin_30591519的博客 1208

DL之DNN优化技术:GD、SGD、Momentum、NAG、Ada系列、RMSProp各种代码实现之详细攻略

DL之DNN优化技术:GD、SGD、Momentum、NAG、Ada系列、RMSProp各种代码实现之详细攻略 相关文章:An overview of gradient descent optimization algorithmsDL之DNN优化技术:神经网络算法简介之GD/SGD算法(BP的梯度下降算法)的简介、理解、代码实现、SGD缺点及改进(Momentum/NAG/Ada系列/R...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 6174

自然语言处理之语音识别:深度神经网络(DNN):深度学习框架工具

TensorFlow是由Google开发的开源软件库,用于数值计算和机器学习。它通过数据流图(data flow graphs)来表示计算,使得模型可以在各种硬件上运行,包括CPU、GPU和TPU。TensorFlow支持多种编程语言,如Python、C++、Java等,但Python是最常用的语言。PyTorch是一个基于Torch的Python开源机器学习库,由Facebook的人工智能研究实验室开发。它提供了动态计算图,使得模型构建更加直观和灵活。

zhubeibei168的博客 1264
上一篇: self和__init__的含义 + 为何要有self和__init__
下一篇: numpy的矩阵运算笔记
CorrerLola
博客等级 码龄16年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值