0 Replies
      Latest reply on Nov 30, 2019 10:20 AM by nissanjames
      nissanjames Level 1 Level 1 (0 points)

        I put the code in https://stackoverflow.com/questions/59024502/convert-from-tensorflow-coreml-3-0-for-slot-intent-detection but basically I took a Keras model, converted it to CoreML 3.0 and put it into my application.

         

        I get back an array similar to this truncated one:

        ******** intents 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,

         

        when I try to look at what was returned.

         

        This is my code, as the only thing missing is that I use text from a textfield to call the predict function.

         

        So, how do I get back the correct intent and slot values?

         

        Also, is there any book/tutorial that can help with doing deep learning for language? All of them seem to be for images.

         

            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)

            }

        }