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之间的转换关系!

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