Python报错:'bool' object is not subscriptable,求代码修复方案
解决TypeError: 'bool' object is not subscriptable问题
错误原因
报错出在get_correct_indices函数的correct[i]语句上。调用y_model.mean()时未指定轴参数,会把整个模型输出张量压缩成单个标量值,后续np.argmax处理后得到单个整数,和labels比较后生成的是一个单个布尔值,而非与样本数量对应的布尔数组。尝试用correct[i]下标访问时,自然会触发报错——布尔值不属于可下标对象。
简单修复方法
1. 修正get_correct_indices函数
如果模型输出是形状为(batch_size, num_classes)的概率分布(无额外集成维度),直接去掉多余的.mean()即可;如果是集成模型(输出含额外维度,比如(ensemble_size, batch_size, num_classes)),需给.mean()指定正确的轴(比如axis=0对集成模型结果取平均)。
修改后的函数示例:
def get_correct_indices(model, x, labels): y_model = model(x) # 若为集成模型,替换成 y_pred = np.argmax(y_model.mean(axis=0), axis=1) y_pred = np.argmax(y_model, axis=1) correct = y_pred == np.squeeze(labels) correct_indices = [i for i in range(x.shape[0]) if correct[i]] incorrect_indices = [i for i in range(x.shape[0]) if not correct[i]] return correct_indices, incorrect_indices
2. 同步修正plot_entropy_distribution函数
里面的probs计算也要对应调整,去掉不必要的.mean()或指定正确轴:
# 无集成维度时直接用 probs = model(x).numpy() # 集成模型时用 # probs = model(x).mean(axis=0).numpy()
验证
修改后,correct会变成长度等于样本数的布尔数组,correct[i]可正常访问每个样本的判断结果,报错即可解决。
内容的提问来源于stack exchange,提问作者Twity
相关产品推荐
相关产品推荐

