2016-06-18 10 views

Odpowiedz

32

Nie ma różnicy w precyzji między a+b a tf.add(a, b). Były przekłada się a.__add__(b) który zostanie odwzorowany na tf.add za pomocą following line w math_ops.py

_OverrideBinaryOperatorHelper(gen_math_ops.add, "add")

Jedyną różnicą jest to, że nazwa węzła w leżącej wykres jest add zamiast Add. Można ogólnie porównać rzeczy patrząc na podstawowej reprezentacji Graph jak ten

tf.reset_default_graph() 
dtype = tf.int32 
a = tf.placeholder(dtype) 
b = tf.placeholder(dtype) 
c = a+b 
print(tf.get_default_graph().as_graph_def()) 

Można także zobaczyć bezpośrednio poprzez kontrolę sposobu __add__. Jest dodatkowy poziom pośredni, ponieważ jest to zamknięcie, ale można dostać się funkcję podstawową następująco

real_function = tf.Tensor.__add__.im_func.func_closure[0].cell_contents 
print(real_function.__module__ + "." + real_function.__name__) 
print(tf.add.__module__ + "." + tf.add.__name__) 

I zobaczysz wyjście poniżej, co oznacza, że ​​nazywają sama funkcja bazowy

tensorflow.python.ops.gen_math_ops.add 
tensorflow.python.ops.gen_math_ops.add 

You można zobaczyć z tf.Tensor.OVERLOADABLE_OPERATORS że Python następujące metody specjalne są potencjalnie przeciążony odpowiednich wersjach TensorFlow

{'__abs__', 
'__add__', 
'__and__', 
'__div__', 
'__floordiv__', 
'__ge__', 
'__getitem__', 
'__gt__', 
'__invert__', 
'__le__', 
'__lt__', 
'__mod__', 
'__mul__', 
'__neg__', 
'__or__', 
'__pow__', 
'__radd__', 
'__rand__', 
'__rdiv__', 
'__rfloordiv__', 
'__rmod__', 
'__rmul__', 
'__ror__', 
'__rpow__', 
'__rsub__', 
'__rtruediv__', 
'__rxor__', 
'__sub__', 
'__truediv__', 
'__xor__'} 

Ci meto ds zostały opisane w Python reference 3.3.7: emulacja typów liczbowych. Zauważ, że model danych Pythona nie zapewnia możliwości przeciążenia operatora przypisania =, więc przydział zawsze używa natywnej implementacji Pythona.

+1

Dlaczego więc te metody tensorflow są w ogóle zdefiniowane? – Hossein

Powiązane problemy