2017-12-27 32 views
1

이 위대한 기사 (http://machinethink.net/blog/coreml-custom-layers/) 덕분에 Keras 사용자 지정 레이어로 coremltools 및 Lambda를 사용하여 변환하는 방법을 이해했습니다. 그러나 두 가지 매개 변수를 사용하여 상황을 이해할 수는 없습니다.Core ML에 두 개의 매개 변수가있는 사용자 지정 레이어

#python 
def scaling(x, scale): 
    return x * scale 

Keras layer 여기에 있습니다. 이 상황에

#python 
up = conv2d_bn(mixed, 
        K.int_shape(x)[channel_axis], 
        1, 
        activation=None, 
        use_bias=True, 
        name=name_fmt('Conv2d_1x1')) 
x = Lambda(scaling, # HERE !! 
      output_shape=K.int_shape(up)[1:], 
      arguments={'scale': scale})(up) 
x = add([x, up]) 

, 어떻게 스위프트에 custom MLCustomLayer class에서 func evaluate(inputs: [MLMultiArray], outputs: [MLMultiArray])을 쓸 수 있습니까? 나는 x * scale 같은
#swift 
func evaluate(inputs: [MLMultiArray], outputs: [MLMultiArray]) throws { 
    for i in 0..<inputs.count { 
    let input = inputs[i] 
    let output = outputs[i] 

    for j in 0..<input.count { 
     let x = input[j].floatValue 
     let y = x/(1 + exp(-x)) 
     output[j] = NSNumber(value: y) 
    } 
    } 
} 

어떻게

약 2 매개 변수 기능, 다음과 같이 하나의 매개 변수 기능 상황에서 이해?

전체 코드는 여기입니다.

Keras https://github.com/osmszk/dla_team14/blob/master/facenet/code/facenet_keras_v2.py하여 사용자 층 https://github.com/osmszk/dla_team14/blob/master/facenet/coreml/CoremlTest.ipynb

  • 네트워크 모델과 코어 ML 모델로 변환

    • 감사합니다.

  • 답변

    1

    scale은 배우기 쉬운 매개 변수가 아닌 하이퍼 매개 변수 인 것처럼 보입니다. 맞습니까?

    그런 경우 scale을 사용자 지정 레이어의 매개 변수 사전에 추가해야합니다. Swift 클래스에서 scaleinit(parameters) 함수에 전달 된 매개 변수 사전 안에 있습니다. 그것을 속성에 저장 한 다음 evaluate(inputs, outputs) 속성에서 다시 읽습니다.

    블로그 게시물에 실제로 어떻게하는지 보여줍니다. ;-)

    +0

    오! 정말 고맙습니다. 나는 네가 그렇게 논평했다. – osmszk

    +0

    네, 맞습니다. 'scale'은 하이퍼 매개 변수입니다. 결실을 맺은 블로그 게시물과 코드 덕택에이 문제를 해결할 수있었습니다! – osmszk

    +0

    많은 sooooo 감사합니다! – osmszk

    1

    나는 hollance의 블로그 덕분에 이런 식으로이 문제를 해결했다. 이 경우 func을 변환 할 때 convert_lambda에 사용자 정의 레이어에 scale 매개 변수를 추가해야합니다. (코어 ML 변환)

    파이썬 코드

    def convert_lambda(layer): 
        if layer.function == scaling: 
         params = NeuralNetwork_pb2.CustomLayerParams() 
    
         params.className = "scaling" 
         params.description = "scaling input" 
    
         # HERE!! This is important. 
         params.parameters["scale"].doubleValue = layer.arguments['scale'] 
    
         return params 
        else: 
         return None 
    
    coreml_model = coremltools.converters.keras.convert(
        model, 
        input_names="image", 
        image_input_names="image", 
        output_names="output", 
        add_custom_layers=True, 
        custom_conversion_functions={ "Lambda": convert_lambda }) 
    

    SWIFT 코드 (사용자 층)

    //custom MLCustomLayer `scaling` class 
    let scale: Float 
    
    required init(parameters: [String : Any]) throws { 
        if let scale = parameters["scale"] as? Float { 
         self.scale = scale 
        } else { 
         self.scale = 1.0 
        } 
        print(#function, parameters, self.scale) 
        super.init() 
    } 
    
    func evaluate(inputs: [MLMultiArray], outputs: [MLMultiArray]) throws { 
    
        for i in 0..<inputs.count { 
         let input = inputs[i] 
         let output = outputs[i] 
    
         for j in 0..<input.count { 
          let x = input[j].floatValue 
          let y = x * self.scale 
          output[j] = NSNumber(value: y) 
         } 
         //faster 
         /* 
         let count = input.count 
         let inputPointer = UnsafeMutablePointer<Float>(OpaquePointer(input.dataPointer)) 
         let outputPointer = UnsafeMutablePointer<Float>(OpaquePointer(output.dataPointer)) 
         var scale = self.scale 
         vDSP_vsmul(inputPointer, 1, &scale, outputPointer, 1, vDSP_Length(count)) 
         */ 
        } 
    } 
    

    감사합니다.