Почему я получаю ошибки формы, когда пытаюсь передать пакет из API набора данных Tensorflow в мои сеансовые операции? - PullRequest
0 голосов
/ 09 мая 2018

Я имею дело с проблемой при переходе на API набора данных, и мне кажется, что у меня пока недостаточно опыта работы с API, чтобы знать, как справиться с описанной ниже ситуацией. В настоящее время у нас есть расширение изображения, которое мы выполняем в настоящее время с использованием очередей и пакетной обработки. Мне было поручено проверить новый API набора данных и выполнить преобразование поверх существующей реализации, используя его, а не очереди.

То, что мы хотели бы сделать, это получить ссылку на все пути и обработать все операции только из этой ссылки. Как вы видите в инициализации набора данных, я сопоставил parse_fn с самим набором данных, который затем выполняет чтение файла и извлечение начальных значений из имен файлов. Однако, когда я затем вызываю метод итераторов next_batch и затем передаю эти значения в get_summary, я теперь получаю сообщение об ошибке формы. Я пробовал несколько вещей, которые просто меняют ошибку, и поэтому я чувствовал, что должен увидеть, видел ли кто-либо на SO, что я все об этом ошибался и должен идти другим путем. Что-то вылетает как абсолютно неправильное в моем использовании API набора данных?

Должен ли я больше не называть опов таким образом? Я заметил, что в большинстве примеров, которые я видел, они получали пакет, передавали переменные в операционную систему, а затем записывали ее в переменную и передавали ее в sess.run, однако я не нашел простого способа сделать это с все же с нашей установкой, которая не ошибалась, таким образом, это был подход, который я использовал вместо этого (но это все еще ошибочно). Я буду продолжать пытаться отследить проблему и опубликовать здесь, если я что-нибудь найду, но если кто-то что-то увидит, пожалуйста, сообщите. Спасибо!

Текущая ошибка:

... в сводке get_summary, acc = sess.run ([self._summary_op, self._accuracy], feed_dict = feed_dict) ValueError: невозможно передать значение shape (32,) для Tensor 'ph_input_labels: 0', который имеет форму '(?, 1)

Ниже приведен блок, где вызывается метод get_summary и выдается ошибка:

def perform_train():
    if __name__ == '__main__':
        #Get all our image paths
        filenames = data_layer_train.get_image_paths()
        next_batch, iterator = preproc_image_fn(filenames=filenames)

    with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:
        with sess.graph.as_default():
            # Set the random seed for tensorflow
            tf.set_random_seed(cfg.RNG_SEED)

            classifier_network = c_common.create_model(len(products_to_class_dict), is_training=True)
            optimizer, global_step_var = c_common.create_optimizer(classifier_network)

            sess.run(tf.local_variables_initializer())
            sess.run(tf.global_variables_initializer())

            # Init tables and dataset iterator
            sess.run(tf.tables_initializer())
            sess.run(iterator.initializer)

            cur_epoch = 0
            blobs = None
            try:
                epoch_size = data_layer_train.get_steps_per_epoch()
                num_steps = num_epochs * epoch_size
                for step in range(num_steps):
                    timer_summary.tic()
                    if blobs is None:
                        #Now populate from our training dataset
                        blobs = sess.run(next_batch)

                    # *************** Below is where it is erroring *****************
                    summary_train, acc = classifier_network.get_summary(sess, blobs["images"], blobs["labels"], blobs["weights"])

            ...

Поверьте, ошибка в preproc_image_fn:

def preproc_image_fn(filenames, images=None, labels=None, image_paths=None, cells=None, weights=None):
    def _parse_fn(filename, label, weight):
        augment_instance = False
        paths=[]
        selected_cells=[]
        if vals.FIRST_ITER:
            #Perform our check of the path to see if _data_augmentation is within it
            #If so set augment_instance to true and replace the substring with an empty string
            new_filename = tf.regex_replace(filename, "_data_augmentation", "")
            contains = tf.equal(tf.size(tf.string_split([filename], "")), tf.size(tf.string_split([new_filename])))
            filename = new_filename
            if contains is True:
                augment_instance = True

        core_file = tf.string_split([filename], '\\').values[-1]
        product_id = tf.string_split([core_file], ".").values[0]

        label = search_tf_table_for_entry(product_id)
        weight = data_layer_train.get_weights(product_id)

        image_string = tf.read_file(filename)
        img = tf.image.decode_image(image_string, channels=data_layer_train._channels)
        img.set_shape([None, None, None])
        img = tf.image.resize_images(img, [data_layer_train._target_height, data_layer_train._target_width])
        #Previously I was returning the below, but I was getting an error from the op when assigning feed_dict stating that it didnt like the dictionary
        #retval = dict(zip([filename], [img])), label, weight
        retval = img, label, weight
        return retval

    num_files = len(filenames)
    filenames = tf.constant(filenames)

    #*********** Setup dataset below ************
    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels, weights))
    dataset=dataset.map(_parse_fn)
    dataset = dataset.repeat()
    dataset = dataset.batch(32)
    iterator = dataset.make_initializable_iterator()

    batch_features,  batch_labels, batch_weights = iterator.get_next()
    return {'images': batch_features, 'labels': batch_labels, 'weights': batch_weights}, iterator

def search_tf_table_for_entry(self, product_id):
    '''Looks up keys in the table and outputs the values. Will return -1 if not found '''
    if product_id is not None:
        return self._products_to_class_table.lookup(product_id)
    else:
        if not self._real_eval:
            logger().info("class not found in training {} ".format(product_id))
        return -1

Где я создаю модель и уже использовал заполнители:

...
 def create_model(self):
    weights_regularizer = tf.contrib.layers.l2_regularizer(cfg.TRAIN.WEIGHT_DECAY)
    biases_regularizer = weights_regularizer

    # Input data.
    self._input_images = tf.placeholder(
        tf.float32, shape=(None, self._image_height, self._image_width, self._num_channels), name="ph_input_images")
    self._input_labels = tf.placeholder(tf.int64, shape=(None, 1), name="ph_input_labels")
    self._input_weights = tf.placeholder(tf.float32, shape=(None, 1), name="ph_input_weights")
    self._is_training = tf.placeholder(tf.bool, name='ph_is_training')
    self._keep_prob = tf.placeholder(tf.float32, name="ph_keep_prob")
    self._accuracy = tf.reduce_mean(tf.cast(self._correct_prediction, tf.float32))
    ...
    self.create_summaries()

def create_summaries(self):
    val_summaries = []
    with tf.device("/cpu:0"):
        for var in self._act_summaries:
            self._add_act_summary(var)
        for var in self._train_summaries:
            self._add_train_summary(var)

    self._summary_op = tf.summary.merge_all()
    self._summary_op_val = tf.summary.merge(val_summaries)

def get_summary(self, sess, images, labels, weights):
    feed_dict = {self._input_images: images, self._input_labels: labels,
                 self._input_weights: weights, self._is_training: False}

    summary, acc = sess.run([self._summary_op, self._accuracy], feed_dict=feed_dict)

    return summary, acc

1 Ответ

0 голосов
/ 09 мая 2018

Так как ошибка говорит:

Невозможно передать значение shape (32,) для Tensor 'ph_input_labels: 0', который имеет форму '(?, 1)

Полагаю, ваша labels в get_summary имеет форму [32]. Вы можете просто изменить его на (32, 1)? Или, может быть, изменить метку ранее в _parse_fn?

...