1. 問題描述
LZ在使用tensorflow訓練好對應的模型,並轉成caffemodel後,將模型交由前端同事的時候,前端同事轉成wk文件後,發現推斷結果與caffemodel結果相差很大,後來經過逐層排查後發現海思芯片的tanh與caffe或者tf中的實現有一定差異,會導致結果相差很大,於是LZ準備使用Sigmoid的進行替代,
2. 解決方法
但是因爲網絡物理含義的需求,需要經過激活函數後,feature map的值要在(-1, 1)之間,顯然單純Sigmoid是不滿足這一要求的,於是,我們可以通過兩者的公式進行等價
其中
也和前端同事確認了海思在sigmoid上的誤差很小,於是使用上述的等式進行替換。
3. Toy example
我們可以進行一個小測試!
import tensorflow as tf
import numpy as np
inputs = np.random.rand(5, 5)-0.5
print(inputs)
[[-0.07570021 -0.22391657 0.12031656 -0.07412661 0.02280513]
[ 0.43490949 0.05654585 0.30623752 -0.43225458 0.41053218]
[-0.29675026 0.02783143 -0.13659314 -0.34200988 0.11406029]
[ 0.11330576 0.21211356 0.14819943 0.44995595 0.23811879]
[-0.08725294 -0.1411123 -0.15858117 0.26021318 -0.33454138]]
tanh_res = tf.nn.tanh(inputs)
sess=tf.Session()
print(sess.run(tanh_res))
[[-0.07555594 -0.22024784 0.11973933 -0.07399113 0.02280118]
[ 0.40941606 0.05648566 0.29701037 -0.40720377 0.38892446]
[-0.28833585 0.02782425 -0.13574993 -0.32927055 0.11356822]
[ 0.11282336 0.20898864 0.14712391 0.42186279 0.23371809]
[-0.08703219 -0.14018306 -0.15726508 0.25449491 -0.32259549]]
sigmoid_res = 2*tf.nn.sigmoid(inputs*2)-1
print(sess.run(sigmoid_res))
[[-0.07555594 -0.22024784 0.11973933 -0.07399113 0.02280118]
[ 0.40941606 0.05648566 0.29701037 -0.40720377 0.38892446]
[-0.28833585 0.02782425 -0.13574993 -0.32927055 0.11356822]
[ 0.11282336 0.20898864 0.14712391 0.42186279 0.23371809]
[-0.08703219 -0.14018306 -0.15726508 0.25449491 -0.32259549]]
表明了Tanh函數和Sigmoid之間的轉換關係!