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}))
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
@OJJ Wenn Sie die Antwort mögen, können Sie es als akzeptiert markieren? – finbarr
Wenn Sie nach anderen Metriken suchen, sind F1, Recall und Präzision neben der Genauigkeit auch gut; Kappa ist ein weiterer starker. – finbarr