这周又在暴肝作业。写完了科技史论文,字数肯定够了,也写了自己的观点,但是不能保证观点的深入。在论文的过程中,发现自己已经很久没有写过这种流畅的长篇文章了,而且论文越写越像实验报告。
为了写数字图像处理大作业,速成了Tensorflow。其实就是拿了队友的Tensorflow模板然后把自己的网络和数据集塞进去而已。昨天下午终于把编译错误调完并跑了起来,但是网络一直不收敛,调到凌晨快一点无果,今天早上起来又调了一两个小时,居然就调出来了。
为了防止以后继续跳坑,做一个debug总结。作业是Few-shot Learning。
-
网络不收敛,最初考虑的是超参有问题,而且本身这个问题就很容易过拟合。于是前前后后调了若干轮learning rate,发现偶尔碰巧可以收敛,但大多数情况下不能收敛。
-
然后开始考虑是不是这个模型根本无法用于此问题中。验证方法是每次都喂同一个episode,看一下会不会收敛。于是我把所有的random sample部分全部去掉,重新跑网络,发现还是不能收敛。
-
然后开始考虑把中间步骤输出。Tensorflow对输出中间过程非常不友好,只能开始学习如何使用Tensorboard。最后可视化了各层的weight和bias,以及中间的输出,发现直方图压根没有随epoch发生变化。
-
然后开始考虑是不是梯度消失。把输入数据输出了一下,发现过于稀疏,思考是不是因为bp时由于大量的x是0导致梯度无法更新。为了解决稀疏问题,我用PCA把输入从4096维降到了100维,无果。
-
然后开始怀疑是不是把loss写错了,随后我把loss的计算过程中的每个cluster center输出了一下,发现所有种类的cluster center的输出几乎都是1e-7的量级。
-
然后开始怀疑是不是因为batch_norm之后数太小,导致cluster center几乎都是原点。我把所有的bn层全都删掉后,cluster center的值确实变大了,结果惊讶的发现所有类别的cluster center完全一样。
-
为了搞清楚所有类别的cluster center完全一样这个问题,我把输入数据中每个类别的所有维的和输出了一下,发现真的完全一样,这时候才意识到可能dataset写错了。最后发现是因为一个造数据集的时候把数组下标写错了。
总结这个过程:
- 把所有的random sample去掉更容易看出问题。
- 相比nn部分,数据预处理更可能有bug。
- 多输出一些中间过程。
- 要相信bn层的作用。
- Tensorboard真好用。
网友评论