Обучение последовательности RNN

Я новичок в прогнозировании TensorFlow RNN. Я пытаюсь использовать RNN с BasicLSTMCell для прогнозирования последовательности, например

1,2,3,4,5 ->6
3,4,5,6,7 ->8
35,36,37,38,39 ->40

Мой код не сообщает об ошибке, но результаты для каждой партии кажутся одинаковыми, и стоимость, похоже, не снижается во время обучения.

Когда я разделил все тренировочные данные на 100

0.01,0.02,0.03,0.04,0.05 ->0.06
0.03,0.04,0.05,0.06,0.07 ->0.08 
0.35,0.36,0.37,0.38,0.39 ->0.40

Результат довольно хороший, корреляция между прогнозом и реальными значениями очень высокая (0,9998).

Я подозреваю, что проблема в том, что целое число и число с плавающей запятой? но я не могу объяснить причину. Кто-нибудь может помочь? Большое спасибо!!

Вот код

library(tensorflow)
start=sample(1:1000, 100000, T)
start1= start+1
start2=start1+1
start3= start2+1
start4=start3+1
start5= start4+1
start6=start5+1
label=start6+1
data=data.frame(start, start1, start2, start3, start4, start5, start6, label)
data=as.matrix(data)
n = nrow(data)
trainIndex = sample(1:n, size = round(0.7*n), replace=FALSE)
train = data[trainIndex ,]
test = data[-trainIndex ,]
train_data= train[,1:7]
train_label= train[,8]
means=apply(train_data, 2, mean)
sds= apply(train_data, 2, sd)
train_data=(train_data-means)/sds
test_data=test[,1:7]
test_data=(test_data-means)/sds
test_label=test[,8]
batch_size = 50L            
n_inputs = 1L               # MNIST data input (img shape: 28*28)
n_steps = 7L                # time steps
n_hidden_units = 10L        # neurons in hidden layer
n_outputs = 1L             # MNIST classes (0-9 digits)
x = tf$placeholder(tf$float32, shape(NULL, n_steps, n_inputs))
y = tf$placeholder(tf$float32, shape(NULL, 1L))
weights_in= tf$Variable(tf$random_normal(shape(n_inputs, n_hidden_units)))
weights_out= tf$Variable(tf$random_normal(shape(n_hidden_units, 1L)))
biases_in=tf$Variable(tf$constant(0.1, shape= shape(n_hidden_units )))
biases_out = tf$Variable(tf$constant(0.1, shape=shape(1L)))
RNN=function(X, weights_in, weights_out, biases_in, biases_out)
{
    X = tf$reshape(X, shape=shape(-1, n_inputs))
    X_in = tf$sigmoid (tf$matmul(X, weights_in) + biases_in)
    X_in = tf$reshape(X_in, shape=shape(-1, n_steps, n_hidden_units)
    lstm_cell = tf$contrib$rnn$BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=T)
    init_state = lstm_cell$zero_state(batch_size, dtype=tf$float32)
    outputs_final_state = tf$nn$dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=F)
    outputs= tf$unstack(tf$transpose(outputs_final_state[[1]], shape(1,0,2)))
    results =  tf$matmul(outputs[[length(outputs)]], weights_out) + biases_out
    return(results)
}
pred = RNN(x, weights_in, weights_out, biases_in, biases_out)
cost = tf$losses$mean_squared_error(pred, y)
train_op = tf$contrib$layers$optimize_loss(loss=cost, global_step=tf$contrib$framework$get_global_step(), learning_rate=0.05, optimizer="SGD")
init <- tf$global_variables_initializer()
sess <- tf$Session()
sess.run(init)
    step = 0
while (step < 1000)
{
  train_data2= train_data[(step*batch_size+1) : (step*batch_size+batch_size) ,  ]
  train_label2=train_label[(step*batch_size+1):(step*batch_size+batch_size)]
  batch_xs <- sess$run(tf$reshape(train_data2, shape(batch_size, n_steps, n_inputs))) # Reshape
  batch_ys= matrix(train_label2, ncol=1)
  sess$run(train_op, feed_dict = dict(x = batch_xs, y= batch_ys))
 mycost <- sess$run(cost, feed_dict = dict(x = batch_xs, y= batch_ys))
print (mycost)
 test_data2= test_data[(0*batch_size+1) : (0*batch_size+batch_size) ,  ]
  test_label2=test_label[(0*batch_size+1):(0*batch_size+batch_size)]
   batch_xs <- sess$run(tf$reshape(test_data2, shape(batch_size, n_steps, n_inputs))) # Reshape
  batch_ys= matrix(test_label2, ncol=1)
step=step+1
}

person user2146141    schedule 02.11.2017    source источник
comment
Не могли бы вы поделиться кодом? Без него трудно определить, в чем может быть проблема. Кроме того, вполне возможно иметь такую ​​высокую корреляцию, если ваш набор данных настолько прост (она все еще высока, если вы вносите шум/ошибки в свой набор данных?)   -  person Deruijter    schedule 03.11.2017
comment
Спасибо за комментарии. Я добавил код, я просто тестирую концепцию, поэтому набор данных прост.   -  person user2146141    schedule 03.11.2017


Ответы (1)


Во-первых, очень полезно всегда нормализовать ваши сетевые входы (существуют разные подходы, деление на максимальное значение, вычитание среднего и деление на стандартное значение и многое другое). Это очень поможет вашему оптимизатору.

Во-вторых, и это самое главное в вашем случае, после вывода RNN вы применяете сигмовидную функцию. Если вы проверите график сигмовидной функции, вы увидите, что она фактически масштабирует все входные данные в диапазоне (0,1). Таким образом, независимо от того, насколько велики ваши входные данные, ваш вывод всегда будет не более 1. Таким образом, вы не должны использовать какие-либо функции активации на выходном уровне в задачах регрессии.

Надеюсь, поможет.

person asakryukin    schedule 03.11.2017
comment
привет asakryukin, Спасибо за ваши предложения!! Я добавил нормализацию функции и удалил функцию активации сигмовидной, однако кажется, что эти два изменения не решили проблему. Результаты кажутся такими же. На самом деле, после обучения, результаты каждой партии практически одинаковы. Например, одна партия, реальные Ys: 810, 284, 83.... 35 (50 значений) предсказанные ys: 494,8970, 494,8970..... 494,8970,494,8976 (50 значений) Прогноз довольно близок среднее значение всех реальных Y (т.е. 500), Не знаю, как решить или объяснить - person user2146141; 03.11.2017
comment
@user2146141 user2146141 вы нормализовали оба ввода и Y? Попробуйте нормализовать оба, а затем уменьшить масштаб после вывода... Поскольку вы все еще получаете ввод в (0,1) до последнего слоя, поэтому, когда сеть обучена последней, W является фиксированным значением. Вот почему сеть просто изучает среднее значение всех Y во время обучения, так как это минимизирует ошибку, иначе невозможно получить некоторый W, который будет умножен на число (0,1) и даст 810 и 83 одновременно. для разных входов - person asakryukin; 03.11.2017