【问题标题】:when trying to run tf.confusion matrix it gives end of sequence error当尝试运行 tf.confusion 矩阵时,它给出了序列结束错误
【发布时间】:2018-10-15 07:18:38
【问题描述】:

我正在使用新的 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)

现在val_label_list 包含我的验证集所有批次的标签,我可以使用它来创建混淆矩阵:

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)]]

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

【问题讨论】:

    标签: python-3.x tensorflow


    【解决方案1】:

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

    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.zeros 创建了一个混淆矩阵?那是什么?
    • 它只是一个累加器变量,因此您可以继续添加每个批次的混淆矩阵结果
    • n_labels 呢?它来自哪里?
    • 这是混淆矩阵的大小,你拥有的“标签数量”
    • 我应该把这段代码放在哪里?我应该取消val_label_list和我的困惑吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2019-03-24
    • 2019-09-23
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多