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 1Oto 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