【问题标题】:reshaping vectors into tensors for embedding layer in keras LSTM mini-batch training将向量重塑为张量以在 keras LSTM 小批量训练中嵌入层
【发布时间】:2020-02-09 00:12:56
【问题描述】:

我正在尝试在 Python 中使用 kerastensorflow 后端的嵌入层和小批量训练在文本上训练 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


    【解决方案1】:

    我不太确定你想用这种重塑做什么,但Embedding 层需要 2D 张量,而不是你试图通过该层的 3D 张量。

    这是关于Embedding 层输入的文档说明

    具有形状的二维张量:(batch_size, sequence_length)

    所以你只需将形状为(50, your sequence length) 的二维张量传递给它

    至于26300 数字 - 它需要单个批次的长度,而不是批次的数量。

    【讨论】:

    • 感谢您的回答!我取消了整形,所以我的输入是 2D 的,但是嵌入层仍然不会接受我的输入,即使它是它说它需要的大小,这很令人费解。你知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多