【发布时间】:2020-03-20 07:29:28
【问题描述】:
我正在尝试在我的 Swift 应用程序中使用此代码库 (Slot-Filling-Understanding-Using-RNNs) 创建的一些模型。
我能够将lstm_nopooling、lstm_nopooling300 和lstm 转换为CoreML。
在model.py我使用了这个代码:
def save_model(self):
joblib.dump(self.summary, 'models/' + self.name + '.txt')
self.model.save('models/' + self.name + '.h5')
try:
coreml_model = coremltools.converters.keras.convert(self.model, input_names="main_input", output_names=["intent_output","slot_output"])
coreml_model.save('models/' + self.name + '.mlmodel')
except:
pass
print("Saved model to disk")
我正在尝试将向量转换回意图和插槽。
我有这个,但是
func tokenizeSentences(instr: String) -> [Int] {
let s = instr.lowercased().split(separator: " ")
var ret = [Int]()
if let filepath = Bundle.main.path(forResource: "atis.dict.vocab", ofType: "csv") {
do {
let contents = try String(contentsOfFile: filepath)
print(contents)
var lines = contents.split { $0.isNewline }
var pos = 0
for word in s {
if let index = lines.firstIndex(of: word) {
print(index.description + " " + word)
ret.append(index)
}
}
return ret
} catch {
// contents could not be loaded
}
} else {
// example.txt not found!
}
return ret
}
func predictText(instr:String) {
let model = lstm_nopooling300()
guard let mlMultiArray = try? MLMultiArray(shape:[20,1,1],
dataType:MLMultiArrayDataType.int32) else {
fatalError("Unexpected runtime error. MLMultiArray")
}
let tokens = tokenizeSentences(instr: instr)
for (index, element) in tokens.enumerated() {
mlMultiArray[index] = NSNumber(integerLiteral: element)
}
guard let m = try? model.prediction(input: lstm_nopooling300Input.init(main_input: mlMultiArray))
else {
fatalError("Unexpected runtime error. MLMultiArray")
}
let mm = m.intent_output
let length = mm.count
let doublePtr = mm.dataPointer.bindMemory(to: Double.self, capacity: length)
let doubleBuffer = UnsafeBufferPointer(start: doublePtr, count: length)
let output = Array(doubleBuffer)
print("******** intents \(mm.count) ********")
print(output)
let mn = m.slot_output
let length2 = mn.count
let doublePtr2 = mm.dataPointer.bindMemory(to: Double.self, capacity: length2)
let doubleBuffer2 = UnsafeBufferPointer(start: doublePtr2, count: length2)
let output2 = Array(doubleBuffer2)
print("******** slots \(mn.count) ********")
print(output2)
}
}
当我运行我的代码时,我得到了这个,被截断的意图:
******** 意图 540 ********
[0.0028914143331348896, 0.0057610333897173405, 4.1651015635579824e-05, 0.15935245156288147,5.6665314332349226e-05,5.7797817134996876e-05,0.0044302307069301605,0.00012486864579841495,0.0004683282459154725,0.003053907072171569,3.806956738117151e-05,0.012112349271774292,5.861848694621585e-05,0.0031344725284725428, P>
我认为问题在于 id 位于 pickle 文件中,因此可能位于 atis/atis.train.pkl 中。
我所做的只是训练模型并将我可以转换的模型转换为 CoreML,现在我正在尝试使用它,但不确定下一步该做什么。
我有一个文本字段,我输入“伦敦的当前天气”,我希望得到类似的东西(这是来自运行 example.py)
{'intent': 'weather_intent', 'slots': [{'name': 'city', 'value': 'London'}]}
这里是 coreml 输入/输出
【问题讨论】:
-
您运行了哪些代码来生成该输出?
-
@smac89 - 我有一个我写的应用程序,我试图在其中使用它,这就是我运行的代码。如果您查看 swift 代码,我显示的是“打印(输出)”,但我只想显示返回值的一小部分。我添加了更多代码,因为我忘记了一个功能并显示所有功能可能会有所帮助。
-
模型实际输出了什么?原始 model.py 显示它需要一个 argmax 来获取索引,然后在表中查找某些内容。从您的问题来看,尚不清楚输出数据是什么样的以及应该如何获取这些 argmax。
-
@MatthijsHollemans - 谢谢。添加了我输入的内容和我期望得到的内容,或接近它的内容。
-
但是我问你从模型中得到了什么。有多少输出,它们的数据类型是什么,它们的形状是什么等?
标签: python swift tensorflow chatbot coreml