我为下一个单词预测做了一个 keras 模型。当我将其导出到 mlmodel 并将其用于文本预测时,keras 和 mlmodel 的结果各不相同。我曾经使用 Netron 来可视化模型。我意识到某些层的权重在转换过程中发生了变化。但我为此参考了官方的 coreml 文档。你能帮我解决这个问题吗?提前致谢。
当我看到权重和预测的差异时,我尝试使用 onnx 将 keras 转换为 onnx,将 onnx 转换为 mlmodel。但是在将 onnx 模型转换为 mlmodel 时出现了这个错误:“类型不支持的 ONNX 操作:Cast、Gather、Shape、Identity”。
这是我的 LSTM 模型:
model = Sequential()
model.add(Embedding(vocab_size, 10, input_length=max_length-1))
model.add(LSTM(100, return_sequences=True))
model.add(LSTM(50))
model.add(Dense(100, activation='relu'))
model.add(Dense(vocab_size, activation='softmax'))
print(model.summary())
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
model.fit(X, y, epochs=100, verbose=2)
预测功能:
def generate_seq(model, tokenizer, seq_length, seed_text, n_words):
result = list()
#n_words is the number of predictions I want
in_text = seed_text
# generate a fixed number of words
for _ in range(n_words):
# encode the text as integer
encoded = tokenizer.texts_to_sequences([in_text])[0]
# truncate sequences to a fixed length
encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre')
y_prob=model.predict(encoded)
#sort out the top n_words in order of the highest prob
top_indices = y_prob.argsort()[0][-n_words:][::-1]
# map predicted word index to word
out_word = ''
for top_index in top_indices:
for word, index in tokenizer.word_index.items():
if index == top_index:
out_word+= word+' '
break
return out_word
keras 到 coreml 的转换代码:
from keras.models import load_model
import coremltools
model = coremltools.converters.keras.convert("model_train.h5")
model.save("model_train.mlmodel")
结果完全不同。例如:对于输入:“I read”,keras 模型预测“it,book,this”,而 mlmodel 预测“thought,had,was”。