这个问题以前曾被问过,但并不完全符合我的情况。
right = 0
mistake = 0
plt.figure(figsize=(16,16))
for i in range(test_image_batch.shape[0]):
plt.subplot(12,12, i+1)
plt.imshow(test_image_batch[i])
plt.axis('off')
bestnum = 0.0
bestclass = 0
for j in range(10):
if bestnum < batch_prediction_array[i][j]:
bestnum = batch_prediction_array[i][j]
bestclass = j
print("bestclass", bestclass) #only gives the correct maxmimum value when bestclass is declared inside the outer for loop
if test_label[i] == bestclass:
plt.title(cifar10_labels[bestclass])
right += 1
else:
plt.title(cifar10_labels[bestclass] + "!=" + cifar10_labels[test_label[i][0]], color='#ff0000')
mistake += 1
这是我的代码的一部分,该代码搜索最大预测值并将其绘制在图形上。
据我所知,bestclass应该具有更内部作用域的值,因此,当在for i in range(test_image_batch.shape[0]):
的内部和外部首次声明bestclass时,bestclass应该具有相同的值。但是,事实并非如此。当在外部for循环内声明时,bestclass仅为所有batch_prediction_array [i]提供正确的最大值。当在外部for循环外声明bestclass时,它仅为第一个batch_prediction_array [i]打印正确的最大值。
我100%确信除了上面显示的代码外,没有在代码的其他任何地方声明bestclass。
这更奇怪,因为我无法重现相同的行为。
所以我的问题是我想念什么?我了解LEGB规则,但在这种情况下。它似乎没有遵循LEGB规则。
如果这完全有帮助,我来自Java背景。
编辑:我刚刚发现,当bestclass在外部for循环之外声明时,if语句被跳过,但是bestclass的值更改为1。(即batch_prediction_array[0][3]
)