2017-05-22 2 views
0

ich ein einfaches neuronales Netz aufgebaut haben, um Daten in nur zwei Klassen zu klassifizieren Daten ist so etwas wie diesesNull Kosten in tensorflow Multi perceptron

34.62365962451697,78.0246928153624,0 
60.18259938620976,86.30855209546826,1 

Es gibt keine Nullwerte in Daten sind so gibt es keine Quelle für solche Kosten .Cost Null mit adagrad Optimierers und nan mit Gradientenabfallsaktualisierung optimiser Hier ist der Code

import numpy as ny 
import tensorflow as tf 


def load(): 
    data = [] 
    for line in open("ex2data1.txt"): 
     row = line.split(',') 
     x = ny.array(row, dtype='|S4') 
     data.append(x.astype(ny.float64)) 
    return ny.array(data) 


def multilayer_perceptron(x, weights, biases): 
    # Hidden layer with ReLU activation 
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) 
    layer_1 = tf.nn.relu(layer_1) 
    # Hidden layer with ReLU activation 
    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 
    layer_2 = tf.nn.relu(layer_2) 
    # Output layer with linear activation 
    out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] 
    return out_layer 

# Store layers weight & bias 
weights = { 
    'h1': tf.Variable(tf.random_normal([2, 15])), 
    'h2': tf.Variable(tf.random_normal([15, 15])), 
    'out': tf.Variable(tf.random_normal([15, 1])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([15])), 
    'b2': tf.Variable(tf.random_normal([15])), 
    'out': tf.Variable(tf.random_normal([1])) 
} 

data = load() 
Xdata = ny.array(data[:, 0:2]) 
Ydata = ny.array(data[:, 2]) 
Ydata = ny.array(Ydata.reshape([100, 1])) 
# Step 2 - Create input and output placeholders for data 
X = tf.placeholder("float", [None, 2], name="X") 
Y = tf.placeholder("float", [None, 1], name="Y") 

pred = multilayer_perceptron(X, weights, biases) 


# Minimize error using cross entropy 
with tf.name_scope("cost"): 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=Y)) 
    optimizer = tf.train.AdagradOptimizer(0.001).minimize(cost) 
    tf.summary.scalar("cost", cost) 

init = tf.global_variables_initializer() 
summary_op = tf.summary.merge_all() 
with tf.Session() as sess: 
    sess.run(init) 

    print(Xdata) 
    print(Ydata) 

    # Step 12 train the model 
    for i in range(1000): 
     sess.run(optimizer, feed_dict={X: Xdata, Y: Ydata}) 
     if (i % 100 == 0): 
      print(sess.run(cost, feed_dict={X: Xdata, Y: Ydata})) 
+0

Zunächst einmal, normalisieren Sie alle Werte zwischen 0 und 1. Zweitens, _what Sie denken, null Kosten ist nicht möglich_. Nullkosten bedeuten im Grunde, dass Sie perfekt mit den Trainingsdaten übereinstimmen (Sie können überanpassen). Nullkosten sind in keiner Weise mit 0 Werten in Ihren Testdaten verbunden. –

+0

Daten sind in Ordnung, ich habe bereits die gleichen Daten in octave.Nvm getestet, Problem ist gelöst. –

Antwort

0

mit der Art und Weise Ihrer Etikett dargestellt werden Sie nicht diese Verlust-Funktion verwendet werden sollen. Ich denke, this ist relevant

+0

Nun, die Label-Darstellung war das Problem, ich musste 2 Klassen in Form von [1,0] oder [0,1] für das richtige Funktionieren der Kostenfunktion machen. Ich weiß aber nicht warum –