为 LSTM 在 tf.keras 中填充向量
Pad vectors in tf.keras for LSTM
Keras 有一个 pad sequences 的预处理实用程序,但它假定序列是整数。
我的序列是向量(我自己的嵌入,我不想使用 Keras 嵌入),有什么方法可以填充它们以在 LSTM 中使用?
在 Python 中可以使序列相等,但 Keras 中的填充方法为 LSTM 等层提供额外的元信息以供 masking.
考虑
可以用零填充不同长度的浮点数组
要屏蔽零,您可以使用屏蔽层(否则将其删除)
我在列表中初始化您的嵌入,因为 numpy 无法处理不同长度的数组。在示例中,我使用了 4 个不同长度的样本。相对嵌入存储在此列表中 list([1,300],[2,300],[3,300],[4,300])
# recreate your embed
emb = []
for i in range(1,5):
emb.append(np.random.uniform(0,1, (i,300)))
# custom padding function
def pad(x, max_len):
new_x = np.zeros((max_len,x.shape[-1]))
new_x[:len(x),:] = x # post padding
return new_x
# pad own embeddings
emb = np.stack(list(map(lambda x: pad(x, max_len=100), emb)))
emb_model = tf.keras.Sequential()
emb_model.add(tf.keras.layers.Masking(mask_value=0., input_shape=(100, 300)))
emb_model.add(tf.keras.layers.LSTM(32))
emb_model(emb)
Keras 有一个 pad sequences 的预处理实用程序,但它假定序列是整数。
我的序列是向量(我自己的嵌入,我不想使用 Keras 嵌入),有什么方法可以填充它们以在 LSTM 中使用?
在 Python 中可以使序列相等,但 Keras 中的填充方法为 LSTM 等层提供额外的元信息以供 masking.
考虑可以用零填充不同长度的浮点数组
要屏蔽零,您可以使用屏蔽层(否则将其删除)
我在列表中初始化您的嵌入,因为 numpy 无法处理不同长度的数组。在示例中,我使用了 4 个不同长度的样本。相对嵌入存储在此列表中 list([1,300],[2,300],[3,300],[4,300])
# recreate your embed
emb = []
for i in range(1,5):
emb.append(np.random.uniform(0,1, (i,300)))
# custom padding function
def pad(x, max_len):
new_x = np.zeros((max_len,x.shape[-1]))
new_x[:len(x),:] = x # post padding
return new_x
# pad own embeddings
emb = np.stack(list(map(lambda x: pad(x, max_len=100), emb)))
emb_model = tf.keras.Sequential()
emb_model.add(tf.keras.layers.Masking(mask_value=0., input_shape=(100, 300)))
emb_model.add(tf.keras.layers.LSTM(32))
emb_model(emb)