tf2.0 自定义Model高级用法
最近看insightface
深受启发,他的人脸识别在训练时可以训练softmax
的,还可以训练triplet loss
的,并且在验证时是对图像pair
进行验证的。这几天弄论文顺便先给tf
里面的模型写个骨架出来。这里的主要难点在于如何用tf.keras
自带Model
类实现训练和测试时不同的行为,今天尝试了一下,做个总结。
单输出前向推导不同行为
这个比较简单,参考dropout
层的实现方式即可。不过如果想控制训练和验证输出维度不同,这个好像暂时没有解决方案,除非使用动态图的写法。
import tensorflow as tf |
多输出前向推导不同行为
如果想要一个多输出的模型,并且执行方式不同,那么这个过程还是比较蛋疼的。因为继承Model
类的方式定义模型,我好像暂时没找到合适的指定输入输出形状的函数,这样就会导致程序不知道形状导致报错。
call
中定义多输出模型,两个输出可以维度不同,但是这样loss
就没法复合。- 首先随意输入一些数据,这是为了让他自动推断输出个数与形状。
- 手动执行
compile
,并提供target_tensors
否则模型还是不知道输出形状。 - 训练即可
|
单输出前向推导、loss均不同行为
模型和之前没什么区别,在损失中需要使用K.learning_phase
获得当前的推理状态来执行不同过程~
class Model_3(k.Model): |
展望
接下来应该对于要写的代码心里有数了,现在想想,最好的方式是先定义一个Sequential
对象,然后call
的时候反复执行这个模型即可,导出时只需导出这个Sequential
对象。