Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 当试图运行tf.conflusion矩阵时,它给出了序列结束错误_Python 3.x_Tensorflow - Fatal编程技术网

Python 3.x 当试图运行tf.conflusion矩阵时,它给出了序列结束错误

Python 3.x 当试图运行tf.conflusion矩阵时,它给出了序列结束错误,python-3.x,tensorflow,Python 3.x,Tensorflow,我正在使用新的tensoflow输入管道准备数据集,下面是我的代码: train_data = tf.data.Dataset.from_tensor_slices(train_images) train_labels = tf.data.Dataset.from_tensor_slices(train_labels) train_set = tf.data.Dataset.zip((train_data,train_labels)).shuffle(500).batch(30) valid_

我正在使用新的tensoflow输入管道准备数据集,下面是我的代码:

train_data = tf.data.Dataset.from_tensor_slices(train_images)
train_labels = tf.data.Dataset.from_tensor_slices(train_labels)
train_set = tf.data.Dataset.zip((train_data,train_labels)).shuffle(500).batch(30)

valid_data = tf.data.Dataset.from_tensor_slices(valid_images)
valid_labels = tf.data.Dataset.from_tensor_slices(valid_labels)
valid_set = tf.data.Dataset.zip((valid_data,valid_labels)).shuffle(200).batch(20)

test_data = tf.data.Dataset.from_tensor_slices(test_images)
test_labels = tf.data.Dataset.from_tensor_slices(test_labels)
test_set = tf.data.Dataset.zip((test_data, test_labels)).shuffle(200).batch(20)

# create general iterator
iterator = tf.data.Iterator.from_structure(train_set.output_types, train_set.output_shapes)
next_element = iterator.get_next()
train_init_op = iterator.make_initializer(train_set)
valid_init_op = iterator.make_initializer(valid_set)
test_init_op  = iterator.make_initializer(test_set)
现在,我想在培训后为CNN模型的验证集创建一个混淆矩阵,以下是我尝试做的:

sess.run(valid_init_op)
valid_img, valid_label = next_element
finalprediction = tf.argmax(train_predict, 1)
actualprediction = tf.argmax(valid_label, 1)
confusion_matrix = tf.confusion_matrix(labels=actualprediction,predictions=finalprediction,
                                       num_classes=num_classes,dtype=tf.int32,name=None, weights=None)
print(sess.run(confusion_matrix, feed_dict={keep_prob: 1.0}))
通过这种方式,它创建了混淆矩阵,但仅用于一批验证集。为此,我尝试收集列表中的所有验证集批次,然后使用列表创建混淆矩阵:

val_label_list = []    
sess.run(valid_init_op)
for i in range(valid_iters):
    while True:
          try:
              elem = sess.run(next_element[1])
              val_label_list.append(elem)
          except tf.errors.OutOfRangeError:
              print("End of append.")
          break
val_label_list = np.array(val_label_list)
val_label_list = val_label_list.reshape(40,2)
finalprediction = tf.argmax(train_predict, 1)
actualprediction = tf.argmax(val_label_list, 1)
confusion = tf.confusion_matrix(labels=actualprediction,predictions=finalprediction, 
                    num_classes=num_classes, dtype=tf.int32,name="Confusion_Matrix")
现在val_label_列表包含我的验证集的所有批次的标签,我可以使用它创建混淆矩阵:

val_label_list = []    
sess.run(valid_init_op)
for i in range(valid_iters):
    while True:
          try:
              elem = sess.run(next_element[1])
              val_label_list.append(elem)
          except tf.errors.OutOfRangeError:
              print("End of append.")
          break
val_label_list = np.array(val_label_list)
val_label_list = val_label_list.reshape(40,2)
finalprediction = tf.argmax(train_predict, 1)
actualprediction = tf.argmax(val_label_list, 1)
confusion = tf.confusion_matrix(labels=actualprediction,predictions=finalprediction, 
                    num_classes=num_classes, dtype=tf.int32,name="Confusion_Matrix")
但现在,当我想运行混淆矩阵并打印它时:

print(sess.run(confusion, feed_dict={keep_prob: 1.0}))
这给了我一个错误:

OutOfRangeError: End of sequence
     [[Node: IteratorGetNext_5 = IteratorGetNext[output_shapes=[[?,10,32,32], [?,2]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](Iterator_5)]]

谁能告诉我如何处理这个错误?或者解决我的原始问题的任何其他解决方案?

该问题与图形流执行有关。 请看这一行:

print(sess.run(confusion, feed_dict={keep_prob: 1.0}))
您正在运行图表以获取“混乱”值。因此,所有依赖节点也将被执行。然后:

finalprediction = tf.argmax(train_predict, 1)
actualprediction = tf.argmax(val_label_list, 1)
confusion = tf.confusion_matrix(...)
我猜您对train_predict的调用将尝试从已完全迭代的训练迭代器中获取新元素,然后触发错误

您应该直接在循环中计算混淆矩阵,并将结果累积到变量中

sess.run(valid_init_op)
confusion_matrix = np.zeros(n_labels,n_labels)
while True:
      try:
          conf_matrix = sess.run(confusion)
          confusion_matrix += conf_matrix
      except tf.errors.OutOfRangeError:
          print("End of append.")
      break

你能在回答的最后一部分给出更多的细节吗?你可以用np.0创建一个混淆矩阵吗?那是什么?它只是一个累加器变量,所以你可以继续在那里添加每个批次的混淆矩阵结果。那么n_标签呢?它来自哪里?它是混淆矩阵的大小,你拥有的“标签数量”,我应该把这段代码放在哪里?我是否应该取消val_标签列表和我的困惑?