2

Binary Klassifizierung Problem in Tensorflow verbessern:Wie kann ich die Klassifikationsgenauigkeit von LSTM, GRU rekurrente neuronale Netzen

Ich habe durch die Online-Tutorials gegangen und es auf einem Echtzeit-Problem unter Verwendung von gated-rezidivierender Einheit anzuwenden versuchen (GRU). Ich habe alle Möglichkeiten ausprobiert, die ich kenne, um die Klassifizierung zu verbessern.

1) Erste Zugabe gestapelten RNN (GRU) Schichten 2) Erhöhen verborgenen Einheiten pro RNN Schicht 3) Added "Sigmoid" und "relu" Aktivierungsfunktionen für verborgene Schicht 4) normalisiert, um die Eingangsdaten 5) Changed der Hyper

Bitte den Link zu dem Datensatz finden: https://github.com/madhurilalitha/Myfirstproject/blob/master/ApplicationLayerTrainingData1.txt

Wenn Sie durch den Datensatz gehen, es Etikett „normal“ und „andere als normal“ hat. Ich habe "normal" als "1 0" und abnormal als "0 1" codiert. Ich habe ich verändern auch den Datensatz, um 3D-Form unter:

Form neuen Zug X (7995, 5, 40) Form neuen Zug Y (7995, 2) Form neuen Test X (1994, 5, 40) Form des neuen Tests Y (1994, 2)

Ich bin nicht ziemlich sicher, wo ich die Logik vermisse, Könnte jemand mir helfen, den Fehler in meinem Code zu finden?

Die Klassifizierungsgenauigkeit der Testdaten beträgt 52,3%. Es führt mit der gleichen Genauigkeit sogar auf Trainingsdaten aus. Den folgenden Code finden Sie unter:

#Hyper Parameters for the model 
learning_rate = 0.001 
n_classes = 2  
display_step = 100  
input_features = train_X.shape[1] #No of selected features(columns)  
training_cycles = 1000  
time_steps = 5 # No of time-steps to backpropogate  
hidden_units = 50 #No of GRU units in a GRU Hidden Layer 

#Input Placeholders 
with tf.name_scope('input'): 
    x = tf.placeholder(tf.float64,shape = [None,time_steps,input_features], name 
= "x-input")  
    y = tf.placeholder(tf.float64, shape = [None,n_classes],name = "y-input") 
#Weights and Biases  
with tf.name_scope("weights"): 
    W = tf.Variable(tf.random_normal([hidden_units,n_classes]),name = "layer- 
weights")  

with tf.name_scope("biases"): 
    b = tf.Variable(tf.random_normal([n_classes]),name = "unit-biases")  


# Unstack to get a list of 'time_steps' tensors of shape (batch_size, 
input_features) 
x_ = tf.unstack(x,time_steps,axis =1)  

#Defining a single GRU cell 
gru_cell = tf.contrib.rnn.GRUCell(hidden_units)  

#GRU Output 
with tf.variable_scope('MyGRUCel36'): 
    gruoutputs,grustates = 
tf.contrib.rnn.static_rnn(gru_cell,x_,dtype=tf.float64)  

#Linear Activation , using gru inner loop last output 
output = tf.add(tf.matmul(gruoutputs[-1],tf.cast(W,tf.float64)),tf.cast(b,tf.float64)) 

#Defining the loss function 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits = output)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

#Training the Model 
sess = tf.InteractiveSession()  
sess.run(tf.global_variables_initializer())  
for i in range (training_cycles): 
    _,c = sess.run([optimizer,cost], feed_dict = {x:newtrain_X, y:newtrain_Y}) 

    if (i) % display_step == 0: 
     print ("Cost for the training cycle : ",i," : is : ",sess.run(cost, feed_dict ={x :newtrain_X,y:newtrain_Y})) 
correct = tf.equal(tf.argmax(output, 1), tf.argmax(y,1))  
accuracy = tf.reduce_mean(tf.cast(correct, 'float'))  
print('Accuracy on the overall test set is :',accuracy.eval({x:newtest_X, y:newtest_Y}))  

Antwort

0

Es klingt, als ob Sie auf dem richtigen Weg sind. Ich würde versuchen, Ihre Trainingsdaten zu visualisieren, um sicherzustellen, dass sie wie erwartet abnimmt.

Gibt es einen Grund, dass Sie glauben, dass Sie eine höhere Genauigkeit erhalten sollten? Das könnte nur das Beste sein, was Sie mit dieser Datenmenge machen können. Eine der besten Möglichkeiten zur Steigerung der Modellleistung besteht darin, mehr Daten zu erhalten. Ist es möglich, mehr Daten zu bekommen?

Hyperparameter-Optimierung ist ein guter Weg, um fortzufahren; Ich würde versuchen, mit verschiedenen Lernraten, einer unterschiedlichen Anzahl von versteckten Ebenen und verschiedenen Größen versteckter Ebenen zu spielen.

+1

Vielen Dank Herrfbt, Sie haben Recht, die Genauigkeit gilt für den Datensatz, den ich verwendet habe. Ich ging einen Schritt voraus und mischte die Proben, während ich mein erstes Modell trainierte (Fall 1). Wenn ich den Originaldatensatz verwendete (ungezählt mit Originalgröße), schnitt das Modell mit hoher gültiger Genauigkeit besser ab (Fall 2). Ich habe dafür gesorgt, dass ich nicht nur "Genauigkeit" in Betracht ziehe, um die Leistung meines Modells in diesen beiden Fällen zu messen. – OJJ

+0

@OJJ Wenn Sie die Antwort mögen, können Sie es als akzeptiert markieren? – finbarr

+0

Wenn Sie nach anderen Metriken suchen, sind F1, Recall und Präzision neben der Genauigkeit auch gut; Kappa ist ein weiterer starker. – finbarr

Verwandte Themen