Tensorflow:Tanh和Sigmoid之間的關係(前端移植的一個坑)

1. 問題描述

LZ在使用tensorflow訓練好對應的模型,並轉成caffemodel後,將模型交由前端同事的時候,前端同事轉成wk文件後,發現推斷結果與caffemodel結果相差很大,後來經過逐層排查後發現海思芯片的tanh與caffe或者tf中的實現有一定差異,會導致結果相差很大,於是LZ準備使用Sigmoid的進行替代,

2. 解決方法

但是因爲網絡物理含義的需求,需要經過激活函數後,feature map的值要在(-1, 1)之間,顯然單純Sigmoid是不滿足這一要求的,於是,我們可以通過兩者的公式進行等價

tanh(x)=2σ(2x)1tanh(x) = 2*\sigma(2x)-1

其中
σ(x)=ex/(1+ex)\sigma(x)=e^x/(1+e^x)

也和前端同事確認了海思在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之間的轉換關係!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章