2016-03-27 17 views
10

To, czego szukam, to możliwość zastosowania tensorflow na każdym elemencie tensora 2d, np.Tensorflow stosuje się do każdego elementu 2d tensor

input = tf.Variable([[1.0, 2.0], [3.0, 4.0]) 
myCustomOp = ... # some kind of custom op that operates on 1D tensors 
finalResult = tf.[thing I'm after](input, myCustomOp) 
# when run final result should look like: [myCustomOp([1.0, 2.0]), myCustomOp([3.0, 4.0)] 

Wszelkie pomysły?

+2

Może 'map_fn'? Dokumenty - https://github.com/tensorflow/tensorflow/blob/5688f5bc27e65886ca84ea4a9d58f4bb7701964b/tensorflow/g3doc/api_docs/python/control_flow_ops.md#tfmap_fnfn-elems-dtypenone-parallel_iterations10-back_proptrue-swap_memoryfalse-namenone-map_fn –

Odpowiedz

19

Kolejna wersja TensorFlow (0,8, która jest obecnie dostępna, jeśli budować od źródła lub pobrać nightly build) zawiera higher-order operators tym tf.map_fn() i tf.scan(), które pozwalają na zastosowanie funkcję składa się z OPS TensorFlow do subtensors z większy tensor.

Funkcja tf.map_fn(fn, elems, ...) rozpakowuje wymiarową wejście Nelems wzdłuż pierwszego wymiaru na wiele N-1 wymiarową subtensors i stosuje fn każdej subtensor. Wydaje się to idealnie pasować do Twojego przypadku użycia:

input = tf.Variable([[1.0, 2.0], [3.0, 4.0]]) 
function_to_map = lambda x: f(x) # Where `f` instantiates myCustomOp. 
final_result = tf.map_fn(function_to_map, input) 
+0

Thanks to właśnie Jestem po: –

+0

Ponieważ 'tf.map_fn' istnieje, czy funkcje takie jak' tf.batch_matrix_inverse' są zbędne, ponieważ mogłyby zostać zastąpione przez 'tf.map_fn (tf.matrix_inverse, input)'? – dzhelil

+1

W zasadzie tak, ale w praktyce wydajność operacji 'tf.batch _ *()' będzie prawdopodobnie lepsza. Nie mogę się doczekać dnia, w którym optymalizator jest wystarczająco dobry, aby wygenerować lepszy kod dla wersji opartej na mapach! – mrry

Powiązane problemy