1

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

PS:我看过以下链接,似乎找不到答案

4

1 回答 1

1

您可以使用 LocallyConnected 层。

LocallyConnected 层单词作为连接到每个kernel_sizetime_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)

是相同的。

于 2019-07-04T09:48:08.813 回答