Python报错AttributeError: 'dict'对象无'train'属性,代码问题求助
解决SVHN加载时的AttributeError: 'dict' object has no attribute 'train'
嘿,这个坑我之前踩过!咱们先把问题拆明白:
你用scipy.io.loadmat()加载SVHN的.mat文件后,得到的svhn是一个Python字典,而不是像TensorFlow/Keras内置数据集那种封装好的、带.train属性的对象。所以你写svhn.train.images的时候,字典根本不知道.train是什么,自然就报错了。
看你前面的代码其实已经找对方向了——你用svhn['X']和svhn['y']已经正确拿到了训练数据和标签,后面那两行错误的代码完全是多余的,而且用错了方式。
修正后的完整代码片段
import scipy.io as sio import matplotlib.pyplot as plt import numpy as np def main(unused_argv): # Load training data image_ind = 10 svhn_train = sio.loadmat('train_32x32.mat') # 获取训练图像和标签 x_train = svhn_train['X'] y_train = svhn_train['y'] # 显示样本(这部分你原来的代码是对的,记得加show()才能显示) plt.imshow(x_train[:,:,:,image_ind]) plt.show() print(f"原始标签:{y_train[image_ind]}") # 重要:调整图像维度——SVHN的X是(32,32,3,样本数),转成深度学习常用的(样本数,32,32,3) x_train = np.transpose(x_train, (3, 0, 1, 2)) # 处理标签:SVHN里用10表示数字0,替换成0方便后续分类 y_train[y_train == 10] = 0 y_train = np.asarray(y_train, dtype=np.int32).flatten() # 转成一维数组 # 加载测试集,用同样的方式处理 svhn_test = sio.loadmat('test_32x32.mat') x_test = svhn_test['X'] y_test = svhn_test['y'] x_test = np.transpose(x_test, (3, 0, 1, 2)) y_test[y_test == 10] = 0 y_test = np.asarray(y_test, dtype=np.int32).flatten() # 现在x_train、y_train就是可以直接用的训练数据啦 print(f"训练集形状:{x_train.shape}") print(f"训练标签形状:{y_train.shape}") if __name__ == "__main__": main(None)
关键改动说明
- 删掉了错误的
train_data = svhn.train.images和train_labels = np.asarray(svhn.train.labels, dtype=np.int32),改用字典键来获取数据 - 调整了图像维度:因为SVHN的原始数据维度是
(宽, 高, 通道数, 样本数),而大部分深度学习框架期望输入是(样本数, 宽, 高, 通道数),所以用np.transpose()转置 - 修正了标签:SVHN的标签里数字0被标记为10,替换成0后才能正常做10分类任务
- 给测试集的加载也做了同样的正确处理
这样改完之后,就不会再出现那个AttributeError啦!
内容的提问来源于stack exchange,提问作者mleas
相关产品推荐
相关产品推荐

