Как обнулить площадку с обеих сторон и закодировать последовательность в один горячий в керас? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть текстовые данные следующим образом.

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'])

Поскольку очевидно, что разные последовательности имеют разную длину.Как можно обнулить последовательность с обеих сторон последовательности до некоторой максимальной длины.А затем преобразовать каждую последовательность в одну горячую кодировку на основе каждого символа?

Попробуйте:

Я использовал следующий API-интерфейс keras, но он не работает с последовательностью строк.

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

Мне может понадобиться сначала преобразовать данные моей последовательности в один горячий вектор, а затем заполнить его нулями.Для этого я попытался использовать Tokanize следующим образом.

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

Но тогда, каково должно быть значение split и nb_words, поскольку в данных моей последовательности нет пробела?Как использовать его для персонажа на основе одного «горячего»?

Моя общая цель - обнулить свои последовательности на ноль и преобразовать его в один горячий, прежде чем я добавлю его в RNN.

1 Ответ

0 голосов
/ 03 декабря 2018

Итак, я нашел способ сделать это, используя сначала 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] в формате столбца?

После получения токенов я применил 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)
...