测试模型时如何处理 keras 中的 InvalidArgumentError?
How can I handle InvalidArgumentError in keras while testing my model?
我正在对 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
是 google 新闻预训练向量 .
我训练了我的模型,在训练过程中一切正常。所以我腌制了模型以供进一步使用。
但是在我加载模型并向其传递一些句子以 class 化它们的另一个文件中, 分类器 class 引发 InvalidArgumentError。下面的代码显示 分类器 class.
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]]
谁能帮我避免这个错误?
我花了大约 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'))
希望对厌倦了这个错误的其他人有用。
我正在对 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
是 google 新闻预训练向量 .
我训练了我的模型,在训练过程中一切正常。所以我腌制了模型以供进一步使用。
但是在我加载模型并向其传递一些句子以 class 化它们的另一个文件中, 分类器 class 引发 InvalidArgumentError。下面的代码显示 分类器 class.
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]]
谁能帮我避免这个错误?
我花了大约 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'))
希望对厌倦了这个错误的其他人有用。