xDroid's Blog

训练神经网络给图片上色

项目挂在 owen8877/chroma-instance 上面了,是我在 UT 2020 Fall 的一门课的期末项目。

架构

大家直接去 github 页面上看好了,反正就是抄了抄两篇论文二合为一(

倒是在画图的时候学到了一点新的东西,原来还有专门画网络结构图的 dsl HarisIqbal88/PlotNeuralNet。设计的还不错,就是小 bug 太多,需要配合补丁使用(见 这里 或者 这里)。

总结与感想

效果非常一般,基本就是瞎上色(

可能是数据量太小了,也就在 5k 的图片上跑了 5 个 epoch,能学出什么呢(

还有就是 VGG 拓展出来的 encoder-decoder 架构感觉不太靠谱……也许换 U-net 会好一些。

本来还想部署到 heroku 上的,一看内存……告辞……

吐槽

哦我亲爱的读者啊,那需要吐槽的可真是太多了呢

  1. Keras 对于我来说已经是魔法般的存在了,想要手写一个组件嵌到 keras 里简直难度正无穷。
  • Keras 将很多 tensorflow 中的操作进行了包装(应该是为了保证不同的后端都能有相同的 interface),但这也导致了有很多绕来绕去的 internal call。
  • 如果想要自己写一个新的 Model,不仅需要 override call 函数,而且还要处理好
    • get_config(self)
    • from_config(cls, config)
    • compute_output_shape(self, input_shape)
      等等一大堆问题,才能保证 keras 正常存读自定义的模型
  • 最麻烦的是 keras 有时候会自己计算 tensor 的大小,出现 _keras_shape 这样的玩意儿,但很多时候还是错的
  • 所以结论是看似 Layers API 是最吼的,但是 Lambda 层里面可能会遇到 tf 这种符号在 load 的时候没定义的问题……结果我现在也不知道该怎么解决,只好调用 set_weights() 绕过去了。
  1. 放大不仅可以用 UpSampling2D,还可以考虑一下 Conv2DTranspose。但是后者不仅维数不能自动推导(似乎是 keras 的 bug,import tensorflow.python.keras 可解决),而且还面临着训练困难的问题(
  2. 写了几天之后才发现 pipeline 只能接受定长的 tensor (嗯,我可能表达的不是特别清楚,就是说像物体分割这种可能导致变长输入/输出的问题,其实只能设一个最大上限,然后把数据一股脑堆进去)
  3. Commit history 真的是一把辛酸泪,到后面真的是语无伦次了——Colab 体验还极差,改代码需要经过本地修改->推到 github->在 colab 上拉下来->重新初始化 colab 内存->运行的步骤,硬生生把 python 写出了 C++ 的感觉。
  4. 到现在我还是没搞清楚 GAN 的两个 counterpart 是怎么设置的,为什么 loss function 和 trainable 属性要这么写[捂脸]Keras 能不能出个官方教程啊……
  5. Colab 用到后面配额暂时用完了……只能开 pro 凑合一下了(有点小贵哦