Machine learning Tensorflow训练和验证输入队列分离

Machine learning Tensorflow训练和验证输入队列分离,machine-learning,computer-vision,tensorflow,deep-learning,Machine Learning,Computer Vision,Tensorflow,Deep Learning,我试图用TensorFlow复制完全卷积网络的结果。我用过。我只需要编写培训包装。我创建了两个共享变量的图和两个输入队列,一个用于培训,一个用于验证。为了测试我的培训包装器,我使用了两个简短的培训和验证文件列表,并在每个培训阶段之后立即进行验证。我还从输入队列中打印出每个图像的形状,以检查是否得到正确的输入。然而,在我开始训练之后,似乎只有来自训练队列的图像被排出来。因此,训练图和验证图都从训练队列中获取输入,并且验证队列永远不会被访问。有人能帮助解释和解决这个问题吗 以下是相关代码的一部分:

我试图用TensorFlow复制完全卷积网络的结果。我用过。我只需要编写培训包装。我创建了两个共享变量的图和两个输入队列,一个用于培训,一个用于验证。为了测试我的培训包装器,我使用了两个简短的培训和验证文件列表,并在每个培训阶段之后立即进行验证。我还从输入队列中打印出每个图像的形状,以检查是否得到正确的输入。然而,在我开始训练之后,似乎只有来自训练队列的图像被排出来。因此,训练图和验证图都从训练队列中获取输入,并且验证队列永远不会被访问。有人能帮助解释和解决这个问题吗

以下是相关代码的一部分:

def get_数据(图像名称列表、num_时代、范围名称、num_类=num_类):
使用tf.variable_scope(scope_name)作为作用域:
images_path=[os.path.join(DATASET_DIR,i+'.jpg'),用于图像_name_列表中的i]
gts_path=[os.path.join(GT_DIR,i+'.png'),表示图像_name_列表中的i]
seed=random.randint(02147483647)
image\u name\u queue=tf.train.string\u input\u producer(image\u path,num\u epochs=num\u epochs,shuffle=False,seed=seed)
gt_name_queue=tf.train.string_input_producer(gts_路径,num_epochs=num_epochs,shuffle=False,seed=seed)
reader=tf.WholeFileReader()
image\u键,image\u值=reader.read(image\u name\u队列)
my_image=tf.image.decode_jpeg(图像值)
my_image=tf.cast(my_image,tf.float32)
my_image=tf.expand_dims(my_image,0)
gt_key,gt_value=reader.read(gt_name\u队列)
#gt代表地面真理
my_gt=tf.cast(tf.image.decode_png(gt_值,通道=1),tf.float32)
my_gt=tf.one_hot(tf.cast(my_gt,tf.int32),NUM_类)
返回我的\u图像,我的\u gt
列车图像,列车gt=获取列车数据(列车文件,数字历元,“列车”)
val_image,val_gt=get_数据(val_文件,NUM_历元,“验证”)
以tf.变量_范围('FCN16')作为范围:
列车_vgg16_fcn=fcn16_vgg.FCN16VGG()
train_vgg16_fcn.build(train_映像,train=True,num_classes=num_CLASS,keep_prob=keep_prob)
作用域。重用_变量()
val_vgg16_fcn=fcn16_vgg.FCN16VGG()
val_vgg16_fcn.build(val_image,train=False,num_classes=num_CLASS,keep_prob=1)
"""
在计算图中定义损失、评估指标、汇总、节省。初始化变量并启动会话。
"""
对于范围内的历元(起始历元、数值历元):
对于范围内的i(列数):
_,损失值,形状=sess.run([train\u op,train\u entropy\u loss,tf.shape(train\u image)])
打印形状
对于范围内的i(val_num):
损耗值,形状=sess.run([val\u熵损耗,tf.shape(val\u图像)])
打印形状

要确保您正在阅读可以运行的不同图像,请执行以下操作:

[train_image_np, val_image_np] = sess.run([train_image, val_image])
要重用变量,这会更好、更安全:

with tf.variable_scope('FCN16') as scope:
   train_vgg16_fcn = fcn16_vgg.FCN16VGG()  
   train_vgg16_fcn.build(train_image, train=True, num_classes=NUM_CLASS, keep_prob = KEEP_PROB)
with tf.variable_scope(scope, reuse=True):
   val_vgg16_fcn = fcn16_vgg.FCN16VGG()
   val_vgg16_fcn.build(val_image, train=False, num_classes=NUM_CLASS, keep_prob = 1)

您找到答案了吗?我没有一个好的答案,但建议在单独的过程中运行评估。它更容易、更干净。如果不想这样做,可以创建两个不同的图和会话,并将验证输入队列与之关联。