keras和mlmodel结果的差异

时间:2019-09-03 10:44:28

标签: python keras coremltools onnx

我为下一词预测制作了一个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

0 个答案:

没有答案