【问题标题】:How can I handle InvalidArgumentError in keras while testing my model?测试模型时如何处理 keras 中的 InvalidArgumentError?
【发布时间】:2020-10-07 08:54:04
【问题描述】:

我正在对stanford140 dataset进行情绪分析。

我用这种架构设计了一个 keras 模型:

    embedding_layer = layers.Embedding(12995, 300, weights=[embedding_vectors], 
    input_length= 50, trainable=False)
    model = keras.models.Sequential()
    model.add(embedding_layer)
    model.add(layers.Conv1D(filters=128, kernel_size=3, activation='relu'))
    model.add(layers.MaxPooling1D(pool_size=2,strides=2))
    model.add(layers.LSTM(100))
    model.add(layers.Dense(64))
    model.add(layers.Dense(1, activation='sigmoid'))

下面的函数展示了我是如何创建 embedding_vectors 的(embedding_vectors 用于上一段代码的 embedding_layer)

def _create_embedding_vectors(self):
    self.vocab_size = len(self.tokenizer.word_index) + 1
    embedding_vectors = np.zeros((self.vocab_size,300))
    for word,i in self.tokenizer.word_index.items():
      try :
        embedding_vectors[i] = self.w2v[word]
      except KeyError :
        embedding_vectors[i] = np.zeros(300)

    return embedding_vectors 

self.vocab_size 是 12995 并且 self.tokenizer 已从 tensorflow.keras.preprocessing.text 导入。 self.w2v谷歌新闻预训练向量

我训练了我的模型,并且在训练过程中一切正常。所以我腌制了模型以供进一步使用。

但在另一个文件中,我加载模型并向其传递一些句子以对其进行分类,分类器类引发InvalidArgumentError。下面的代码显示了分类器类

class Classifier :
  

  def __init__(self,path_to_model,path_to_tokenizer) :
    self.model = self.load_model(path_to_model)
    self.tokenizer = self.load_tokenizer(path_to_tokenizer)

  

  def text_preprocessor (self,tweet) :
    # remove user mentions 
    tweet =re.sub('\s*@[a-zA-Z0-9]*\s*',' ',tweet) 
    # remove signle character
    tweet =re.sub('\s+[a-zA-Z0-9]\s+',' ',tweet) 
    # remove hashtag sign 
    tweet = re.sub('#','',tweet) 
    # remove underline 
    tweet = re.sub('_',' ',tweet) 
    # remove dash
    tweet = re.sub('-',' ',tweet) 
    # translate &
    tweet = re.sub('&', ' and ' , tweet)
    # lower
    tweet = tweet.lower()
    # remove punctuation 
    tweet = ' '.join([token for token in nltk.word_tokenize(tweet) if token not in punctuation])
    return tweet


  def load_model(self,path_to_model) :
    return keras.models.load_model(path_to_model)

  def load_tokenizer(self,path_to_tokenizer) :
    with open(path_to_tokenizer, 'rb') as file_reader:
      tokenizer = pickle.load(file_reader)
    return tokenizer 

  def transform_tweets(self,tweets) :
    encoded_docs = self.tokenizer.texts_to_sequences(tweets)
    max_length = 50
    x_test = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
    return x_test

  def predict(self,tweets) :
    tweets = list(map(self.text_preprocessor,tweets)) 
    x_test = self.transform_tweets(tweets) 
    y_pred = self.model.predict(x_test)
    return np.round(y_pred)

当我将一些文本传递给模型以预测他们的情绪时,我遇到了这个错误。

(0) Invalid argument: indices[3,16] = 12399 is not in [0, 12210)
 [[node sequential_111/embedding_111/embedding_lookup (defined at <ipython-input-2-71e9b0ec6210>:47) ]]
(1) Invalid argument: indices[3,16] = 12399 is not in [0, 12210)
 [[node sequential_111/embedding_111/embedding_lookup (defined at <ipython-input-2-71e9b0ec6210>:47) ]] [[sequential_111/embedding_111/embedding_lookup/_6]]

谁能帮我避免这个错误?

【问题讨论】:

    标签: python tensorflow keras sentiment-analysis


    【解决方案1】:

    我在大约 3 周的时间里训练这个错误。最后通过在设计模型的代码中省略input_length= 50,我避免了这个错误:) 下面的代码显示了我是如何创建模型的。


        embedding_layer = layers.Embedding(12995, 300, weights=[embedding_vectors], trainable=False)
        model = keras.models.Sequential()
        model.add(embedding_layer)
        model.add(layers.Conv1D(filters=128, kernel_size=3, activation='relu'))
        model.add(layers.MaxPooling1D(pool_size=2,strides=2))
        model.add(layers.LSTM(100))
        model.add(layers.Dense(64))
        model.add(layers.Dense(1, activation='sigmoid'))
    
    

    希望对厌倦此错误的其他人有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多