pytorch自制数据集用于分类实验问题

本人自制数据集用于分类实验,使用的是pytorch,生成的数据如下:

X_train_tensor.shape = torch.Size([12601, 32, 32])
Y_train_tensor.shape = torch.Size([12601])

使用网上的方法将数据转为Dataset和DataLoader:

train_dataset = TensorDataset(X_train,Y_train)
test_dataset = TensorDataset(x_test,y_test)

train_loader = torch.utils.data.DataLoader(dataset = train_dataset, shuffle = True)
test_loader = torch.utils.data.DataLoader(dataset = test_dataset, shuffle = True)

在实际分类实验中,一直遇到类似错误:

RuntimeError: Given groups=1, weight of size [64, 3, 3, 3], expected input[1, 100, 32, 32] to have 3 channels, but got 100 channels instead

请问这种自制数据集应该怎样修改才适合于pytorch搭建的2D神经网络分类实验。

这个错误是由于Conv2d卷积层的输入通道数和输入数据的通道数不匹配造成的。Conv2d卷积层的输入数据的形状应该是(batch_size, channels, height, width),其中channels指输入数据的通道数。在这个错误中,Conv2d卷积层的输入数据应该有64个通道,但实际输入的数据却有100个通道,因此引发了错误。
解决这个问题的方法是,检查输入数据的通道数是否正确,确保与Conv2d卷积层的输入通道数匹配。如果输入数据的通道数不正确,可以使用torch.nn.functional.interpolate函数进行插值,将输入数据的通道数调整为正确的值。
举个例子,假设输入数据的形状为(batch_size, 100, height, width),Conv2d卷积层的输入通道数为64,可以使用如下代码进行插值


import torch.nn.functional as F
x = F.interpolate(x, size=(height, width), mode='bilinear', align_corners=True)
x = x[:, :64, :, :]

根据您提供的错误信息,可以看出是您的输入数据通道数不符合您的神经网络的输入要求。一般来说,卷积神经网络的输入应该是一个四维张量,即[batch_size, channels, height, width]。您的输入数据形状为[12601, 32, 32],缺少通道数。因此,您需要将输入数据的形状改为[12601, 1, 32, 32],其中1是通道数。

可以使用torch.unsqueeze函数将输入数据的形状从三维转换为四维,并在通道维度上添加一个维度,代码如下:

X_train_tensor = torch.unsqueeze(X_train_tensor, dim=1)

这样修改之后,X_train_tensor.shape应该变为torch.Size([12601, 1, 32, 32]),train_loader和test_loader的使用方式不变。

另外,您可能需要根据您的实际情况对数据进行标准化处理,以便更好地训练模型。常见的方法是对输入数据进行均值和标准差标准化,可以使用torchvision.transforms.Normalize函数实现。

该回答引用ChatGPT
根据错误提示,可以看出是输入的数据维度不符合模型的要求。模型期望输入的数据是3通道的,而实际输入的数据是100通道的。因此,需要将数据的通道数修改为3。
可以通过以下代码将数据的通道数修改为3:
python
X_train_tensor = X_train_tensor.repeat(3, 1, 1, 1)

这里使用了PyTorch中的repeat函数,将数据在第一个维度上重复3次,即将原来的单通道数据复制成3通道数据。
修改后的代码如下:
python
X_train_tensor = X_train_tensor.repeat(3, 1, 1, 1)
train_dataset = TensorDataset(X_train_tensor, Y_train_tensor)
test_dataset = TensorDataset(x_test, y_test)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, shuffle=True)

这样就可以将自制数据集适配到PyTorch的2D神经网络分类实验中了。