您现在的位置:首页 > >

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、回归模型

一般遵循一下原则:


    后面的层次比前面的少,比如上一层是300,下一层一般不超过300.一般是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


?


热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报