В целях тестирования я хочу прикрепить идентификатор к каждому образцу в моем tf.dataset. Для этого достаточно просто считать вверх.
Мой набор данных имеет тип FlatMapDataset fwiw.
for entry in img_ds:
print(entry.shape)
(128, 128, 3)
(128, 128, 3)
(128, 128, 3)
(128, 128, 3)
...
Я попытался создать функцию отображения, которая определяет счетчик внутри него и считает вверх:
@staticmethod
def map_to_id(img):
try:
ExperimentalPipeline.map_to_id.id_counter += 1
except AttributeError:
ExperimentalPipeline.map_to_id.id_counter = 0
return img, ExperimentalPipeline.map_to_id.id_counter
, а затем использует Dataset.map
из tf.data для прикрепления идентификатора к каждому образцу:
img_ds = img_ds.map(ExperimentalPipeline.map_to_id)
К сожалению, это не работает, каждый образец получает нулевой идентификатор:
for i, id in img_ds:
print(f"{i.shape}, {id}")
(128, 128 , 3), 0
(128, 128, 3), 0
(128, 128, 3), 0
(128, 128, 3), 0
...
Я также заметил, что моя функция map_to_id
вызывается только один раз.
@staticmethod
def map_to_id(img):
print("enter map_to_id")
try:
ExperimentalPipeline.map_to_id.id_counter += 1
except AttributeError:
print("caught exception")
ExperimentalPipeline.map_to_id.id_counter = np.random.randint(1000)
return img, ExperimentalPipeline.map_to_id.id_counter
enter map_to_id
пойманное исключение
(128, 128, 3 ), 889
(128, 128, 3), 889
(128, 128, 3), 889
(128, 128, 3), 889
Я думаю, Я не понимаю, как Dataset.map
должен работать. Я думал, что он возьмет каждый образец в наборе данных, к которому он вызывается, и вызовет поставляемую функцию с образцом в качестве аргумента.
Может кто-нибудь помочь мне разобраться в этом?