具有嵌入层的LSTM RNN的目标矢量维数

问题描述 投票:0回答:1

我正在尝试为文本生成构建LSTM模型。在keras中,我的模型看起来如下所示:

model= Sequential()
model.add( Embedding(vocab_size, embedding_dim) )
model.add( LSTM( units=embedding_dim, input_shape=(None, embedding_dim), return_sequences=True) )
model.add( LSTM( units=embedding_dim, input_shape=(None, embedding_dim), return_sequences=True) )
model.add( Dense(vocab_size, activation='softmax') )
model.compile( optimizer='adam', loss='categorical_crossentropy')

我理解嵌入层对LSTM模型的好处:输入数组的内存大小减少,类似的变量被映射到潜在空间中的近区域等。这允许我将类别数组直接传递给我的LSTM,而不需要一个热门编码。考虑以下带有vocab_size = 9的分类数据集:

X= [ [1,2,3], [4,5,6], [7,8,9] ]

我对嵌入层的输入是

X= [ [1,2], [4,5], [7,8] ]

我的问题是关于目标向量Y的形状。由于分类交叉熵损失,我仍然被迫对一个热编码Y.直接,我需要一个热编码以下向量:

Y= [ [2,3], [5,6], [8,9] ]

我很奇怪,我可以逃脱不是一个热编码X,但仍需要一个热编码Y.这似乎与我读过使用嵌入层的内存使用参数背道而驰,因为我仍然被迫一个热门编码Y,理论上对于大型词汇量来说可能非常大。

我是否理解一个热门编码Y的必要性是正确的,还是有其他技巧可以用来避免这种情况?

keras lstm recurrent-neural-network
1个回答
0
投票

您可以使用sparse_categorical_crossentropy作为损失而不是categorical_crossentropy。在这种情况下,您的标签不应该是热编码的,当您拥有大量词汇时,这确实可以节省内存。

model.compile( optimizer='adam', loss='sparse_categorical_crossentropy')
© www.soinside.com 2019 - 2024. All rights reserved.