【Tensorflow实战系列】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)-1tanh(x)2∗σ(2x)−1其中σ(x)ex/(1ex)\sigma(x)e^x/(1e^x)σ(x)ex/(1ex)也和前端同事确认了海思在sigmoid上的误差很小于是使用上述的等式进行替换。3. Toy example我们可以进行一个小测试importtensorflowastfimportnumpyasnp inputsnp.random.rand(5,5)-0.5print(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_restf.nn.tanh(inputs)sesstf.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_res2*tf.nn.sigmoid(inputs*2)-1print(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之间的转换关系