You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:48:07