TensorFlow / Keras: Как передать имя файла в мой набор данных при использовании генератора? - PullRequest
0 голосов
/ 30 мая 2019

Я использую TensorFlow 1.12 в нетерпеливом исполнении. Я создаю свой набор данных следующим образом:

train = tf.data.Dataset.from_generator(generator=train_sample_fetcher, output_types=(tf.float32, tf.float32))

Генератор выдает изображение и соответствующие аннотации. Во время предсказания я хочу знать имя файла образца, на котором я предсказываю. Возможно ли это с помощью одного и того же генератора? Я ищу что-то вроде , но подходящее для моего случая энергичного исполнения и генераторов. Я попытался дополнительно получить тензор tf.string с именем файла (в этом случае output_types=(tf.float32, tf.float32, tf.string), но это не работает:

Traceback (most recent call last):
  File "fcn.py", line 140, in <module>
    result = model.predict(val, steps=int(np.ceil(num_val_samples / BATCH_SIZE)))
  File "tensorflow/python/keras/engine/training.py", line 1490, in predict
    self, x, batch_size=batch_size, verbose=verbose, steps=steps)
  File "tensorflow/python/keras/engine/training_eager.py", line 1125, in predict_loop
    return iterator_predict_loop(model, inputs, steps, verbose=verbose)
  File "tensorflow/python/keras/engine/training_eager.py", line 641, in iterator_predict_loop
    '`target` value here.' % next_element)
TypeError: not all arguments converted during string formatting

(я не понимаю эту ошибку.) Моя функция генератора выглядит следующим образом:

def train_sample_fetcher():
    return sample_fetcher()

def val_sample_fetcher():
    return sample_fetcher(is_validations=True)

def sample_fetcher(is_validations=False):
    sample_names = [filename[:-4] for filename in os.listdir(DIR_DATASET + "ndarrays/")]
    if not is_validations: sample_names = sample_names[:int(len(sample_names) * TRAIN_VAL_SPLIT)]
    else: sample_names = sample_names[int(len(sample_names) * TRAIN_VAL_SPLIT):]
    for sample_name in sample_names:
        rgb = tf.image.decode_jpeg(tf.read_file(DIR_DATASET + sample_name + ".jpg"))
        rgb = tf.image.resize_images(rgb, (HEIGHT, WIDTH))
        #d = tf.image.decode_jpeg(tf.read_file(DIR_DATASET + "depth/" + sample_name + ".jpg"))
        #d = tf.image.resize_images(d, (HEIGHT, WIDTH))
        #rgbd = tf.concat([rgb,d], axis=2)
        onehots = tf.convert_to_tensor(np.load(DIR_DATASET + "ndarrays/" + sample_name + ".npy"), dtype=tf.float32)
        yield rgb, onehots#, tf.convert_to_tensor(sample_name, dtype=tf.string)

Существуют ли другие, возможно, более элегантные решения для извлечения имен файлов из соответствующих образцов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...