如何在 Keras 中为每个时间步应用不同的致密层
How to apply a different dense layer for each timestep in Keras
我知道应用 TimeDistributed(Dense) 在所有时间步上应用相同的致密层,但我想知道如何为每个时间步应用不同的致密层。时间步数不可变。
P.S.: 我看过following link但似乎找不到答案
您可以使用 LocallyConnected 层。
LocallyConnected 层单词作为 Dense 层连接到每个 kernel_size
time_steps(在本例中为 1)。
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) 的偏置向量。
另请注意,给定 (sequence_len、n_features) 的 input_shape,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)
都一样。
我知道应用 TimeDistributed(Dense) 在所有时间步上应用相同的致密层,但我想知道如何为每个时间步应用不同的致密层。时间步数不可变。
P.S.: 我看过following link但似乎找不到答案
您可以使用 LocallyConnected 层。
LocallyConnected 层单词作为 Dense 层连接到每个 kernel_size
time_steps(在本例中为 1)。
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) 的偏置向量。
另请注意,给定 (sequence_len、n_features) 的 input_shape,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)
都一样。