Генерация текста Tensorflow не возвращает действительный индекс - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь обучить модели Tensorflow генерировать текст. Я использую в основном код с сайта Tensorflow, но когда я пытаюсь сгенерировать текст, модель возвращает индексы, которых нет в word_index.

Функция генерации текста:

model = create_model(vocab_size = vocab_size,
  embed_dim=embed_dim,
  rnn_neurons=rnn_neurons,
  batch_size=1)

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))

model.build(tf.TensorShape([1, None]))

char_2_index = tokenizer.word_index
index_2_char = {ind:char for char, ind in char_2_index.items()}

def generate_text(model, start_string):

  num_generate = 1000

  input_eval = [char_2_index[s] for s in start_string]
  input_eval = tf.expand_dims(input_eval, 0)

  text_generated = []

  temperature = 1.0

  model.reset_states()
  for i in range(num_generate):
      print(text_generated)
      predictions = model(input_eval)

      predictions = tf.squeeze(predictions, 0)

      predictions = predictions / temperature
      print(predictions)
      predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
      print(predicted_id)

      input_eval = tf.expand_dims([predicted_id], 0)


      text_generated.append(index_2_char[predicted_id])

  return (start_string + ''.join(text_generated))

Ошибка

KeyError                                  Traceback (most recent call last)
<ipython-input-52-9517558352c4> in <module>()
----> 1 print(generate_text(model, start_string=u"Is Baby yoda "))

<ipython-input-47-75973c66de6c> in generate_text(model, start_string)
     37 
     38 
---> 39       text_generated.append(index_2_char[predicted_id])
     40 
     41   return (start_string + ''.join(text_generated))

KeyError: 133

Индекс слов и обучающий текст содержит только заглавные и строчные буквы.

РЕДАКТИРОВАТЬ Для большего контекста это моя подготовка данных и структура

Структура [['SENTENCE'], ['SENTENCE2'] ...]

Подготовка данных

tokenizer = keras.preprocessing.text.Tokenizer(num_words=209, lower=False, char_level=True, filters='#$%&()*+-<=>@[\\]^_`{|}~\t\n')
tokenizer.fit_on_texts(df['title'].values)
df['encoded_with_keras'] = tokenizer.texts_to_sequences(df['title'].values)

dataset = df['encoded_with_keras'].values
dataset = tf.keras.preprocessing.sequence.pad_sequences(dataset, padding='post')

dataset = dataset.flatten()

dataset = tf.data.Dataset.from_tensor_slices(dataset)

sequences = dataset.batch(seq_len+1, drop_remainder=True)

def create_seq_targets(seq):
    input_txt = seq[:-1]
    target_txt = seq[1:]
    return input_txt, target_txt

dataset = sequences.map(create_seq_targets)

dataset = dataset.shuffle(buffer_size).batch(batch_size, drop_remainder=True)

1 Ответ

0 голосов
/ 06 февраля 2020

Кажется, что vocab_size, используемый в create_model(...), не равен длине index_2_char.

...