CIFAR10图片的Hinge/Softmax Loss计算索引越界报错求助
CIFAR10图片Hinge/Softmax损失计算报错修复
报错原因分析
报错index 1 is out of bounds for axis 0 with size 1出现在softmax_loss函数的对数运算行,核心问题有两个:
- 标签维度不匹配:从
y_train取出的标签是二维数组(如[[3]]),直接用于索引时会导致维度混乱。 - 索引逻辑错误:
softmax是形状为(1,10)的单样本预测结果,代码中用range(num_classes)(即0-9)作为行索引,试图访问10行数据,但实际只有1行,触发越界。
修复方案
1. 修正softmax_loss函数
将输入的标签转换为标量,并调整softmax的索引方式,匹配单样本的形状:
def softmax_loss(y_true, y_pred): softmax = np.exp(y_pred) / np.sum(np.exp(y_pred), axis=1, keepdims=True) # 将二维标签转为标量,取对应类别的softmax值 y_true_scalar = y_true.item() loss = -np.log(softmax[0, y_true_scalar]) return loss
2. 同步优化循环中的标签处理
在循环里直接将标签转为标量,减少函数内的额外处理:
# 原代码 y_true_s = y_train[i] # 修改为 y_true_s = y_train[i].item()
完整修复后代码
import numpy as np from keras.datasets import cifar10 # 定义权重矩阵 W = np.random.rand(10, 3072) # 加载CIFAR-10数据集 (x_train, y_train), (x_test, y_test) = cifar10.load_data() # 展平图片 x_train_flat = x_train.reshape(x_train.shape[0], -1) # 计算单张图片的Hinge Loss def hinge_loss(y_true, y_pred): margin = 1. loss = np.maximum(0., margin - y_true * y_pred) return loss # 计算单张图片的Softmax Loss def softmax_loss(y_true, y_pred): softmax = np.exp(y_pred) / np.sum(np.exp(y_pred), axis=1, keepdims=True) loss = -np.log(softmax[0, y_true]) return loss hinge_losses = [] softmax_losses = [] # 遍历训练集每张图片 for i in range(x_train_flat.shape[0]): # 计算预测值 x_i = x_train_flat[i, :] y_i = np.dot(W, x_i) # 计算Hinge Loss y_true_h = np.zeros_like(y_i) y_true_h[y_train[i].item()] = 1 hinge_loss_value = np.sum(hinge_loss(y_true_h, y_i)) hinge_losses.append(hinge_loss_value) # 计算Softmax Loss y_true_s = y_train[i].item() softmax_loss_value = np.sum(softmax_loss(y_true_s, y_i.reshape(1, -1))) softmax_losses.append(softmax_loss_value) # 打印平均损失值 print("Average Hinge Loss:", np.mean(hinge_losses)) print("Average Softmax Loss:", np.mean(softmax_losses))
内容的提问来源于stack exchange,提问作者Melina
相关产品推荐
相关产品推荐

