(Keras)将pad_sequences应用于更深层次//可变标签长度

时间:2018-03-29 15:58:39

标签: python keras

我得到了一个形状为(2000,2,x)的标签数据,其中x对于2000个集合中的每一个都在100到250之间,其中2是x和y坐标。根据我的理解,在下面的代码中拟合我的模型只会匹配坐标的长度。

model.fit(
    x=train_data, 
    y=keras.preprocessing.sequence.pad_sequences(train_labels, maxlen=250),
    epochs=EPOCHS,
    batch_size=BATCH_SIZE)

那么我怎样才能将所有这些标签带到相同的长度,因为这似乎是必要的,以便用它们来训练模型?

3 个答案:

答案 0 :(得分:1)

我想如果你考虑填充权,那么标签将是一个形状为( 2000, 2, 250)的稀疏矩阵?并且您正在尝试使用(2,250)预测每个示例的2D矩阵?

无论如何,你当前的填充只会影响坐标的尺寸。

在最后一个维度上获取填充的hack将是置换数据轴并添加填充然后置换回原始形状:

perm_y = np.moveaxis(y, 1, 2)
padded_perm_y = sequence.padding(y, max_len=250, padding='post',
                truncating='post')
padded_y = np.moveaxis(padded_perm_y, 2, 1)

答案 1 :(得分:0)

事实证明np.pad在这里工作(而np.moveaxis + sequence.padding没有)。所以我两次迭代我的输入;一次获得最大长度,第二次将np.pad应用于形状为(training_samples, coordinates, maximum_sequence_length)的新数组。

虽然我不知道填充是否会扭曲CNN-LSTM的输出,但我很高兴上述错误不再出现。

答案 2 :(得分:0)

对于更深层次的填充序列(列表列表,..),您可以使用不规则张量并转换为张量/数组。例如:

import tensorflow as tf
padded_y = tf.ragged.constant(train_labels).to_tensor(0.)

这里用 0 填充。