Как я могу улучшить точность классификации LSTM,GRU рекуррентных нейронных сетей
Задача двоичной классификации в тензорном потоке:
Я прошел онлайн-уроки и пытаюсь применить их к проблеме в реальном времени, используя gated-recurrent unit (GRU). Я перепробовал все возможности, которые я знаю, чтобы улучшить классификацию.
1) Началось добавление сложенных слоев RNN(GRU) 2) Увеличение скрытых единиц на слой RNN 3) Добавлены функции активации "sigmoid" и "RelU" для скрытого слоя 4) Нормализованы входные данные 5) Изменены гиперпараметры
Пожалуйста, найдите ссылку на набор данных: https://github.com/madhurilalitha/Myfirstproject/blob/master/ApplicationLayerTrainingData1.txt
Если вы можете пройти через набор данных, он имеет метки "нормальный" и "отличный от нормального". Я закодировал "нормальный" как "1 0" и ненормальный как "0 1". Я также изменил набор данных на 3D формы ниже:
Форма нового поезда X (7995, 5, 40) Форма нового поезда Y (7995, 2) Форма нового теста X (1994, 5, 40) Форма нового теста Y (1994, 2)
Я не совсем уверен, где мне не хватает логики. Может ли кто-нибудь помочь мне найти ошибку в моем коде?
Точность классификации по данным испытаний составляет 52,3%. Он работает с той же точностью даже на тренировочных данных. Пожалуйста, найдите код ниже:
#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}))
1 ответ
Похоже, вы на правильном пути. Я бы попробовал визуализировать ваши тренировочные данные, чтобы убедиться, что они уменьшаются, как вы ожидаете.
Есть ли причина, по которой вы думаете, что вы должны получить более высокую точность? Это может быть лучшим, что вы можете сделать с таким количеством данных. Один из лучших способов повысить производительность вашей модели - это получить больше данных; Можно ли получить больше данных?
Оптимизация гиперпараметра - это хороший способ продолжить; Я бы попробовал поиграть с разными скоростями обучения, разным количеством скрытых слоев и разными размерами скрытых слоев.