2017-05-29 3 views
0

Ich versuche, einen benutzerdefinierten Layer für die Verwendung in CNTK mithilfe der Python-Schnittstelle zu erstellen. Ich folge this guide, aber halten Sie eine TypeError Ausnahme direkt in der __init__ meiner Klasse geworfen. Beachten Sie, dass ich das Beispiel im verknüpften Handbuch einfach kopiert und eingefügt habe.Benutzerdefinierte Layer in CNTK python

import cntk as C 
import numpy as np 

class MySigmoid(UserFunction): 
    def __init__(self, arg, name='MySigmoid'): 
     super(MySigmoid, self).__init__([arg], name=name) 

    def forward(self, argument, device=None, outputs_to_retain=None): 
     sigmoid_x = 1/(1 + np.exp(-argument)) 
     return sigmoid_x, sigmoid_x 

    def backward(self, state, root_gradients): 
     sigmoid_x = state 
     return root_gradients * sigmoid_x * (1 - sigmoid_x) 

    def infer_outputs(self): 
     return [output_variable(self.inputs[0].shape, self.inputs[0].dtype, 
      self.inputs[0].dynamic_axes)] 

    @staticmethod 
    def deserialize(inputs, name, state): 
     return MySigmoid(inputs[0], name) 
model = C.layers.Sequential(C.layers.Dense(10), C.user_function(layers_extensions.MySigmoid(3))) 

Und das ist der Fehler, den ich bekommen:

File "...\layers_extensions.py", line 30, in __init__ 
    super(MySigmoid, self).__init__([arg], name=name) 
    File "c:\repos\cntk\bindings\python\cntk\ops\functions.py", line 1286, in __init__ 
    super(UserFunction, self).__init__(inputs, name) 
    File "c:\repos\cntk\bindings\python\cntk\ops\functions.py", line 109, in __init__ 
    super(Function, self).__init__(*args, **kwargs) 
    File "c:\repos\cntk\bindings\python\cntk\cntk_py.py", line 1698, in __init__ 
    this = _cntk_py.new_Function(_self, *args) 
TypeError: cannot convert list element to CNTK::Variable 

Ich habe versucht, diesen Fehler zu Google, aber nichts kommt. Kannst du mir helfen?

Antwort

1

Aus irgendeinem Grund übergibt CNTK den argument-Parameter in der forward(...)-Methode als Liste, auch wenn es sich um einen einzelnen Parameter handelt. Am Ende habe ich es geschafft, indem ich das erste von der Liste genommen habe. Sie finden das Arbeitsbeispiel here.