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

使用GTZAN数据集时,频谱图转换为Tensor为何全为1?

GTZAN频谱图转Tensor全为1的问题排查

我正在做基于GTZAN数据集的音乐风格分类项目,这个数据集包含1000首分属10种风格的歌曲。现在尝试把歌曲的频谱图数据集转换成Tensor,但得到的结果全是值为1的Tensor。

我的实现代码如下:

transform = T.Compose([
T.Resize(image_size),
T.ToTensor()
])

data = torchvision.datasets.ImageFolder(root = root, transform = transform)

train_loader = DataLoader(train_dataset,
                          batch_size=batch_size,
                          shuffle=True)
test_loader = DataLoader(test_dataset,
                         batch_size*2)

dataiter = iter(train_loader)
images, labels = dataiter.next()

返回的images[1]示例如下:

tensor([[[1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         ...,
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.]],

        [[1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         ...,
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.]],

        [[1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         ...,
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.],
         [1., 1., 1.,  ..., 1., 1., 1.]]])

排查方向与解决方法

  • 数据划分漏洞:代码里定义了data但直接用了train_dataset和test_dataset,这两个变量没有定义过程。大概率是没做数据集划分,或者划分时没关联带transform的data。正确划分示例:
    from torch.utils.data import random_split
    
    train_size = int(0.8 * len(data))
    test_size = len(data) - train_size
    train_dataset, test_dataset = random_split(data, [train_size, test_size])
    
  • 图像本身异常:打开数据集里的任意一张频谱图,如果是纯白色(RGB值255),那ToTensor()归一化后自然全是1.0。这种情况要检查频谱图生成过程是否出错。
  • 单独测试验证:跳过DataLoader,直接加载单张图测试转换结果,定位问题点:
    from PIL import Image
    
    img_path = "数据集内某张频谱图的路径"
    img = Image.open(img_path).convert('RGB')
    transformed_img = transform(img)
    print(f"最小值:{transformed_img.min()},最大值:{transformed_img.max()}")
    
    如果输出的最小、最大值都是1.0,说明图像本身有问题;否则就是数据集加载/划分环节出错。

内容的提问来源于stack exchange,提问作者Hector

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:31