Форма ввода и форма массива в задаче классификации последовательностей в Керасе, R - PullRequest
0 голосов
/ 04 июля 2019

Я изучаю генные последовательности.У меня есть кадр данных в R, который содержит один столбец с одной последовательностью в каждой строке и другой столбец с True или False (1 или 0) для каждой последовательности, и я хочу проверить в этом эксперименте, могут ли возможные мутации в последовательности привестик определенному неврологическому заболеванию (представленному столбцом True / False).

Для этого я хотел построить двунаправленную модель LSTM, которая бы анализировала каждую последовательность самостоятельно и была обучена возвращать либо True, либоНеверно, как я уже сказал.

Дело в том, что мои знания LSTM, Keras и R в целом очень ограничены, и я пару дней боролся с этим.

Я читал оформы ввода для LSTM, и не знаю, понял ли я их еще.У меня есть 1125 последовательностей длиной 251 символ для обучения, и для этого эксперимента я попытался с входной формой (1125,5,1).

Это структура данных моего поезда:

str(x_train)  
 chr [1:225, 1:5, 1] "111121211121123131112142241444213344144441421221314431143441144412121111121141212344444412424212112314212113422"| __truncated__ ...  
 str(y_train)  
 num [1:225, 1:5, 1] 1 1 1 1 1 1 1 1 1 1 ...  

И вот модель, с которой я работаю:

max_length = 251
sequence_length = 5 

input_shape = c(sequence_length, 1)

history = NULL

lstm_cells = 60
batch_size = 100
epochs = 60
learn_rate = 0.0001



modelBLSTM <- keras_model_sequential()
  modelBLSTM %>% 
  bidirectional(layer_lstm(units = lstm_cells, dropout = 0.5, recurrent_dropout = 0.5, return_sequences = TRUE), merge_mode = 'concat', input_shape = input_shape) %>%
  time_distributed(layer_dense(units = lstm_cells, activation = 'relu')) %>%
  layer_flatten() %>%
  layer_dense(units = 1, activation="sigmoid") %>% 

  summary(model)

  modelBLSTM %>% compile(
  loss = loss_binary_crossentropy,
  optimizer = optimizer_rmsprop(lr = learn_rate),
  metrics = c('accuracy')
)


history = 
  modelBLSTM %>% fit(
  x = x_train,
  y = y_train,
  epochs = epochs, 
  batch_size = batch_size, 
  validation_data = list(x_test, y_test),
  verbose = 1)

history

Здесь я получил ошибку, котораяговорит

Ошибка при проверке ввода: ожидалось, что bidirectional_19_input имеет 3 измерения, но получил массив с формой (1125, 1)

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

РЕДАКТИРОВАТЬ:

Итак, у меня естьизмените данные моего поезда на (1125 / 5,5,1), и я также поменял каждую букву на символ (так что A = 1, G = 2, C = 3 и T = 4), потому что это давало мне ошибку, чтосказал, что "не удалось преобразовать строку в число с плавающей точкой".Я обновил это в своем посте.

Но теперь, когда он начинает вписываться в эпоху # 1, он останавливается и выдает мне эту ошибку:

Ошибка в py_call_impl (callable,точки $ args, точки $ ключевые слова):
InvalidArgumentError: Несовместимые формы: [100,1] против [100,5,1]
[[Узел: training_5 / RMSprop / gradients / loss_23 / dens_49_loss / logistic_loss /mul_grad / BroadcastGradientArgs = BroadcastGradientArgs [T = DT_INT32, _class = ["loc: @train ... ad / Reshape"], _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"](training_5 / RMSprop / градиенты / loss_23 / dens_49_loss / logistic_loss / mul_grad / Shape, training_5 / RMSprop / градиенты / loss_23 / density_49_loss / logistic_loss / mul_grad / Shape_1)]]

Я знаю, что в [100,1], 100 относится к установленному мною batch_size, но я не знаю, где проблема и как ее решить.Любая помощь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...