【Tensorflow 入门与实战】不推荐

这本书比较基础,而且大家的评价都不高。


更新历史

  • 2020.02.18:重新上线
  • 2019.03.31:完成重读与读后感
  • 2018.12.06:于高铁上

读后感

这本书比较基础,而且大家的评价都不高。但是因为我水平不高,所以很多地方还是可以学到一些基础的操作,我觉得这个就很好。当然,这本书就不推荐。很多代码还运行不了

阅读笔记

第 1 章 初识 Tensorflow

常见的几个框架:

  • Tensorflow
  • Caffe(后于 Torch 合并为 PyTorch)
  • MXNet
  • Torch
  • Theano(已不维护)
  • CNTK

第 3 章 Tensorflow 基础

  • 先将所有的操作表达成一张图,然后完成前向、后向的计算。
  • 静态框架:Tensorflow, MXNet, Theano
  • 动态框架:Torch, DyNet, Chainer
  • 图的构架+图的执行,都在会话 session 中完成
  • placeholder 占用的变量必须通过 feed_dict 参数传递进去

Tensorboard 技巧

  • 比较两个训练过程 tensorboard --logdir=model1:model1_dir,model2:model2_dir

第 4 章 深度神经网络基础

  • 要计算损失函数对权值和偏置的偏导数,可以转换为计算每一层每个节点的“残差”
  • 普通的随机梯度下降算法的不足
    • 很难选择一个适当的学习率
    • 可以使用特定规则调整学习率,但无法适应数据集的特征
    • 相同的学习率适用于所有参数更新。如果数据稀疏且特征又区别很大,可能训练到一个阶段时,部分参数需要采用较小的学习率来调整,另外一部分参数需要较大的学习率来调整。如果都采用相同的学习率,可能会让最终结果无法收敛比较好的结果
    • 容易陷入到“鞍点”,即梯度在所有方向上是零,但并不是一个最小点,甚至也不是一个局部最小点,类似马鞍的中间
  • 基于冲量的优化算法(Momentum):在原来的更新参数的基础上增加了“加速度”的概念,在某些程度上减少陷入局部最小优化点的概率
  • Adagrad 优化算法:根据参数自适应地更新学习率,对于不频繁更新的参数做较大更新,而对于频繁变化的参数做较小更新。非常适合处理稀疏数据,极大提高健壮性。不需要手动调整学习率,直接使用默认的 0.01 即可。主要缺点是在分母上积累的梯度的平方,导致学习率退化,最终变得非常小
  • Adadelta 优化算法:是 Adagrad 的扩展,可以减小激进单调地降低学习率的程度。Adadelta 把累加前面梯度窗口 w 限制在某个固定的大小上,而不是累加所有过去梯度的平方。与之类似的又 RMSProp 算法
  • Adam 优化算法(Adaptive Moment Estimation):另一个计算各个参数的自适应学习率的方法,一般来说最好用。
  • Ftrl 优化算法:主要用于数据维度巨大并且数据很稀疏的参数更新,比如:广告点击预测、股票数据分析等引用。主要特点是将接近 0 的权重直接置为 0,从而简化计算。

注意,在 Mac 下运行会报错 RuntimeError: Python is not installed as a framework,解决方法:在 ~/.matplotlib 文件下创建一个名为matplotlibrc 的文件,内容是:backend: TkAgg,然后重新打开一个 shell 即可

第 5 章 卷积神经网络

随着卷积神经网络的训练,这些卷积核未来在训练数据上得到更好的效果,就回自动调整卷积核中的参数,这个过程是自动的,称作特征学习。特征学习自动适配新的任务:我们只需要在新数据上训练一下,自动找出新的过滤器即可,不再需要繁重的特征工程。

  • 卷积神经网络基础
    • 局部感知野:一层中的节点不必和前面一层所有节点相连,只需要连接部分
    • 参数共享:每一层节点对上一次节点中的局部连接的参数都是一样的
    • 多卷积核:N 个卷积核可以生成 N 种特征。通过卷积核过滤的结果称为特征图(feature map)
    • 池化:将空间上相邻的点进行聚合。一般有平均池化和最大池化
    • 多层卷积:每层做不同的事情
  • 训练过程之反向传播
    • 全连接层:正常残差计算偏导数
    • 池化层:平均池化残差平均传递,最大池化残差传递给最大位置的神经元
    • 卷积层:对卷积核中某个参数的偏导数,就是卷积过程中,和这个参数参与过的计算的每个输入数据和卷积后的残差逐个相乘,然后相加的结果
  • TF 中的操作
    • 一二三维数据的卷积操作 tf.nn.conv1d(), tf.nn.conv2d(), tf.nn.conv3d()
    • 池化操作 tf.nn.max_pool, tf.nn.avg_pool
  • 经典网络
    • AlexNet
    • VGGNet
    • Google Inception Net
    • ResNet

第 6 章 循环神经网络

  • 最简单的 RNN 网络可以理解成,在全连接网络的基础上,在每一层网络中增加一个将自己层的输出连接到自己层的输入。
  • 普通的 RNN 存在梯度消失和梯度爆炸的问题,与层数有关。处理一个 100 长度的序列,相当于一个 100 层的前馈神经网络。
  • LSTM:忘记门、输入门和输出门。一个非常流行的变体是 GRU

中文分词的方式:

  1. 训练字向量
  2. 为了获取上下信息,用前后两个字的字向量拼接本身的字向量得到的向量表示单个字;如果是在一句话的头尾,需要用 PAD 来填充
  3. 每个字最终会被分为 BEMS 中的一个类别,B 表示词开头的字;E 表示词结尾的字;M 表示词中间的字;S 表示单字