如何在Keras中实现这种本地连接的架构?

时间:2018-06-07 17:15:11

标签: keras

我的输入数据如下所示:

> x <- rnorm(10*9, sd = 10) %>% matrix(10) %>% round
> colnames(x) <- c(paste0(2014, c("a","b", "c")), paste0(2015, c("a","b", "c")), paste0(2016, c("a","b", "c")))
> x
      2014a 2014b 2014c 2015a 2015b 2015c 2016a 2016b 2016c
 [1,]     1   -11     3     3     6     5    17     5    15
 [2,]     9     8     0    -1    10     8    -3   -11     6
 [3,]    -6    22    -3     1    -1    -4    -3    11    -9
 [4,]    10   -15     0    -2     4    14    11   -11     3
 [5,]     5     4     5     5    15    -9     2     5     1
 [6,]   -24    16     9    -7     2   -12     1    18    -2
 [7,]     1    13     5   -14     1   -10    15    -1    14
 [8,]    -8     4     4   -15    -1   -20    -6    14     5
 [9,]    10    19   -15    15    -4     3    -1   -11     8
[10,]    10   -11    -9    -1    16     3    24    -8     4

我的结果变量是连续的(即:这是一个回归问题)。

我想要使用如下所示的架构来拟合模型:

enter image description here

基本上,我从不同年份获得的粒度数据汇总形成一组年度现象,这些现象本身可以相互作用。如果我有足够的数据,我可以装入一堆完全连接的层。但是对于我适度的样本量,这些效率会很低。

这不完全是转换网,因为我不希望“磁贴”重叠。

我也想要同时应用辍学和全球二级惩罚。

我是Keras的新手,但不是神经网络。我如何实现这一点,以及如何在Keras术语中引用它?

1 个答案:

答案 0 :(得分:1)

您可以使用functional API拥有多个输入并创建该计算图。有点像:

inputs = [Input(shape=(3,)) for _ in range(3)]
latents = list()
for i in range(3):
  latent = Dense(3, activation='relu')(inputs[i])
  latent = Dense(3, activation='relu')(latent)
  latents.append(latent)
merged = concatenate(latents)
out = Dense(4, activation='relu')(merged)
out = Dense(4, activation='relu')(out)
out = Dense(1)(out)

您的体系结构图假设您有固定的年份输入,在这种情况下为3年。如果您有多年的可变年份,则必须使用共享Dense图层并使用TimeDistributed包装器在合并之前将Dense图层应用于每年:

in = Inputs(shape=(3,3)) # this time we have 2d array of 3 years
latent = TimeDistributed(Dense(3, activation='relu'))(in) # apply same dense to every year
latent = TimeDistributed(Dense(3, activation='relu'))(latent)
merged = Flatten()(latent)
out = ...

这次Dense图层在多年内共享,它们本质上具有相同的权重。