CNN LSTM для классификации 2D последовательности - PullRequest
0 голосов
/ 10 июля 2019

Я сталкиваюсь со странной ситуацией с производительностью, пытаясь соответствовать моей модели cnn lstm.В этой задаче последовательность двумерных массивов должна работать лучше, чем «простая» модель, но я не вижу этих результатов, и это может быть из-за генератора данных или из-за чего-то другого, но я не совсем уверен в том, какдвигаться дальше.

У меня есть набор данных из одного канала, 2D массивов.Эти массивы представляют температуры в области.

Последовательность этих двухмерных массивов должна быть достаточной для создания классификатора.(Прогрессирование температуры в направлении области «визуально» полезно для прогнозирования события).Форма одного из этих массивов (180 360,1), и на каждый день у меня их 24.

В этом сценарии, насколько я понимаю, я пытаюсь построить многоto-one lstm model.

Я создал генератор данных, который возвращает список из двух элементов: первый представляет собой массив измерений: (batch_size, time_steps, 180,360,1) второй представляет собой массив срезультаты классификатора (0 или 1) для каждого элемента пакета.

В упомянутой выше «базовой» модели у меня была идея использовать layer_flatten + layer_dense для создания простого классификатора.Но просто для проверки кода и идеи в целом я использовал batch_size = 1 и time_steps = 24 (пакеты по одному дню, каждый день с использованием всех массивов дня).Генератор данных отправил в модель список с этими размерами: (1,24,180,360,1) (1)

model <- keras_model_sequential() %>%
          layer_flatten(input_shape = c(24, 180, 360, 1)) %>%
          layer_dense(units = 32, activation = "relu")  %>%
          layer_dense(units = 16, activation = "relu")  %>%
          layer_dense(units = 1, activation = "sigmoid")

model %>% compile(
            optimizer = "rmsprop",
            loss = "binary_crossentropy",
            metrics = c("accuracy")
          )

После подгонки модели, результаты где: val_acc ~ 0,76 и val_loss ~0.56

Затем, чтобы проверить исходную идею (CNN + LSTM), я изменил мои переменные на batch_size = 3 и time_steps = 48 (пакеты по три дня, каждый день с использованием всех массивов по два дня) Генератор данныхотправил список с этими размерами в модель: (3,48,180,360,1) (3)

model <- keras_model_sequential() %>% 
          time_distributed(
            layer_conv_2d(filters = 32, kernel_size = c(5,5), activation = "relu",
                          kernel_initializer = 'he_uniform'),
            input_shape = list(48, 180, 360,1)
          ) %>%
          time_distributed(
            layer_max_pooling_2d(pool_size = c(3,3))
          ) %>%
          time_distributed(
            layer_conv_2d(filters = 32, kernel_size = c(5,5), activation = "relu",
                        kernel_initializer = 'he_uniform')
          ) %>%
          time_distributed(
            layer_flatten()
          ) %>%
          layer_gru(units = 32, dropout = 0.1, recurrent_dropout = 0.5) %>%
          layer_dense(units = 16, activation = "relu")  %>%
          layer_dense(units = 1, activation = "sigmoid")


model %>% compile(
            optimizer = "rmsprop",
            loss = "binary_crossentropy",
            metrics = c("accuracy")
          )

Но после подгонки модели, результаты где: val_acc ~ 0,75 и val_loss ~ 0,55

Архитектура, использованная в модели "CNN LSTM", была создана с использованием следующих идей:

https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21

https://machinelearningmastery.com/cnn-long-short-term-memory-networks

https://towardsdatascience.com/why-default-cnn-are-broken-in-keras-and-how-to-fix-them-ce295e5e5f2

  1. Возможно ли, что эти результаты будут почти такими же, потому что в модели "CNN + LSTM" необходима дальнейшая настройка?Или это может быть потому, что созданную «базовую модель» просто очень трудно улучшить?

  2. Так как при увеличении количества дней, отправляемых для каждого пакета, или количества интервалов time_steps, отправляемых за каждый день, генерируется ResourceExhaustedError (OOM при выделении тензора с формой .... -Это происходитв первом слое conv_2d-) Должен ли я изменить форму данных, отправляемых в модель с помощью генератора данных?

  3. На этом этапе мне следует подумать о проблеме в целом?

Это длинное описание проблемы / вопроса, так что спасибо за ваше время!

...