如何在Keras中为每个时间步应用不同的密集层

时间:2019-07-04 09:01:10

标签: keras neural-network recurrent-neural-network keras-layer gated-recurrent-unit

我知道应用TimeDistributed(Dense)在所有时间步上都会应用相同的密集层,但是我想知道如何为每个时间步应用不同的密集层。时间步数不变。

P.S .:我看过following link,但似乎找不到答案

1 个答案:

答案 0 :(得分:1)

您可以使用LocallyConnected图层。

LocallyConnected层表示为连接到kernel_size time_steps(在此情况下为1)的每个Dense层。

from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model

sequence_length = 10
n_features = 4

def make_model():
  inp = Input((sequence_length, n_features))
  h1 = LocallyConnected1D(8, 1, 1)(inp)
  out = Flatten()(h1)
  model = Model(inp, out)
  model.compile('adam', 'mse')
  return model

model = make_model()
model.summary()

每个摘要中,LocallyConnected层使用的变量数为 (output_dims * (input_dims + bias)) * time_steps或(8 *(4 + 1))* 10 = 400。

用另一种方式表达:上面的本地连接层表现为10个不同的Dense层,每个层都连接到其时间步长(因为我们选择kernel_size为1)。这些包含50个变量的块中的每个块都是形状的权重矩阵(input_dims,output_dims)加上大小的偏差矢量(output_dims)。

还要注意,给定input_shape为(sequence_len,n_features),Dense(output_dims)Conv1D(output_dims, 1, 1)是等效的。

即此模型:

def make_model():
  inp = Input((sequence_length, n_features))
  h1 = Conv1D(8, 1, 1)(inp)
  out = Flatten()(h1)
  model = Model(inp, out)

和此模型:

def make_model():
  inp = Input((sequence_length, n_features))
  h1 = Dense(8)(inp)
  out = Flatten()(h1)
  model = Model(inp, out)

都一样。