2017-12-08 3 views
1

Ich habe einen Datensatz von 178 Elementen, und jedes enthält 13 Features und 1 Label. Label wird als One-Hot-Array gespeichert. Mein Trainingsdatensatz besteht aus 158 Elementen.Was ist falsch an meinem neuronalen Netzwerkmodell?

Hier ist, was mein Modell wie folgt aussieht:

x = tf.placeholder(tf.float32, [None,training_data.shape[1]]) 
y_ = tf.placeholder(tf.float32, [None,training_data_labels.shape[1]]) 

node_1 = 300 
node_2 = 300 
node_3 = 300 
out_n = 3 

#1 
W1 = tf.Variable(tf.random_normal([training_data.shape[1], node_1])) 
B1 = tf.Variable(tf.random_normal([node_1])) 
y1 = tf.add(tf.matmul(x,W1),B1) 
y1 = tf.nn.relu(y1) 

#2 
W2 = tf.Variable(tf.random_normal([node_1, node_2])) 
B2 = tf.Variable(tf.random_normal([node_2])) 
y2 = tf.add(tf.matmul(y1,W2),B2) 
y2 = tf.nn.relu(y2) 

#3 
W3 = tf.Variable(tf.random_normal([node_2, node_3])) 
B3 = tf.Variable(tf.random_normal([node_3])) 
y3 = tf.add(tf.matmul(y2,W3),B3) 
y3 = tf.nn.relu(y3) 

#output 
W4 = tf.Variable(tf.random_normal([node_3, out_n])) 
B4 = tf.Variable(tf.random_normal([out_n])) 
y4 = tf.add(tf.matmul(y3,W4),B4) 
y = tf.nn.softmax(y4) 

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) 
optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(200): 
     sess.run(optimizer,feed_dict={x:training_data, y_:training_data_labels}) 

    correct = tf.equal(tf.argmax(y_, 1), tf.argmax(y, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct, 'float')) 
    print('Accuracy:',accuracy.eval({x:eval_data, y_:eval_data_labels})) 

Aber die Genauigkeit sehr niedrig ist, habe ich versucht, Erhöhung der Bereich von 200 bis einer höheren Zahl, aber es bleibt immer noch niedrig.

Was könnte ich tun, um die Ergebnisse zu verbessern?

+0

Das Problem liegt höchstwahrscheinlich bei der Initialisierung. Stellen Sie Ihre Trainingsdaten zur Verfügung, um dies zu reproduzieren – Maxim

+0

@Skam es ist eine Hausaufgabe .. –

+0

Warum brauchen Sie Argmax-Methode in gleich? Ich denke, du solltest beide Argmax-Methoden löschen, dann kannst du gut gehen – eneski

Antwort

2

Das Problem ist, dass Sie die Softmax von y4 nehmen und dann an tf.nn.softmax_cross_entropy_with_logits übergeben. Dieser Fehler ist häufig genug, dass es tatsächlich eine Notiz darüber in der Dokumentation für softmax_cross_entropy_with_logits:

WARNING: This op expects unscaled logits, since it performs a softmax on logits internally 
for efficiency. Do not call this op with the output of softmax, as it will produce 
incorrect results. 

Der Rest des Codes gut aussieht, so ersetzen Sie einfach y4 mit y und loszuwerden y = tf.nn.softmax(y4).