1

我为下一个单词预测做了一个 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”。

这些是我的 keras 和 mlmodel 的嵌入层的权重。 Keras 模型 ML 模型

4

0 回答 0