Точность кода Tensorflow не увеличивается - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в Tensorflow и строю персептрон с 2 скрытыми слоями.В моем наборе данных содержится 8000 обучающих примеров, а код приведен ниже: -

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

data=pd.read_csv("Churn_Modelling.csv")

X=data.iloc[:,3:13].values
Y=data.iloc[:,13].values

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
le1=LabelEncoder()
X[:,1]=le1.fit_transform(X[:,1])
le2=LabelEncoder()
X[:,2]=le2.fit_transform(X[:,2])
ohe1=OneHotEncoder(categorical_features=[1])
X=ohe1.fit_transform(X).toarray()

X=X[:,1:]

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.transform(X_test)

y_train=np.array([[y_train[i]] for i in range(8000)])
y_test=np.array([[y_test[i]] for i in range(2000)])

import tensorflow as tf

hidden1=6
hidden2=6

batch_size=10

x=tf.placeholder(shape=[None,11],dtype=tf.float32)
y=tf.placeholder(shape=[None,1],dtype=tf.float32)

def neural_network(data):
    l1={"weights":tf.Variable(tf.random_normal([11,hidden1])),
       "biases":tf.Variable(tf.random_normal([hidden1]))}
    l2={"weights":tf.Variable(tf.random_normal([hidden1,hidden2])),
        "biases":tf.Variable(tf.random_normal([hidden2]))}

    output={"weights":tf.Variable(tf.random_normal([hidden2,1])),
            "biases":tf.Variable(tf.random_normal([1]))}

    hl1=tf.add(tf.matmul(data,l1["weights"]),l1["biases"])
    hl1=tf.nn.relu(hl1)

    hl2=tf.add(tf.matmul(hl1,l2["weights"]),l2["biases"])
    hl2=tf.nn.relu(hl2)

    output1=tf.add(tf.matmul(hl2,output["weights"]),output["biases"])

    return output1
tcost=[]
def train_neural_network(data):
    prediction=neural_network(data)
    cost=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=prediction,labels=y))
    #cost=-tf.reduce_mean(y*tf.log(prediction)+(1-y)*tf.log(1-prediction))
    optimizer=tf.train.AdamOptimizer(0.01).minimize(cost)

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())

        epochs=100

        for epoch in range(epochs):
            avg_cost=0

            for i in range(batch_size):
                start=i
                end=start+batch_size
                a=X_train[start:end,:]
                b=y_train[start:end,:]
                _,c=sess.run([optimizer,cost],feed_dict={x:a,y:b})
                avg_cost+=c

                i=i+batch_size
            print("Cost",avg_cost)  
            correct= tf.equal(tf.round(prediction), y)    
#            correct=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
            accuracy=tf.reduce_mean(tf.cast(correct,"float"))
##           my_acc = tf.reduce_mean(tf.cast(tf.equal(y, prediction), tf.float32))
##            print(sess.run(my_acc, feed_dict={x:X_test,y:y_test}))
            print("Accuracy",accuracy.eval({x:X_train,y:y_train}))        
            tcost.append(avg_cost)
        plt.scatter(range(100),tcost,color="blue")
        plt.show()            



train_neural_network(x)

Независимо от того, что я делаю, точность моей сети не превышает 10% на тренировочном наборе.Я пытался изменить скорость обучения, а также количество слоев и скрытых единиц безрезультатно, хотя функция стоимости постепенно уменьшается с каждой эпохой.

Вот что я получил в конце: -

Стоимость 0,0032630344212520868Точность 0,015

Я неправильно реализую функцию точности? В чем проблема?

1 Ответ

0 голосов
/ 04 июня 2018

sigmoid_cross_entropy_with_logits эта функция полезна только для обучения из-за оптимизаций с сигмоидом и кросс-энтропией, для прогнозов необходимо использовать функцию sigmoid в выходных данных.Вы смешиваете logits с predictions, это разные вещи.

def neural_network(data):
    l1={"weights":tf.Variable(tf.random_normal([11,hidden1])),
       "biases":tf.Variable(tf.random_normal([hidden1]))}
    l2={"weights":tf.Variable(tf.random_normal([hidden1,hidden2])),
        "biases":tf.Variable(tf.random_normal([hidden2]))}

    output={"weights":tf.Variable(tf.random_normal([hidden2,1])),
            "biases":tf.Variable(tf.random_normal([1]))}

    hl1=tf.add(tf.matmul(data,l1["weights"]),l1["biases"])
    hl1=tf.nn.relu(hl1)

    hl2=tf.add(tf.matmul(hl1,l2["weights"]),l2["biases"])
    hl2=tf.nn.relu(hl2)

    logits=tf.add(tf.matmul(hl2,output["weights"]),output["biases"])
    predictions = tf.sigmoid(logits)

    return logtis, predictions

...
logits,prediction=neural_network(data)
cost=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits,labels=y))
...