使用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,直接加载单张图测试转换结果,定位问题点:
如果输出的最小、最大值都是1.0,说明图像本身有问题;否则就是数据集加载/划分环节出错。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()}")
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

