【问题标题】:How to zero pad on both sides and encode the sequence into one hot in keras?如何在两侧归零并将序列编码为keras中的一个热点?
【发布时间】:2019-05-04 13:10:48
【问题描述】:

我有如下文本数据。

X_train_orignal= np.array(['OC(=O)C1=C(Cl)C=CC=C1Cl', 'OC(=O)C1=C(Cl)C=C(Cl)C=C1Cl',
       'OC(=O)C1=CC=CC(=C1Cl)Cl', 'OC(=O)C1=CC(=CC=C1Cl)Cl',
       'OC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O'])

很明显,不同的序列有不同的长度。如何将序列两侧的序列零填充到某个最大长度。然后根据每个字符将每个序列转换成一个热编码?

试试:

我使用了以下 keras API,但它不适用于字符串序列。

keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)

我可能需要先将我的序列数据转换为一个热向量,然后对其进行零填充。为此,我尝试如下使用Tokanize

tk = Tokenizer(nb_words=?, split=?)

但是,由于我的序列数据没有任何空间,拆分值和 nb_words 应该是什么?如何将其用于基于角色的热门?

我的总体目标是在将序列输入 RNN 之前对序列进行零填充并将其转换为热序列。

【问题讨论】:

    标签: machine-learning keras deep-learning nlp


    【解决方案1】:

    所以我遇到了一种方法,首先使用Tokenizer,然后使用pad_sequences 在开始时对我的序列进行零填充,如下所示。

    from keras.preprocessing.text import Tokenizer
    tokenizer = Tokenizer(char_level=True)
    tokenizer.fit_on_texts(X_train_orignal)
    
    sequence_of_int = tokenizer.texts_to_sequences(X_train_orignal)
    

    这给了我如下输出。

    [[3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 4, 1, 7, 5, 1, 2, 1, 1, 2, 1, 6, 1, 7],
     [3,
      1,
      4,
      2,
      3,
      5,
      1,
      6,
      2,
      1,
      4,
      1,
      7,
      5,
      1,
      2,
      1,
      4,
      1,
      7,
      5,
      1,
      2,
      1,
      6,
      1,
      7],
     [3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 2, 1, 1, 4, 2, 1, 6, 1, 7, 5, 1, 7],
     [3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 4, 2, 1, 1, 2, 1, 6, 1, 7, 5, 1, 7],
     [3,
      1,
      6,
      2,
      1,
      4,
      1,
      2,
      1,
      4,
      1,
      2,
      1,
      6,
      5,
      8,
      10,
      11,
      9,
      4,
      8,
      3,
      12,
      9,
      5,
      2,
      3,
      5,
      8,
      10,
      11,
      9,
      4,
      8,
      3,
      12,
      9,
      5,
      2,
      3]]
    

    现在我不明白为什么它以列格式给出sequence_of_int[1], sequence_of_int[4] 输出?

    拿到token后,我申请pad_sequences如下。

    seq=keras.preprocessing.sequence.pad_sequences(sequence_of_int, maxlen=None, dtype='int32', padding='pre', value=0.0)
    

    它给我的输出如下。

    array([[ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  3,  1,  4,  2,  3,  5,  1,  6,  2,  1,  4,  1,  7,  5,  1,
             2,  1,  1,  2,  1,  6,  1,  7],
           [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  1,  4,
             2,  3,  5,  1,  6,  2,  1,  4,  1,  7,  5,  1,  2,  1,  4,  1,
             7,  5,  1,  2,  1,  6,  1,  7],
           [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  3,  1,  4,  2,  3,  5,  1,  6,  2,  1,  1,  2,  1,  1,  4,
             2,  1,  6,  1,  7,  5,  1,  7],
           [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  3,  1,  4,  2,  3,  5,  1,  6,  2,  1,  1,  4,  2,  1,  1,
             2,  1,  6,  1,  7,  5,  1,  7],
           [ 3,  1,  6,  2,  1,  4,  1,  2,  1,  4,  1,  2,  1,  6,  5,  8,
            10, 11,  9,  4,  8,  3, 12,  9,  5,  2,  3,  5,  8, 10, 11,  9,
             4,  8,  3, 12,  9,  5,  2,  3]], dtype=int32)
    

    然后,我将其转换为一个热,如下所示。

    one_hot=keras.utils.to_categorical(seq)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2016-03-19
      相关资源
      最近更新 更多