用于2D序列分类的CNN LSTM

时间:2019-07-09 23:21:32

标签: r keras deep-learning lstm

在尝试适应我的cnn lstm模型时,我面临一个奇怪的性能情况。在此问题中,二维数组序列应比“简单”模型更好,但我看不到这些结果,这可能是由于数据生成器或其他原因引起的,但我不确定如何继续前进。

我有一个单通道2D数组的数据集。这些阵列代表一个区域中的温度。

这些2D数组的序列应足以创建分类器。 (温度朝着某个区域的变化在“视觉上”有助于预测事件)。这些数组之一的形状是(180,360,1),每天我有24个。

据我所知,在这种情况下,我正在尝试建立多对一的lstm模型。

我创建了一个数据生成器,该数据生成器返回两个元素的列表: 第一个是维度数组:(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. 在这一点上,我应该重新考虑这个问题吗?

这是一个很长的问题描述/问题,所以谢谢您的宝贵时间!

0 个答案:

没有答案