【发布时间】:2017-11-20 12:22:18
【问题描述】:
我正在构建一个模型,该模型使用循环层 (GRU) 将一个字符串转换为另一个字符串。我已经尝试将 Dense 和 TimeDistributed(Dense) 层作为最后一层,但我不明白使用 return_sequences=True 时两者之间的区别,特别是因为它们似乎具有相同数量的参数.
我的简化模型如下:
InputSize = 15
MaxLen = 64
HiddenSize = 16
inputs = keras.layers.Input(shape=(MaxLen, InputSize))
x = keras.layers.recurrent.GRU(HiddenSize, return_sequences=True)(inputs)
x = keras.layers.TimeDistributed(keras.layers.Dense(InputSize))(x)
predictions = keras.layers.Activation('softmax')(x)
网络总结是:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 15) 0
_________________________________________________________________
gru_1 (GRU) (None, 64, 16) 1536
_________________________________________________________________
time_distributed_1 (TimeDist (None, 64, 15) 255
_________________________________________________________________
activation_1 (Activation) (None, 64, 15) 0
=================================================================
这对我来说很有意义,因为我对 TimeDistributed 的理解是它在所有时间点应用相同的层,因此 Dense 层有 16*15+15=255 个参数(权重+偏差)。
但是,如果我切换到一个简单的 Dense 层:
inputs = keras.layers.Input(shape=(MaxLen, InputSize))
x = keras.layers.recurrent.GRU(HiddenSize, return_sequences=True)(inputs)
x = keras.layers.Dense(InputSize)(x)
predictions = keras.layers.Activation('softmax')(x)
我仍然只有 255 个参数:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 15) 0
_________________________________________________________________
gru_1 (GRU) (None, 64, 16) 1536
_________________________________________________________________
dense_1 (Dense) (None, 64, 15) 255
_________________________________________________________________
activation_1 (Activation) (None, 64, 15) 0
=================================================================
我想知道这是否是因为 Dense() 只会使用形状中的最后一个维度,并且有效地将其他所有内容视为类似批处理的维度。但是后来我不再确定 Dense 和 TimeDistributed(Dense) 之间有什么区别。
更新看看https://github.com/fchollet/keras/blob/master/keras/layers/core.py,Dense 似乎只使用最后一个维度来调整自身大小:
def build(self, input_shape):
assert len(input_shape) >= 2
input_dim = input_shape[-1]
self.kernel = self.add_weight(shape=(input_dim, self.units),
它还使用 keras.dot 来应用权重:
def call(self, inputs):
output = K.dot(inputs, self.kernel)
keras.dot 的文档暗示它在 n 维张量上运行良好。我想知道它的确切行为是否意味着 Dense() 实际上会在每个时间步被调用。如果是这样,问题仍然是 TimeDistributed() 在这种情况下实现了什么。
【问题讨论】:
-
让我补充一点,这两个模型在训练期间的表现几乎完全相同。
-
我也一直在想。因此,您确认 Dense() 和 TimeDistributed(Dense()) 在您的情况下具有相同的性能?我认为更好的 API 设计是允许用户设置一个参数,无论是在时间步长上使用相同的 Dense 层还是在每个时间步长上使用单独的 Dense 层。
-
在您的情况下,根据您的更新, Dense 和 Timedistributed(Dense) 具有相同的结果(更新查看 github.com/fchollet/keras/blob/master/keras/layers/core.py 似乎 Dense 仅使用最后一个维度来调整自身大小)。跨度>
标签: machine-learning neural-network keras recurrent-neural-network keras-layer