2017-11-19 1 views
1

これは、linkに続いて、maskというカスタマイズされたopを作成しました。 tensorflow OPの 本体は、実際にはかなり多くの引用のリンクをたどるValueError:オペレーション名に「mask/Mask」という数字の勾配1が生成されました

def tf_mask(x, labels, epoch_, name=None): # add "labels" to the input 
    with ops.name_scope(name, "Mask", [x, labels, epoch_]) as name: 
     z = py_func(np_mask, 
       [x, labels, epoch_], # add "labels, epoch_" to the input list 
       [tf.float32], 
       name=name, 
       grad=our_grad) 
     z = z[0] 
     z.set_shape(x.get_shape()) 
     return z 

です。しかし、私はこのエラーに遭遇:必要な場合には

ValueError: Num gradients 1 generated for op name: "mask/Mask" 
op: "PyFunc" 
input: "conv2/Relu" 
input: "Placeholder_2" 
input: "Placeholder_3" 
attr { 
    key: "Tin" 
    value { 
    list { 
     type: DT_FLOAT 
     type: DT_FLOAT 
     type: DT_FLOAT 
    } 
    } 
} 
attr { 
    key: "Tout" 
    value { 
    list { 
     type: DT_FLOAT 
    } 
    } 
} 
attr { 
    key: "_gradient_op_type" 
    value { 
    s: "PyFuncGrad302636" 
    } 
} 
attr { 
    key: "token" 
    value { 
    s: "pyfunc_0" 
    } 
} 
do not match num inputs 3 

、これは私が勾配を計算するour_grad関数を定義する方法です。

def our_grad(cus_op, grad): 
    """Compute gradients of our custom operation. 
    Args: 
    param cus_op: our custom op tf_mask 
    param grad: the previous gradients before the operation 
    Returns: 
    gradient that can be sent down to next layer in back propagation 
    it's an n-tuple, where n is the number of arguments of the operation 
    """ 
    x = cus_op.inputs[0] 
    labels = cus_op.inputs[1] 
    epoch_ = cus_op.inputs[2] 
    n_gr1 = tf_d_mask(x) 
    n_gr2 = tf_gradient2(x, labels, epoch_) 

    return tf.multiply(grad, n_gr1) + n_gr2 

py_func機能(引用リンクと同じ)

def py_func(func, inp, tout, stateful=True, name=None, grad=None): 
    """ 
    I omitted the introduction to parameters that are not of interest 
    :param func: a numpy function 
    :param inp: input tensors 
    :param grad: a tensorflow function to get the gradients (used in bprop, should be able to receive previous 
       gradients and send gradients down.) 

    :return: a tensorflow op with a registered bprop method 
    """ 
    # Need to generate a unique name to avoid duplicates: 
    rnd_name = 'PyFuncGrad' + str(np.random.randint(0, 1000000)) 
    tf.RegisterGradient(rnd_name)(grad) 
    g = tf.get_default_graph() 
    with g.gradient_override_map({"PyFunc": rnd_name}): 
     return tf.py_func(func, inp, tout, stateful=stateful, name=name) 

は本当にコミュニティの助けが必要!

ありがとうございます!

答えて

1

申し訳ありませんが、私はこの問題を自分で解決しました。

テンソルフロー関数gradients_impl.pyでエラーメッセージが生成されました。

def _VerifyGeneratedGradients(grads, op): 
    """Verify that gradients are valid in number and type. 

    Args: 
    grads: List of generated gradients. 
    op: Operation for which the gradients where generated. 

    Raises: 
    ValueError: if sizes of gradients and inputs don't match. 
    TypeError: if type of any gradient is not valid for its input. 
    """ 
    if len(grads) != len(op.inputs): 
    raise ValueError("Num gradients %d generated for op %s do not match num " 
        "inputs %d" % (len(grads), op.node_def, len(op.inputs))) 

今、私たちは、このエラーは、当社のOP Maskするための手段と見ることができ、我々はそれを3つの入力を与えました。 TensorFlowは、勾配を生成する関数に対して3つの出力を与えることを期待しています。our_grad、各出力は順方向伝搬の関数の入力です。

実際には最初の入力のグラデーションのみが必要で、他の2つのグラデーションはバックプロパゲーションでは使用されません.WECANは正しい形状のfake_gradientsをもう2つ返します。

関連する問題