прогнозирование с помощью модели на моей собственной базе данных (НЛП) - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время я пытаюсь создать НЛП с моделью в своей собственной базе данных, но я не знаю, почему предсказания работают только с плавающей точкой, а не с реальными предложениями. Вот мой код:

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
from tensorflow import keras
import tensorflow_datasets as tfds
tfds.disable_progress_bar()
import numpy as np
import os
import matplotlib.pyplot as plt


def plot_graphs(history, metric):
  plt.plot(history.history[metric])
  plt.plot(history.history['val_'+metric], '')
  plt.xlabel("Epochs")
  plt.ylabel(metric)
  plt.legend([metric, 'val_'+metric])
  plt.show()

text_dir = r"C:\Users\grioux\Desktop\my_requirements_db.txt"
FILE_NAMES = ['my_requirements_db.txt', 'digit_req.txt']
parent_dir = os.path.dirname(text_dir)

def labeler(example, index):
  return example, tf.cast(index, tf.int64)  

labeled_data_sets = []
for i, file_name in enumerate(FILE_NAMES):
  lines_dataset = tf.data.TextLineDataset(os.path.join(parent_dir, file_name))
  labeled_dataset = lines_dataset.map(lambda ex: labeler(ex, i))
  labeled_data_sets.append(labeled_dataset)

labeled_data_sets[0]
BUFFER_SIZE = 50000
BATCH_SIZE = 1
TAKE_SIZE = 5000

all_labeled_data = labeled_data_sets[0]
for labeled_dataset in labeled_data_sets[1:]:
  all_labeled_data = all_labeled_data.concatenate(labeled_dataset)

all_labeled_data = all_labeled_data.shuffle(
    BUFFER_SIZE, reshuffle_each_iteration=False)

tokenizer = tfds.features.text.Tokenizer()

vocabulary_set = set()
for text_tensor, _ in all_labeled_data:
  some_tokens = tokenizer.tokenize(text_tensor.numpy())
  vocabulary_set.update(some_tokens)

vocab_size = len(vocabulary_set)
encoder = tfds.features.text.TokenTextEncoder(vocabulary_set)
example_text = next(iter(all_labeled_data))[0].numpy()
encoded_example = encoder.encode(example_text)
# print(encoded_example)
# print(encoder.decode(encoded_example))

def encode(text_tensor, label):
  encoded_text = encoder.encode(text_tensor.numpy())
  return encoded_text, label

def encode_map_fn(text, label):
  # py_func doesn't set the shape of the returned tensors.
  encoded_text, label = tf.py_function(encode, 
                                       inp=[text, label], 
                                       Tout=(tf.int64, tf.int64))

  # `tf.data.Datasets` work best if all components have a shape set
  #  so set the shapes manually: 
  encoded_text.set_shape([None])
  label.set_shape([])

  return encoded_text, label

all_encoded_data = all_labeled_data.map(encode_map_fn)

train_data = all_encoded_data.skip(120).shuffle(BUFFER_SIZE)
train_data = train_data.padded_batch(BATCH_SIZE, tf.compat.v1.data.get_output_shapes(train_data))

test_data = all_encoded_data.take(80)
test_data = test_data.padded_batch(BATCH_SIZE, tf.compat.v1.data.get_output_shapes(test_data))

sample_text, sample_labels = next(iter(test_data))
vocab_size+=1



model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(vocab_size, 64))
model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)))
# One or more dense layers.
# Edit the list in the `for` line to experiment with layer sizes.
for units in [64, 64]:
  model.add(tf.keras.layers.Dense(units, activation='relu'))

# Output layer. The first argument is the number of labels.
model.add(tf.keras.layers.Dense(1))

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

history = model.fit(train_data, epochs=7,
                    validation_data=test_data,
                    validation_steps=30,
                    verbose = 1)

model.save_weights("model.h5")
print("weights saved.")
plot_graphs(history, 'accuracy')

Итак, как вы можете видеть, я сначала делаю предварительную обработку для преобразования каждого уникального слова в уникальное число, а затем обучаю свою модель. Но когда я загружаю его, я могу делать только предсказания по числу с плавающей запятой, а не по предложениям, и я не знаю почему. Спасибо всем заранее!

...