2018-06-08 Debug笔记

这周又在暴肝作业。写完了科技史论文,字数肯定够了,也写了自己的观点,但是不能保证观点的深入。在论文的过程中,发现自己已经很久没有写过这种流畅的长篇文章了,而且论文越写越像实验报告。

为了写数字图像处理大作业,速成了Tensorflow。其实就是拿了队友的Tensorflow模板然后把自己的网络和数据集塞进去而已。昨天下午终于把编译错误调完并跑了起来,但是网络一直不收敛,调到凌晨快一点无果,今天早上起来又调了一两个小时,居然就调出来了。

为了防止以后继续跳坑,做一个debug总结。作业是Few-shot Learning。

  1. 网络不收敛,最初考虑的是超参有问题,而且本身这个问题就很容易过拟合。于是前前后后调了若干轮learning rate,发现偶尔碰巧可以收敛,但大多数情况下不能收敛。

  2. 然后开始考虑是不是这个模型根本无法用于此问题中。验证方法是每次都喂同一个episode,看一下会不会收敛。于是我把所有的random sample部分全部去掉,重新跑网络,发现还是不能收敛。

  3. 然后开始考虑把中间步骤输出。Tensorflow对输出中间过程非常不友好,只能开始学习如何使用Tensorboard。最后可视化了各层的weight和bias,以及中间的输出,发现直方图压根没有随epoch发生变化。

  4. 然后开始考虑是不是梯度消失。把输入数据输出了一下,发现过于稀疏,思考是不是因为bp时由于大量的x是0导致梯度无法更新。为了解决稀疏问题,我用PCA把输入从4096维降到了100维,无果。

  5. 然后开始怀疑是不是把loss写错了,随后我把loss的计算过程中的每个cluster center输出了一下,发现所有种类的cluster center的输出几乎都是1e-7的量级。

  6. 然后开始怀疑是不是因为batch_norm之后数太小,导致cluster center几乎都是原点。我把所有的bn层全都删掉后,cluster center的值确实变大了,结果惊讶的发现所有类别的cluster center完全一样。

  7. 为了搞清楚所有类别的cluster center完全一样这个问题,我把输入数据中每个类别的所有维的和输出了一下,发现真的完全一样,这时候才意识到可能dataset写错了。最后发现是因为一个造数据集的时候把数组下标写错了。

总结这个过程:

  1. 把所有的random sample去掉更容易看出问题。
  2. 相比nn部分,数据预处理更可能有bug。
  3. 多输出一些中间过程。
  4. 要相信bn层的作用。
  5. Tensorboard真好用。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容