@w460461339
2019-01-28T13:38:12.000000Z
字数 2902
阅读 1252
Tensorflow
教程参考:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/overview.html
TensorBoard参考:https://blog.csdn.net/sinat_33761963/article/details/62433234
softmax防止上下溢出参考:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/
掌握:
1、tensorboard所需要的输入以及类型。
2、tensorboard具体调用方法。
先从输入类型开始讲起。
由于NN网络中每层参数我们都是用矩阵或者向量来定义的,而tensorboard展示给我们的往往是一个二维图,因此需要把这些参数压缩成一个标量(scalar)。
因此,第一种参数类型是:标量(tf.summary.scalar)
当然,我们也想看一下输入的样子,所以,第二个参数类型是输入,tf.summary.input
那么还有其他一些类型这里按下不表。
那么和图的构建和调用一样。
0)定义好存储tensorboar信息的路径
1)在nn参数定义的时候,就调用对应方法,将nn参数转化成标量,然后输入到summary中。
2)在计算图构建结束阶段,将所有的summary merge成一个summary_all。
3)在sess内,创建train阶段和test阶段对应的tensorboard-writer。
4)和调用其他op一样,利用sess计算summary_all,并把对应的结果写入train或者test阶段的writer中。
5)命令行启动: tensorboard --logdir= <路径> 即可
自定义的cross-entropy:
softmax=tf.nn.softmax(last_output)
cross_entropy=tf.reduce_sum(y_label*tf.log(tf.clip_by_valye(softmax,1e-32,1.0)))
API定义的cross_entropy:
cross_entropy=tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_label,logits=last_output)
问题来由:
1、编写相同的vgg网络代码,在mnist数据上训练,最终的loss计算,一个采用自定义;一个采用api。
2、发现采用自定义的完全无法收敛,而采用api的能够很快收敛。
通过输出最后的loss值,可以发现两者输出的loss值完全不同。
仔细研究后,发现是由于对数值上溢出和下溢出的策略不同。
1)什么是数值溢出。
上溢出:由于softmax需要采用指数计算,那么当指数很大时,容易产生超出定义数值上届的情况,变成nan。
下溢出:由于softmax存在除法,那么当计算,每个都很小时,会发生下溢出,使得计算结果是0,导致求和结果也是0,从而报错。
2)softmax中的溢出问题
3)自定义的溢出解决方案
自定义的溢出解决通过添加tf.clip_by_value
来处理,将softmax的输出值进行截断,最小值是,最大值是,从而解决。
但是这样会有一个问题,不同位置上的loss值被全部处理成相同的了。
那么其实这样网络无法看到哪些位置错的更多,哪些错的更少。
并且,这样往往会降低loss的值,加之网络一深,使得网络的训练变得异常缓慢,有时甚至无法训练。
网络输出:
[-1.0350179e+03 -1.2889645e+03 -5.3551914e+03 2.1222205e+03
-1.7806185e+03 2.0163844e+03 1.0864736e+02 4.2028843e+03
-2.1118005e+03 1.7040602e+03]
[-1.1503097e+03 -1.7562592e+03 -5.5156274e+03 1.3549369e+03
-1.8913362e+03 1.9013881e+03 4.4843729e+02 4.2615747e+03
-2.2997463e+03 1.7986847e+03]
loss输出:
[ -0. -0. -82.89307 -0. -0. -0. -0.
0. -0. -0. ]
[ -0. -0. -0. -0. -0. -0. -0.
0. -82.89307 -0. ]
4)API采用的解决方法
可以看到,截断这个做法还是太粗暴了,API采用如下做法。
对于分子上溢出和分母下溢出,那么在做softmax前,对每一项都减去当前这一行最大值.有
可以看到,这样计算的结果,数值上和原来的值是一样的。
通过减小了分子的指数值,避免了分子上溢出;
通过保证分母中一定有一项指数是0,规避了分母下溢出。
那么分子下溢出呢?
由于分子下溢出影响的是后续的log,因此我们从后续的log出手解决。
那么,分子不需要在参加指数计算,从而规避下溢出,最终完成了全部的计算。
经过尝试,这种计算方式和API的结果完全一致,的确就是API采用的算法。
不过,既然搞清楚了API是怎么计算的,那么下次就直接采用API算法就好~