首页 > 解决方案 > 张量流中实现的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()型号相同。

标签: pythonpython-3.xtensorflowneural-network

解决方案


我尝试使用以下代码和简单的 Iris 数据集重现您的案例。的值lcost使用的计算tf.sigmoid值,的值l2cost (cost2)使用您的自定义sigmoid函数计算的值,和的值ll2我来说几乎相同。

如果您可以提供代码和数据(如果可以共享),我们可以更深入地研究这一点。

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)

推荐阅读