在ocr_attemtion的decode rnn (fluid , v1) 中,每一个step的output都通过一个利用softmax激活函数的fc layer, 该fc layer用于把memory转为对num_classes个单词的预测。
fluid 使用fc layer: https://github.com/wanghaoshuang/ocr_attention/blob/master/fluid/attention_model.py#L191
v1 使用的是mixed layer : https://github.com/wanghaoshuang/ocr_attention/blob/master/v1/trainer_conf.py#L151
在对齐backward过程中,发现上述fluid fc layer和 V1 mixed layer表现不一致。
对比实验
fluid fc layer和v1 mixed layer都去掉softmax激活,加载相同model, 使用一张图片跑一个pass:
在fluid中,在fc layer前后加上了fluid.layers.Print(input=h, print_phase="backward"), 如下连接所示:
https://github.com/wanghaoshuang/ocr_attention/blob/master/fluid/attention_model.py#L190-L195
在V1中,在mixed layer前后加上了gradient_printer_evaluator(input=gru_step), 如下连接所示:
https://github.com/wanghaoshuang/ocr_attention/blob/master/v1/trainer_conf.py#L150-L157
输出日志表明(共7个rnn step):
- fluid fc layer 和 v1 mixed layer的out_grad都是一致的。
- 在最后一个step, fluid fc llayer和v1 mixed layer计算得到的input_grad一致
- 在1-6个step, fluid fc llayer和v1 mixed layer计算得到的input_grad不一致
手动计算验证
从模型中加载v1 mixed layer的weights, 根据日志中打印出的out_grad, 手动计算input_grad.
手动计算结果与fluid fc layer给出的计算结果一致。