У меня есть два кодовых набора ниже:
Один из них называется «рабочий код».
Другой называется «Нерабочий код».
В рабочем коде я использую простые вызовы функций для получения размера изображения (прокомментировано как «Простое кодирование - КОНЕЦ: Простое кодирование» в коде).
В нерабочем коде я заменяю его итератором 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()