Python 3.x 当试图运行tf.conflusion矩阵时,它给出了序列结束错误
我正在使用新的tensoflow输入管道准备数据集,下面是我的代码: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_
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_标签列表和我的困惑?