我为下一词预测制作了一个keras模型。当我将其导出到mlmodel并将其用于文本预测时,keras和mlmodel的结果会有所不同。我曾经使用Netron来可视化模型。我意识到转换过程中某些图层的权重发生了变化。但是我已经参考了官方的coreml文档。您能帮我解决这个问题吗?预先感谢。
当我看到权重和预测的差异时,我尝试使用onnx将keras转换为onnx,将onnx转换为mlmodel。但是出现了这样的错误:将onnx模型转换为mlmodel时,出现“类型不支持的ONNX ops: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")
结果完全不同。例如:对于输入:“我读”,keras模型预测为“ it,book,this”,而ml模型预测为“ thought,had,was”。
这些是我的keras和mlmodel嵌入层的权重。 Keras Model ML Model