【发布时间】:2020-02-09 00:12:56
【问题描述】:
我正在尝试在 Python 中使用 keras 和 tensorflow 后端的嵌入层和小批量训练在文本上训练 LSTM 主题模型(多对一问题)。我正在努力以与嵌入层格式兼容的方式格式化我的输入和输出。
我的输入由成批的count-vectorized 文本标记组成,后填充为 50 个单元格。我的输出是对应于 4 个类之一的迭代器标签向量,同样后填充到 50 个单元格。
这是一个示例输入向量:
array([2777, 2879, 114, 207, 2879, 3031, 1831, 565, 1961, 161, 1503,
1485, 1036, 3380, 3255, 2879, 3243, 2152, 2406, 653, 3122, 3053,
623, 1145, 2152, 3255, 2529, 3210, 119, 944, 161, 2879, 1282,
2846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0], dtype=int32)
这是对应的输出向量:
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0], dtype=int32)
作为一个整体,我的输入和输出都由一个填充数组列表组成。接下来,我将我的模型架构初始化如下:
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
model = Sequential()
model.add(Embedding(20000, 100, input_length=50))
model.add(LSTM(100))
model.add(Dense(4, activation='sigmoid'))
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
我的embedding layer有三个参数:(1)输入维度20000,对应我的词汇量大小,(2)输出维度100,是dense embedding的任意维度,(3)inout长度50,这是我的后填充向量的最大长度。
print(model.summary())
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 50, 100) 2000000
_________________________________________________________________
lstm_1 (LSTM) (None, 100) 80400
_________________________________________________________________
dense_1 (Dense) (None, 4) 101
=================================================================
Total params: 2,080,501
Trainable params: 2,080,501
Non-trainable params: 0
为了简化批处理问题,我在 for 循环中训练我的模型,一次通过一个批次。所以我的输入现在被正确地指定为嵌入层所要求的 2D(根据我尝试重塑为 3D 后声明 expected embedding_1_input to have 2 dimensions 的早期错误。
for X, y in data:
model.fit(X, y, epochs=1, batch_size=1, verbose=0)
当我尝试拟合模型时,出现此错误:
ValueError: Error when checking input: expected embedding_1_input to have shape (50,) but got array with shape (1,)
这真的很令人费解,因为当我仔细检查输入的尺寸时,它们确实是 (50,)!
np.shape(data[0][0])
> (50,)
转置一维向量没有任何区别,所以我现在不确定如何进行。有什么建议吗?
我还注意到this 的帖子有一个类似的问题,但到目前为止还没有人试图回答它。提前致谢!
【问题讨论】:
标签: python tensorflow keras deep-learning word-embedding