/ / Jak zmapować funkcję za pomocą dodatkowego parametru przy użyciu nowego zestawu danych APi w TF1.3? - python, tensorflow, programowanie funkcjonalne, zestawy danych tensorflow

Sposobu mapowania funkcji z dodatkowy parametr przy użyciu nowego interfejsu api zestawu danych w TF1.3?-python, tensorflow, programowanie funkcyjne, zestawów danych tensorflow

Bawię się Dataset API w Tensorflow v1.3. Wspaniale. Możliwe jest mapowanie zestawu danych za pomocą funkcji zgodnie z opisem tutaj. Interesuje mnie, jak mogę przekazać funkcję, która ma dodatkowy argument, na przykład arg1:

def _parse_function(example_proto, arg1):
features = {"image": tf.FixedLenFeature((), tf.string, default_value=""),
"label": tf.FixedLenFeature((), tf.int32, default_value=0)}
parsed_features = tf.parse_single_example(example_proto, features)
return parsed_features["image"], parsed_features["label"]

Oczywiście,

dataset = dataset.map(_parse_function)

nie będzie działać, ponieważ nie ma możliwości przekazania arg1.

Odpowiedzi:

13 dla odpowiedzi nr 1

Oto przykład użycia wyrażenia lambda do zawijania funkcji, do której chcemy przekazać argument:

import tensorflow as tf
def fun(x, arg):
return x * arg

my_arg = tf.constant(2, dtype=tf.int64)
ds = tf.data.Dataset.range(5)
ds = ds.map(lambda x: fun(x, my_arg))

W powyższym przykładzie podpis funkcji udostępnionej map musi pasować do zawartości naszego zestawu danych. Musimy więc napisać nasze wyrażenie lambda, aby to dopasować. Tutaj jest to proste, ponieważ zbiór danych zawiera tylko jeden element x który zawiera elementy w zakresie od 0 do 4.

Jeśli to konieczne, możesz przekazać dowolną liczbę zewnętrznych argumentów spoza zestawu danych: ds = ds.map(lambda x: my_other_fun(x, arg1, arg2, arg3), i tak dalej.

Aby sprawdzić, czy powyższe działa, możemy zauważyć, że mapowanie rzeczywiście mnoży każdy element zestawu danych przez dwa:

iterator = ds.make_initializable_iterator()
next_x = iterator.get_next()
with tf.Session() as sess:
sess.run(iterator.initializer)

while True:
try:
print(sess.run(next_x))
except tf.errors.OutOfRangeError:
break

Wyjście:

0
2
4
6
8