python - 张量流中实现的sigmoid函数和从头开始的sigmoid函数有什么区别
问题描述
数值稳定的 sigmoid 函数的实现和在 TensorFlow 中实现的有什么区别?
sigmoid()
在实现这两个函数和tf.nn.sigmoid()
(或)时,我得到了不同的结果tf.sigmoid()
。第一个给出nan
了非常差的准确度(大约 0.93%),而第二个给出了非常好的准确度(大约 99.99%)。
数值稳定的 sigmoid 函数sigmoid()
由下式给出:
def sigmoid(z):
return tf.where(z >= 0, 1 / (1 + tf.exp(-z)), tf.exp(z) / (1 + tf.exp(z)))
我希望这两种方法都能得到相同的结果(准确性),无论是由 TensorFlow 实现的还是从头开始创建的sigmoid()
。
注意:我测试了这两个功能tf.sigmoid
并且sigmoid()
型号相同。
解决方案
我尝试使用以下代码和简单的 Iris 数据集重现您的案例。的值l
是cost
使用的计算tf.sigmoid
值,的值l2
是cost (cost2)
使用您的自定义sigmoid
函数计算的值,和的值l
对l2
我来说几乎相同。
如果您可以提供代码和数据(如果可以共享),我们可以更深入地研究这一点。
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import model_selection
import sys
iris_data = pd.read_csv('iris_species/Iris.csv',header=0,delimiter = ',')
data_set_y = pd.DataFrame(iris_data['Species'])
data_set_X = iris_data.drop(['Species'],axis=1)
num_samples = iris_data.shape[0]
num_features = iris_data.shape[1]
num_labels = 1
X = tf.placeholder('float',[None,4])
y = tf.placeholder('float',[None,1])
W = tf.Variable(tf.zeros([4,2]),dtype=tf.float32)
b = tf.Variable(tf.zeros([1]),dtype=tf.float32)
train_X,test_X,train_y,test_y = model_selection.train_test_split(data_set_X,data_set_y,random_state=0)
train_y = np.reshape(train_y,(-1,1))
prediction = tf.add(tf.matmul(X,W),b)
cost = tf.sigmoid(prediction)
optimizer = tf.train.GradientDescentOptimizer(0.001).minimize(cost)
num_epochs = 1000
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(num_epochs):
_,l = sess.run([optimizer,cost],feed_dict = {X: train_X, y: train_y})
if epoch % 50 == 0:
#print (type(l))
#print (l.shape)
print (l)
def sigmoid(z):
return tf.where(z >= 0, 1 / (1 + tf.exp(-z)), tf.exp(z) / (1 + tf.exp(z)))
prediction = tf.add(tf.matmul(X,W),b)
cost2 = sigmoid(prediction)
optimizer2 = tf.train.GradientDescentOptimizer(0.001).minimize(cost2)
num_epochs = 1000
print ('Shape of train_y is: ',train_y.shape)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(num_epochs):
_,l2 = sess.run([optimizer2,cost2],feed_dict = {X: train_X, y: train_y})
if epoch % 50 == 0:
#print (type(l))
#print (l.shape)
print (l2)
推荐阅读
- image-processing - 为什么使用 x*cos(a)+y*sin(a)=r 而不是 a=-b*x+y 进行霍夫变换?
- google-cloud-functions - 谷歌云函数响应消息的数字签名
- javascript - 为 Highcharts 圆环图转换组 json
- python - 给定一个元组列表,如果第一个元素相同,我如何在每个相似的元组中添加第二个元素
- math - Xbee3 - 没有数学模块的三角值计算
- swift - 是否有执行并传递原始值的反应函数?
- c++ - 使用 getline 从 .csv 文件读取时遇到问题
- mysql - Docker 远程访问上的 MySQL
- python - 如何检查嵌套列表中的所有数字是否等于 n
- linux - 在 Ubuntu 中编译 xv6 时出错(生成文件:124:目标“内核”的配方失败)