TensorFlow: Почему моя форма тензора изображения должна совпадать с формой тензора этикетки? - PullRequest
0 голосов
/ 27 мая 2019

Я хочу сделать семантическую сегментацию, используя TensorFlow 1.12.Я создаю набор данных, используя from_generator(), где мой генератор выглядит следующим образом:

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 tf.stack([rgb, onehots])

Другими словами, у меня есть тензор метки, содержащий вектор метки с горячей меткой длины 21 (21 класс) для каждогопиксели.Однако это не разрешено в соответствии с этой трассировкой стека:

Traceback (most recent call last):
  File "semantic_fpn.py", line 89, in <module>
    callbacks=[checkpoint_full, checkpoint_weights, tensorboard])
  File ".../site-packages/tensorflow/python/keras/engine/training.py", line 1574, in fit
    steps=validation_steps)
  File ".../site-packages/tensorflow/python/keras/engine/training.py", line 975, in _standardize_user_data
    next_element = x.get_next()
  File ".../site-packages/tensorflow/python/data/ops/iterator_ops.py", line 623, in get_next
    return self._next_internal()
  File ".../site-packages/tensorflow/python/data/ops/iterator_ops.py", line 564, in _next_internal
    output_shapes=self._flat_output_shapes)
  File ".../site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 2266, in iterator_get_next_sync
    _six.raise_from(_core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.UnknownError: InvalidArgumentError: Shapes of all inputs must match: values[0].shape = [512,512,3] != values[1].shape = [512,512,21] [Op:Pack] name: stack

Почему это не разрешено?Как я могу обойти это?

1 Ответ

1 голос
/ 27 мая 2019

tf.stack операция пытается объединить N тензоров ранга K в один тензор ранга (K + 1). Другими словами, он пытается соединить последовательность тензоров вдоль новой оси и, следовательно, другая ось тензоров должна быть такой же.

Может просто вернуть пару yield rgb, onehots из вашего генератора.

...