Tensorflow tf.sigmoid()返回数组而不是标量

时间:2017-10-21 22:50:14

标签: python tensorflow

我试图在tensorflow中创建一个只有一个类的简单逻辑回归模型。但是,由于某种原因,tf.sigmoid函数返回的是数组类型而不是标量。

从cost函数返回的值的类型是np.ndarray()

形状为(3390,2)

我无法弄清楚为什么tf.sigmoid函数会返回数组类型而不是标量... 任何帮助赞赏。

这是我的代码:

#!/usr/bin/env python3

import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import model_selection
import matplotlib.pyplot as plt
import seaborn as sns
import sys

sns.set(style='white')
sns.set(style='whitegrid',color_codes=True)



bank_data = pd.read_csv('data/bank.csv',header=0,delimiter = ';')
bank_data = bank_data.dropna()

bank_data.drop(bank_data.columns[[0,3,8,9,10,11,12,13]],axis=1,inplace=True)
data_set = pd.get_dummies(bank_data,columns = ['job','marital','default','housing','loan','poutcome'])
data_set.drop(data_set.columns[[14,27]],axis=1,inplace=True)
data_set_y = data_set['y']
data_set_y = data_set_y.replace(('yes','no'),(1.0,0.0))

data_set_X = data_set.drop(['y'],axis=1)
num_samples = data_set.shape[0]
num_features = data_set_X.shape[1]
num_labels = 1


X = tf.placeholder('float',[None,num_features])
y = tf.placeholder('float',[None,num_labels])

W = tf.Variable(tf.zeros([num_features,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


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):
        _,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)

3 个答案:

答案 0 :(得分:0)

sigmoid是在标量上定义的函数。

tf.sigmoid计算输入张量的每个元素上的sigmoid(参见documentation),因此输出将具有与输入相同的形状。

你期望3390x2矩阵的sigmoid是什么?根据答案的不同,您可能希望应用一些缩减来创建predictions中有意义的标量,然后对其应用sigmoid,或者使用tf.nn.sigmoid_cross_entropy_with_logits中的丢失函数或tf.losses中的其他函数。 {3}}

希望有所帮助。

答案 1 :(得分:0)

来自https://www.tensorflow.org/api_docs/python/tf/sigmoid

  

tf.sigmoid

sigmoid(
    x,
    name=None
)
  

计算x元素的sigmoid。

在这种情况下,prediction可能不是标量 - 请检查prediction.shape进行确认。

答案 2 :(得分:0)

基本上,当你想在两个类之间进行分类时,你只需要一个预激活就可以提供给激活函数,因为sigmoid函数是1 /(1 + exp(-x)),就像在{{3}中一样}

在您的代码中,我认为W的第二个维度应该是1而不是2. l的第一个维度应该是数据中的记录数。

如果你想进行多项分类而不是二元情形。你应该使用softmax激活函数而不是sigmoid。在您的情况下,不是更改W的维度,而是将激活替换为tf.nn.softmax也应该有效。

https://en.wikipedia.org/wiki/Sigmoid_function