【问题标题】:How to use the pretrained model in an application?如何在应用程序中使用预训练模型?
【发布时间】:2022-06-10 20:31:37
【问题描述】:

我不明白如何使用训练好的模型。

例如,我使用来自https://towardsdatascience.com/what-is-a-recurrent-neural-network-and-implementation-of-simplernn-gru-and-lstm-models-in-keras-f7247e97c405 的代码训练了模型。

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

imdb, info = tfds.load("imdb_reviews",with_info=True, as_supervised=True)
train_data, test_data = imdb['train'], imdb['test']
training_sentences = []
training_labels = []
testing_sentences = []
testing_labels = []
for s,l in train_data:
    training_sentences.append(str(s.numpy()))
    training_labels.append(l.numpy())
for s,l in test_data:
    testing_sentences.append(str(s.numpy()))
    testing_labels.append(l.numpy())

training_labels_final = np.array(training_labels)
testing_labels_final = np.array(testing_labels)

vocab_size = 10000
embedding_dim=16
max_length = 120
trunc_type= 'post'
oov_tok="<OOV>"

tokenizer = Tokenizer(num_words = vocab_size, oov_token=oov_tok)
tokenizer.fit_on_texts(training_sentences)
word_index = tokenizer.word_index
word_index

sequences = tokenizer.texts_to_sequences(training_sentences)
padded = pad_sequences(sequences, maxlen=max_length, 
                       truncating = trunc_type)
testing_sequences = tokenizer.texts_to_sequences(testing_sentences)
testing_padded = pad_sequences(testing_sequences, maxlen=max_length)

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim,
                             input_length=max_length),
    tf.keras.layers.SimpleRNN(32),
    tf.keras.layers.Dense(10, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.summary()

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

num_epochs=30
history=model.fit(padded, training_labels_final, epochs=num_epochs, validation_data = (testing_padded, testing_labels_final))

全部来自这个链接。

然后我添加了最后一行代码

model.save('name.model')

然后我打开要使用此模型的新脚本。我建议我写一个句子(“他是一只坏猫。”),我会得到 0 或 1,这取决于它代表好情绪还是坏情绪(我想我必须得 0)。

import tensorflow as tf
from tensorflow import keras 
import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

model=tf.keras.models.load_model('name.model')

print(model.output_shape)

prediction=model.predict(["He is a bad cat."])
print(prediction) 

我得到了错误。

问题 1:我必须用哪种格式写这句话?如果我把这个模型给我的朋友,他怎么知道他必须以哪种格式把句子放到这个模型中?

问题 2:我注意到输出将具有 (None,1) 格式。但我希望看到一个数字(0 或 1)而不是奇怪的向量。发生了什么以及如何获得 0 或 1?

【问题讨论】:

  • 模型需要像训练数据一样对测试句进行预处理(标记化和填充)。
  • @Erwan 谢谢!但我不明白怎么做。对于标记化,我需要单词索引。在训练之前,我得到了单词索引和标记化的句子(如果我理解正确,这取决于这个单词索引)。现在我想使用我训练有素的模型。如何在没有单词索引的情况下标记新句子?所以我必须再次重复所有步骤(包括创建单词索引)?所以如果它是正确的那么我必须把这个带有模型的单词索引列表给我的朋友吗?
  • 问题是我对Keras不熟悉,所以我不知道如何在技术上做到这一点,希望有人能给你一个完整的答案。可以肯定的是,必须有一种方法来保存标记器本身或训练词汇(带有索引),以便以后可以加载并应用于新文本。这是做到这一点的方法。顺便说一句,有些测试词可能不在训练词汇表中,简单的方法就是忽略它们。

标签: tensorflow nlp lstm


【解决方案1】:

在进行预测之前,您必须将文本转换为输入格式。

例如,预测“他是一只坏猫”。你必须对句子进行标记。

#tokenizing the prediction data
sentence=['He is a bad cat.']
sequences=tokenizer.texts_to_sequences(sentence)

然后你必须给它添加填充

#padding the tokenized sentence
padded=pad_sequences(sequences,maxlen=max_length,truncating=trunc_type)

然后你可以对填充序列进行预测

model1.predict(padded) #output: array([[0.00079787]], dtype=float32)

输出将是一个不完全是 0 或 1 的浮点数,因为模型会根据给定句子给出接近嵌入的负面或正面的值。

有关更多详细信息,请参阅此工作gist。谢谢。

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多