Проблема в использовании сеанса по умолчанию после использования итератора tenorflow - PullRequest
0 голосов
/ 01 июля 2019

У меня есть два кодовых набора ниже:

Один из них называется «рабочий код». Другой называется «Нерабочий код».

В рабочем коде я использую простые вызовы функций для получения размера изображения (прокомментировано как «Простое кодирование - КОНЕЦ: Простое кодирование» в коде).

В нерабочем коде я заменяю его итератором tenorflow (прокомментированный как «Использовать итератор - END: Использовать итератор в коде).

Однако после использования итератора tenorflow у меня появляется следующее сообщение об ошибке:

arg = tf.shape (image) [0] .eval () ......... в _eval_using_default_session повышение ValueError («Не могу использовать сеанс по умолчанию для оценки тензора:» ValueError: Невозможно использовать сеанс по умолчанию для оценки тензора: график тензора отличается от графика сеанса. Передайте явный сеанс в eval (session = sess).

Другими словами, tenorflow eval () в коде 'arg = tf.shape (image) [0] .eval ()' в get_patches () больше не работает после использования итератора tenorflow. Похоже, что get_patches () неправильно инициализируется после использования итератора. Есть ли способ исправить эту проблему ???

### Working Code

import tensorflow as tf
import numpy as np
from glob import glob
p = print

class denoiser(object):

   def __init__(self, sess):
        self.sess = sess
        self.y = tf.placeholder("int32", None)
        self.z = self.y + 30
        init_op = tf.global_variables_initializer()
        self.dataset = dataset(self.sess)
        init = tf.global_variables_initializer()
        self.sess.run(init)

   def train(self, sess):
        my_size = self.dataset.obtain_size()
        size = sess.run(self.z, feed_dict={self.y: 4}) + my_size + 3000
        p('size:', size) 

class dataset(object):

   def __init__(self, sess):
        self.sess = sess
        filename = tf.convert_to_tensor('../Data/SIDD_Medium_Srgb/Data/train_clean/0001_GT_SRGB_011.PNG', 'string')

        ## Plain Coding
        image = im_read(filename)
        self.my_size = get_patches(image)
        ## END: Plain Coding

   def obtain_size(self):
        size = self.sess.run(self.my_size)
        return size

def im_read(filename):
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_png(image_string, channels=3) 
    image = tf.image.convert_image_dtype(image_decoded, tf.float32)
    return image

def get_patches(image):
    arg = tf.shape(image)[0].eval()
    size = 30 + arg
    size = tf.convert_to_tensor(size)
    return size

def main():
    with tf.Session() as sess:
          model = denoiser(sess)
          denoiser.train(model, sess)

main()


### Non-working Code

import tensorflow as tf
import numpy as np
from glob import glob
p = print

class denoiser(object):

    def __init__(self, sess):
        self.sess = sess
        self.y = tf.placeholder("int32", None)
        self.z = self.y + 30
        init_op = tf.global_variables_initializer()
        self.dataset = dataset(self.sess)
        init = tf.global_variables_initializer()
        self.sess.run(init)

    def train(self, sess):
        my_size = self.dataset.obtain_size()
        size = sess.run(self.z, feed_dict={self.y: 4}) + my_price + 3000
        p('size:', size) 

class dataset(object):

     def __init__(self, sess):
         self.sess = sess
         filename = [tf.convert_to_tensor('../Data/SIDD_Medium_Srgb/Data/train_clean/0001_GT_SRGB_011.PNG', 'string')]

         ## Use Iterator
         get_patches_fn = lambda image: get_patches(image) 
         data = (  
             tf.data.Dataset.from_tensor_slices(filename) 
             .map(im_read, num_parallel_calls=1)
             .map(get_patches_fn, num_parallel_calls=1)
             .batch(1)
             .prefetch(1)
         )

         iterator = data.make_one_shot_iterator()
         self.iter = iterator.get_next()
         ## END: Use Iterator

     def obtain_size(self):
         size= self.sess.run(self.iter)
         return size

def im_read(filename):
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_png(image_string, channels=3) 
    image = tf.image.convert_image_dtype(image_decoded, tf.float32)
    return image

def get_patches(image):
    arg = tf.shape(image)[0].eval()
    size = 30 + arg
    size = tf.convert_to_tensor(size)
    return size

def main():

    with tf.Session() as sess:
        model = denoiser(sess)
        denoiser.train(model, sess)

main()


...