Я сталкиваюсь со странной ситуацией с производительностью, пытаясь соответствовать моей модели 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
Возможно ли, что эти результаты будут почти такими же, потому что в модели "CNN + LSTM" необходима дальнейшая настройка?Или это может быть потому, что созданную «базовую модель» просто очень трудно улучшить?
Так как при увеличении количества дней, отправляемых для каждого пакета, или количества интервалов time_steps, отправляемых за каждый день, генерируется ResourceExhaustedError (OOM при выделении тензора с формой .... -Это происходитв первом слое conv_2d-) Должен ли я изменить форму данных, отправляемых в модель с помощью генератора данных?
На этом этапе мне следует подумать о проблеме в целом?
Это длинное описание проблемы / вопроса, так что спасибо за ваше время!