这个错误是可能是由于在DataLoader的工作进程中尝试访问CUDA设备导致的。PyTorch的DataLoader使用多进程加载数据,而CUDA上下文不能在子进程中直接使用。
修改前的代码为:
def prepare_data(file_path):
# 读取Excel文件
df = pd.read_excel(file_path, header=None)
df = df.iloc[1:]
print(df)
# 提取特征和标签
features = df.iloc[:, :-1].values.astype('float32') # extract feature
labels = df.iloc[:, -1].values.astype('int64') # extract label
# 数据标准化
scaler = StandardScaler()
features = scaler.fit_transform(features)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
features, labels, test_size=0.2, random_state=42
)
# 转换为PyTorch张量并移动到设备
X_train = torch.tensor(X_train, device=device)
X_test = torch.tensor(X_test, device=device)
y_train = torch.tensor(y_train, device=device)
y_test = torch.tensor(y_test, device=device)
return X_train, X_test, y_train, y_test, scaler
数据加载修改为下运行OK:
class ExcelDataset(Dataset):
def __init__(self, features, labels):
# 确保数据在CPU上
self.features = features.cpu() if features.is_cuda else features
self.labels = labels.cpu() if labels.is_cuda else labels