2017-10-12 4 views
0

ich eine sehr einfache logistische Regression tensorflow Programm haben, die wie folgt aussieht:Kann nicht einfach Tensorflow Logistic Regression Programm mit Sigmoid-Aktivierungsfunktion zu arbeiten.

#!/usr/bin/env python3 
import tensorflow as tf 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn import model_selection 
import sys 

gender_df = pd.read_csv('data/binary_data.csv') 

# Shuffle our data 
gender_df = gender_df.sample(frac=1).reset_index(drop=True) 

print (gender_df.columns) 

train_x,test_x, train_y, test_y = model_selection.train_test_split(gender_df['HEIGHT'],gender_df['GENDER'],test_size = 0.3) 

tmp = np.asarray(train_x) 
tmp.resize([train_x.shape[0],1]) 
train_x = tmp 

tmp = np.asarray(train_y) 
tmp = np.resize(tmp,[train_y.shape[0],2]) 
train_y = tmp 

tmp = np.asarray(test_x) 
tmp.resize([test_x.shape[0],1]) 
test_x = tmp 

tmp = np.asarray(test_y) 
tmp = np.resize(tmp,[test_y.shape[0],2]) 
test_y = tmp 

n_samples = train_x.shape[0] 

x = tf.placeholder(tf.float32, [None,1]) 
y = tf.placeholder(tf.float32,[None,2]) 

W = tf.Variable(tf.zeros([1,2]),dtype = tf.float32) 
b = tf.Variable(tf.zeros([1]),dtype = tf.float32) 

a = tf.nn.sigmoid((W * x) + b) 

learning_rate = 0.001 

cross_entropy = tf.reduce_mean(-(y*tf.log(a) + (1 - y) * tf.log(1-a))) 
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    for epoch in range(1000): 
     _,l = sess.run([train_step, cross_entropy], feed_dict = {x: train_x, y:train_y}) 
     if epoch % 50 == 0: 
      print ('loss = %f' %(l)) 

    correct = tf.equal(tf.argmax(a,1), tf.argmax(y,1)) 
    accuracy = tf.reduce_mean(tf.cast(correct,'float')) 
    print ('Accuracy: ', accuracy.eval({x: test_x, y:test_y})) 

Es ist eine ziemlich einfache binäre Klassifizierung logistische Regressionsprogramm, das 100 Zeilen Beispieldaten nimmt die zwei Spalten haben, Geschlecht einen Wert hat, entweder 0 (weiblich) oder 1 (männlich). Höhe ist in Zentimetern.

Ich versuche, eine Vorhersage des Geschlechts basierend auf Höhe zu machen, aber der Verlustwert scheint nicht auf ein Minimum zu konvergieren, zusätzlich variieren die Kostenwerte und die Genauigkeit wild von einem Lauf zum nächsten, obwohl Die Daten, die betrachtet werden, sind die gleichen Daten.

ich einen Lauf haben kann, wo die Genauigkeit 0,8 ist und der nächste Lauf der Genauigkeit 0,2

Auch ich aus irgendeinem Grunde festgestellt, dass der erste Wert Verlust ist immer: Verlust = 0,693147 Aber für Beispiel der Rest von Verlustrechnungen wie folgt aussehen kann: Verlust = 1,397364

Verlust = 1,397516

Verlust = 1,397514

Verlust = 1.397515

Verlust = 1,397514 ...

Ich bin etwas verwirrt über das, was passiert.
Nutze ich die richtige Sigmoid-Funktion? Von meinem Verständnis, ich brauche nur softmax, wenn ich eine logistische Regression Problem mit mehreren Klassen und für eine einfache binäre Klassifizierung kann ich tf.sigmoid() verwenden. Muss ich auch den 'b' Parameter zur Sigmoid Funktion hinzufügen? Sollte ich es auf zufällige Werte anstatt Nullen setzen?

Kann auch jemand ein einfaches binäres Klassifikationsproblembeispiel vorschlagen, das logistische Regression und Tensorflow verwendet, die nicht die Mnist- oder Irisdatenbanken benutzen?

Jede Hilfe wird geschätzt.

Dank

Antwort

0

Sowohl Ihre x und y der Form sein sollte [Keine, 1] und Ihre W einfach [1, 1]. Sowohl Ihre Eingabe als auch Ihre Ausgabe sind eindimensional.

Sie könnten sogar die Matrixnotation löschen und einfach Vektoren in diesem Beispiel verwenden.

+0

Danke. Ich ließ die Matrixnotation fallen und es schien die Dinge besser zu machen, aber ich stoße jetzt auf ein Problem, wenn ich versuche, die Genauigkeit auszudrucken. – redmage123

+0

Gah. Ich habe vergessen zu beenden. Der Fehler, den ich bekomme, ist InvalidArgumentError (siehe oben für Traceback): Erwartete Dimension im Bereich [-1, 1], aber erhalten 1 Dies geschieht in der Zeile, in der ich Genauigkeit laufen lasse, um die Genauigkeit auszudrucken. – redmage123

Verwandte Themen