训练神经网络给图片上色
项目挂在 owen8877/chroma-instance 上面了,是我在 UT 2020 Fall 的一门课的期末项目。
架构
大家直接去 github 页面上看好了,反正就是抄了抄两篇论文二合为一(
倒是在画图的时候学到了一点新的东西,原来还有专门画网络结构图的 dsl HarisIqbal88/PlotNeuralNet。设计的还不错,就是小 bug 太多,需要配合补丁使用(见 这里 或者 这里)。
总结与感想
效果非常一般,基本就是瞎上色(
可能是数据量太小了,也就在 5k 的图片上跑了 5 个 epoch,能学出什么呢(
还有就是 VGG 拓展出来的 encoder-decoder 架构感觉不太靠谱……也许换 U-net 会好一些。
本来还想部署到 heroku 上的,一看内存……告辞……
吐槽
哦我亲爱的读者啊,那需要吐槽的可真是太多了呢
- 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()
绕过去了。
- 放大不仅可以用
UpSampling2D
,还可以考虑一下Conv2DTranspose
。但是后者不仅维数不能自动推导(似乎是 keras 的 bug,importtensorflow.python.keras
可解决),而且还面临着训练困难的问题( - 写了几天之后才发现 pipeline 只能接受定长的 tensor (嗯,我可能表达的不是特别清楚,就是说像物体分割这种可能导致变长输入/输出的问题,其实只能设一个最大上限,然后把数据一股脑堆进去)
- Commit history 真的是一把辛酸泪,到后面真的是语无伦次了——Colab 体验还极差,改代码需要经过本地修改->推到 github->在 colab 上拉下来->重新初始化 colab 内存->运行的步骤,硬生生把 python 写出了 C++ 的感觉。
- 到现在我还是没搞清楚 GAN 的两个 counterpart 是怎么设置的,为什么 loss function 和 trainable 属性要这么写[捂脸]Keras 能不能出个官方教程啊……
- Colab 用到后面配额暂时用完了……只能开 pro 凑合一下了(有点小贵哦