tenorflow, сегментация изображения convnet InvalidArgumentError: вход для изменения формы является тензором со значениями 28800000, но запрошенная форма имеет 57600 - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь сегментировать изображения из задачи BRATS.Я использую сеть U-net в комбинации этих двух репозиториев:

https://github.com/zsdonghao/u-net-brain-tumor

https://github.com/jakeret/tf_unet

Когда я пытаюсь вывести статистику прогноза, ошибка формы несоответствияcome up:

InvalidArgumentError: Вход для изменения формы является тензором с 28800000 значений, но запрошенная форма имеет 57600 [[Node: Reshape_2 = Reshape [T = DT_FLOAT, Tshape = DT_INT32, _device = "/задание: localhost / реплика: 0 / задача: 0 / устройство: ЦП: 0 "] (_arg_Cast_0_0, Reshape_2 / shape)]]

Я использую фрагменты изображения 240x240, с batch_verification_size = 500

Тогда

  • это форма test_x: (500, 240, 240, 1)
  • это форма test_y: (500, 240, 240, 1)
  • это тест формы x: (500, 240, 240, 1)
  • это тест формы y: (500, 240, 240, 1)
  • этопартия формы x: (500, 240, 240, 1)
  • это партия формы y: (500, 240, 240, 1)
  • это прогноз формы: (500, 240,240, 1)
  • это стоимость: Тензор ("add_88: 0 ", shape = (), dtype = float32)
  • это стоимость: Тензор (" Mean_2: 0 ", shape = (), dtype = float32)
  • это формапрогноз: (?,?,?, 1)
  • это партия формы x: (500, 240, 240, 1)
  • это партия формы y: (500, 240, 240, 1)

240 x 240 x 500 = 28800000 Я не знаю, почему запрашивает 57600

Похоже, ошибка возникает из функции output_minibatch_stats:

summary_str, loss, acc, predictions = sess.run([self.summary_op, 
                                                self.net.cost, self.net.accuracy, 
self.net.predicter], 
feed_dict={self.net.x: batch_x,
self.net.y: batch_y,
self.net.keep_prob: 1.})

Поэтому что-то не так в функции sess.run tf.Ниже приведен код, где появляется ошибка.Кто-нибудь есть идеи, что произойдет?

def store_prediction(self, sess, batch_x, batch_y, name):
    print('track 1')
            prediction = sess.run(self.net.predicter, feed_dict={self.net.x: batch_x, 
                                                                 self.net.y: batch_y, 
                                                                 self.net.keep_prob: 1.})
            print('track 2')
            pred_shape = prediction.shape



loss = sess.run(self.net.cost, feed_dict={self.net.x: batch_x, 
                                                       self.net.y: batch_y, `
                                                       self.net.keep_prob: 1.})
        print('track 3')
        logging.info("Verification error= {:.1f}%, loss= {:.4f}".format(error_rate(prediction,
                                                                          util.crop_to_shape(batch_y,
                                                                                             prediction.shape)),
                                                                          loss))
        print('track 4')
        print('this is shape batch x: ' + str(batch_x.shape))
        print('this is shape batch y: ' + str(batch_y.shape))
        print('this is shape prediction: ' + str(prediction.shape))
        #img = util.combine_img_prediction(batch_x, batch_y, prediction)
        print('track 5')
        #util.save_image(img, "%s/%s.jpg"%(self.prediction_path, name))

        return pred_shape

    def output_epoch_stats(self, epoch, total_loss, training_iters, lr):
        logging.info("Epoch {:}, Average loss: {:.4f}, learning rate: {:.4f}".format(epoch, (total_loss / training_iters), lr))

    def output_minibatch_stats(self, sess, summary_writer, step, batch_x, batch_y):
        print('this is shape cost : ' + str(self.net.cost.shape))
        print('this is cost : ' + str(self.net.cost))
        print('this is  acc : ' + str(self.net.accuracy.shape))
        print('this is cost : ' + str(self.net.accuracy))
        print('this is shape prediction: ' + str(self.net.predicter.shape))
        print('this is shape batch x: ' + str(batch_x.shape))
        print('this is shape batch y: ' + str(batch_y.shape))


        # Calculate batch loss and accuracy
        summary_str, loss, acc, predictions = sess.run([self.summary_op, 
                                                            self.net.cost, 
                                                            self.net.accuracy, 
                                                            self.net.predicter], 
                                                           feed_dict={self.net.x: batch_x,
                                                                      self.net.y: batch_y,
                                                                      self.net.keep_prob: 1.})
        print('track 6')
        summary_writer.add_summary(summary_str, step)
        print('track 7')
        summary_writer.flush()
        logging.info("Iter {:}, Minibatch Loss= {:.4f}, Training Accuracy= {:.4f}, Minibatch error= {:.1f}%".format(step,
                                                                                                            loss,
                                                                                                            acc,
                                                                                                            error_rate(predictions, batch_y)))
        print('track 8')

1 Ответ

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

Вы устанавливаете размер партии в 1 в своем конвейере тензорного потока во время обучения, но вводите размер партии 500 в свои данные тестирования.Вот почему сеть запрашивает только тензор формы 57600. Вы можете установить размер тренировочной партии 500 или размер тестовой партии равным 1.

...