我正在建立一個模型,使用週期圖層(GRUs)將字符串轉換爲另一個字符串。我已經嘗試了密集型和時間分佈(密集)層作爲最後一層,但我不明白使用return_sequences = True時兩者之間的差異,特別是因爲它們看起來具有相同數量的參數。時間分佈(密集)與密集在Keras - 相同數量的參數
我的簡化模型如下:
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的理解是,它適用於同一層的所有時間點,所以密集層有16 * 15 + 15 = 255個參數(權重+偏差)。
但是,如果我切換到一個簡單的緻密層:
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
=================================================================
我不知道這是因爲密集()將只使用最後維度的形狀,並將其他所有內容有效地視爲批量維度。但是,我不確定密集和TimeDistributed(密集)之間有什麼不同。
更新看着https://github.com/fchollet/keras/blob/master/keras/layers/core.py它似乎是密集使用最後一個維度只大小本身:
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()在這種情況下實現的。
讓我補充一點,這兩個模型在訓練過程中的表現幾乎完全相同。 – thon
我也一直在想。所以你確認了Dense()和TimeDistributed(Dense())在你的情況下具有相同的性能?我認爲更好的API設計將允許用戶設置參數,無論是在時間步上使用相同的密集層,還是在每個時間步使用單獨的密集層。 – ymeng