Как убедиться, что входные данные могут быть разделены на размер пакета в LSTM с отслеживанием состояния? - PullRequest
0 голосов
/ 03 июля 2018

У меня возникли некоторые проблемы при обучении сети с использованием LSTM с отслеживанием состояния. Учитывая код ниже, я получаю следующее сообщение об ошибке:

 Error in py_call_impl(callable, dots$args, dots$keywords) : 
  ValueError: In a stateful network, you should only pass inputs with a number of samples that can be divided by the batch size. Found: 9384 samples 

Ввод отправляется из внешнего приложения, поэтому я не могу контролировать точное количество отправленных входов. Каков наилучший способ гарантировать, что входные данные всегда можно разделить на размер партии?

neural.train = function(model,XY) 
{
  XY <- as.matrix(XY)
  X <- XY[,-ncol(XY)]
  Y <- XY[,ncol(XY)]
  Y <<- ifelse(Y > 0,1,0)

  dropout <- 0.3
  batchSize <- 64

  newModel <- keras_model_sequential() 

  newModel %>%
    layer_lstm(batch_input_shape =  c(batchSize, 30, 19), units = 72, return_sequences = TRUE, stateful = TRUE, dropout = dropout, recurrent_dropout = dropout) %>%
    #layer_dense(units = 20) %>%
    #layer_lstm(units = 50, return_sequences = TRUE, stateful = TRUE, dropout = dropout, recurrent_dropout = dropout) %>% 
    layer_lstm(units = 16, dropout = dropout, recurrent_dropout = dropout, return_sequences = FALSE, stateful = TRUE) %>% 
    layer_dense(units = 8) %>% 
    layer_batch_normalization() %>% 
    layer_dense(units = 1, activation = 'relu')

  newModel %>% compile( 
    optimizer = optimizer_rmsprop(lr = 0.001),
    loss = 'binary_crossentropy',
    metrics = c('accuracy')
  )

  #X_conv <- matrix(c(X[1,1:10],X[1,11:20]),ncol=10,nrow=2)
  ar <- array(X,c(dim(X)[1],30,19))
  #newModel %>% fit(X, Y, epochs=20, batch_size=100, validation_split = 0.2, shuffle=TRUE, callbacks=reduce_lr)
  newModel %>% fit(ar, Y, epochs=100, batch_size=batchSize, validation_split = 0.2, shuffle=FALSE)
  Models[[model]] <<-  serialize_model(newModel, include_optimizer = TRUE)
}
...