Google老师亲授 TensorFlow2.0 入门到进阶 学习笔记 ch2_1

目录

4、分类模型之模型构建

5、数据归一化

6、回调函数

为什么validation的accuracy比train的要高

tensorboard的启动

7、回归模型

为什么我训练的图片没有出现梯度消失?

8、神经网络讲解

激活函数

归一化 VS 批归一化

Dropout

使用droupout之后,泛化能力反而变差了

为什么普通的dropout激活值的分布发生了变化,而alpha不会这样?

bn,激活,droupout,残差连接的顺序?

为什么dropout后参数不变?

丢弃率是通常是0.5的原因

为什么BN可以放在激活函数之前?


4、分类模型之模型构建

根据Relu函数的特点,当输入神经元为负值时,对应梯度为0,导致神经元权重无法更新。

问题(1):是否这种情况下,死亡的神经元在此后的训练中永远不再复活?

答:不是,神经元死亡后是可以复活的,因为其他的神经元可以传梯度下去从而导致下一次的输入发生变化。神经元死亡一般是突然来了一个大的梯度,导致无论怎么微调输入,都无法再使神经元输出为正数,所以神经元无法调整参数,永久死亡。

问题(2):是否可以认为Relu的非线性是通过神经元的死亡带来的,要想引入更多非线性,就要“杀死”更多神经元?

答:不是,因为可以复活,所以<0未必是绝对死亡,但是非线性确实是relu输出为0带来的。

关于relu和leakyrelu的问题

大部分时候差别不大,但是各有优劣:leaky relu能防止dead relu的问题,但是普通的relu可以导致最后的模型激活值比较稀疏(因为有0的存在)。而激活值稀疏对于online learning比较好。参考 https://www.reddit.com/r/MachineLearning/comments/4znzvo/what_are_the_advantages_of_relu_over_the/

还有一种说法是leaky relu非线性能力不如relu,因为可能更加适合生成问题而不是分类问题。虽然我不太同意这种说法,但是有人验证过https://oldpan.me/archives/non-linear-activation-relu-or-lrelu

5、数据归一化

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html#sklearn.preprocessing.StandardScaler.fit_transform

这里需要注意两点:

第一点:fit_transform的输入必须是二维矩阵[n_examples, features],

第二点:fit_transform会在每个feature上单独计算均值和方差然后做归一化,我们在这里需要的是全局的均值和方差,所以最后一维是1.

6、回调函数

为什么validation的accuracy比train的要高

在fit函数中,训练集上的accuracy是一边训练一边累积的,即开始的模型状态A1得到第一个batch的accuracy,训练一步后在模型状态A2上得到第二个batch的accuracy,以此类推。而对validation set,是在训练完后的模型状态AN上得到的。在模型没有过拟合的情况下,即在模型状态会随着训练越来越好的条件下,AN状态上测所有样本肯定会比累积测要好。

当模型处于过拟合状态时,train会比valid要高,在正常拟合状态下,train和valid一般是差不多,而你说的这个问题,是由于tensorflow函数的计算方式引起的。

tensorboard的启动

启动tensorboard,这里train和valid如果生成在两个文件夹,所以启动的方式应该是:tensorboard --logdir=train:train的目录名,valid:validation的目录名, 其中冒号后面的值是文件夹的路径。

train和valid在同一个文件夹下,则tensorboard --logdir=目录名

7、回归模型

一般遵循一下原则:

  1. 后面的层次比前面的少,比如上一层是300,下一层一般不超过300.
  2. 一般是2的指数,2的指数容易让计算机的效能发挥到最大,毕竟计算机是二进制。

问:请问为什么需要先做数据拆分,然后再做归一化,不能先统一归一化,再数据拆分吗?

答:如果训练街和测试集都在你手里的话,那么可以这么做。但是一般的生产环境中,你只有训练集,没有测试集,所以要在训练集上算出来均值和方差,然后用这个均值和方差去处理测试集和验证集。

问:回归模型不是线性的吗,为什么还要用激活函数?

答:线性函数理论上说应该就不加激活函数了。但是现在激活函数的实现很方便,所以一般大家都会加一个relu。“线性”更多的是体现在单层上。能work就可以。

为什么我训练的图片没有出现梯度消失?

你把我代码中的learning rate从0.01改成0.001应该就能看到这个现象。https://coding.imooc.com/learn/questiondetail/182947.html

8、神经网络讲解

激活函数

归一化 VS 批归一化

归一化

  • Min-max归一化:x=(x-min)/(max-min)
  • Z-score归一化:x = (x - u)/sigma

批归一化

  • 把归一化的思路从输入数据之上,扩展到网络的每层的结果之上,即每层的激活值都做归一化(我们知道神经网络上一层的输出即下一层的输入)

Dropout

作用

  • 防止过拟合

使用droupout之后,泛化能力反而变差了

分类问题上用dropout,回归问题上很少见到用dropout的。原因在于回归问题是数值预测,对输入比较敏感。

为什么普通的dropout激活值的分布发生了变化,而alpha不会这样?

因为普通的dropout是将被丢弃的数据点设为0, 而alpha dropout则是设为alpha,alpha是变化的,是按照分布不变的约束求出来的,所以分布保持不变。

具体细节可以参考论文:https://arxiv.org/pdf/1706.02515.pdf

bn,激活,droupout,残差连接的顺序?

这几个的用法确实比较灵活,这里面的关键因素我觉得是bn,据我所知:

bn和激活函数的顺序可以互换: https://www.zhihu.com/question/283715823

bn和dropout一般不会同时用,因为dropout和bn都会改变方差。如果一定要用,需要在bn层后面使用dropout或者修改dropout的公式使之对方差敏感。因为bn的效果应该比较显著。

残差和bn,一般bn会用在残差块之内吧,可以参考论文《Exploring Normalization in Deep Residual Networks with Concatenated Rectified Linear Units》

为什么dropout后参数不变?

dropout是应用在某一层的输出值上,经过了dropout后,这些输出值就变成0了。这是dropout操作的效果。这样做,达到的效果相当于让一部分参数失效了,这是因为这部分参数所贡献的输出被强行设成0了。

所以做没做dropout,参数值本身不受影响。

丢弃率是通常是0.5的原因

它的(子网络的数目)是最大的。在用了dropout之后,因为每次都是随机的丢弃一部分值,丢弃之后相当于一个子网络。而在丢弃率是0.5的时候,可能的子网络的数目最大,这是因为排列组合,比如,一共有4个单元,我如果每次丢弃两个,那么可能的选择是 C(2, 4) = 6, 而如果丢弃一个或三个,那么可能的选择就是C(1, 4) = C(3, 4) = 4。

Dense(100)后的BatchNormolization是400个参数?

除了scale和offset之外,还有一组参数scale1和offset1,它们用来恢复数据的表达能力。可以参考https://zhuanlan.zhihu.com/p/34879333

为什么BN可以放在激活函数之前?

BN层的作用在于调整和平滑输入的分布,使得梯度更容易的传下去。我们在课上讲解的比较简单,这里有一个更深入的分析:https://www.zhihu.com/question/283715823

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值