具有嵌入层的LSTM RNN的目标向量尺寸

时间:2019-02-14 17:30:36

标签: keras lstm recurrent-neural-network

我正在尝试构建用于文本生成的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,理论上,这对于大vocab_size来说可能非常大。

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

1 个答案:

答案 0 :(得分:0)

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

model.compile( optimizer='adam', loss='sparse_categorical_crossentropy')