
最近尝试学习最近几年越来越火的深度学习目前最流行的深度学习构建工具是 pytorch。为了方便自己使用总结一下 pytorch 进行深度学习的一般步骤或标砖流程。文章目录1. 加载数据2. 数据标准化3. 数据转化为 tensor4. 划分训练/验证/测试集5. 创建 TensorDataset, DataLoader6. 创建模型类并新建一个实例7. 确定损失函数和优化器7.1 常用损失函数(1) 回归任务(2) 分类任务7.2 优化器Optimizer8. 训练9. 预测评估一个实例1. 加载数据加载原始数据并进行数据清洗一般通过 pandas 或 numpy 完成要明确哪些列是输入哪些是输出2. 数据标准化一般是 z 标准化或 minmax 标准化z 标准化将数据转化为均值为 0 标准差为 1 的正态分布数据minmax 标准化将数据都转化为 [0, 1] 之间的数可以通过 sklearn 中的 StandardScaler 或 MinMaxScaler然后调用fit_transform方法3. 数据转化为 tensor第三步与第四步可以互换。需要调用torch.tensor()函数Xtorch.tensor(X,dtypetorch.float32)ytorch.tensor(y,dtypetorch.long)或者用torch.FloatTensor直接转化为 float32对于浮点型数据或二分类数据以及所有的输入数据 X一般跟参数dtypetorch.float32对于多分类数据跟参数dtypetorch.long表示长整醒数据对于单列数据一般还要进一步跟上参数view()或unsqueeze()增加一个维度有时候可能需要减少维度用squeeze()。unsqueeze(dim) 的作用是在指定位置 dim新增一个 size 1 的维度例如importtorch x[1,2,3,4]ttorch.tensor(x)print(t)print(t.view(-1,1))# 或 print(t.unsqueeze(1))输出为tensor([1, 2, 3, 4])tensor([[1],[2],[3],[4]])view 里面的 -1 表示让程序自动推断行数大多数模型如 nn.Linear、CNN 等都要求输入形状为batch_size × features因此对于单列数据需要增加一个维度。4. 划分训练/验证/测试集一般训练集的比例为 80%剩余的为验证集或测试集。验证集、测试集很多时候是同一个。对于大规模数据训练集的比例可以更高非 batch 训练相当于 full batch5. 创建 TensorDataset, DataLoader划分为训练测试集后若想要 batch training则需要TensorDataset,DataLoader。TensorDataset是 PyTorch 用来管理、索引和处理数据的接口。DataLoader则是 Dataset 的批量加载工具。在 DataLoader 中可以定义 batch_size 并且打乱数据若不是 batch training相当于 full batch例如datasetTensorDataset(X_tensor,y_tensor)loaderDataLoader(dataset,batch_size32,shuffleTrue)若不需要打乱数据不需要将数据 batch也可以不定义 Dataset 和 DataLoaderDataLoader 还可以跟 num_workers 来启动多线程处理数据比较复杂的数据可能需要创建专门的类来生成 Dataset 和 DataLoader6. 创建模型类并新建一个实例一般通过继承 Pytorch 的 Module 类创建一个神经网络模型。在网络模型中要定义网络结构即输入单元隐含单元输出单元的数量层数与前向输出函数forward(self, x)。forward 的输入参数 x 为一个 batch 的输入数据input_size 为输入数据的特征维度output_size 为输出数据的特征维度一些分类数据的 embedding 也是在构建模型时进行例如classIrisNet(nn.Module):def__init__(self,input_size4,hidden_size10,output_size3):super().__init__()# 调用父类 的构造函数self.netnn.Sequential(nn.Linear(input_size,hidden_size),nn.Sigmoid(),nn.Linear(hidden_size,output_size))defforward(self,x):returnself.net(x)或classLSTMModel(nn.Module):def__init__(self,input_size1,hidden_size10,num_layers1,output_size1):super().__init__()self.lstmnn.LSTM(input_size,hidden_size,num_layers,batch_firstTrue)self.linearnn.Linear(hidden_size,output_size)# 线性输出defforward(self,x):out,_self.lstm(x)# out 的维度 (batch_size, seq_length, hidden_size)outout[:,-1,:]outself.linear(out)returnout创建好神经网络类后再新建一个实例例如modelIrisNet()modelLSTMModel()7. 确定损失函数和优化器在训练神经网络时损失函数Loss Function用于衡量模型预测值与真实值的差距而优化器Optimizer负责根据梯度更新模型参数从而最小化损失。7.1 常用损失函数(1) 回归任务nn.MSELoss均方误差Mean Squared Errornn.L1Loss平均绝对误差Mean Absolute Error(2) 分类任务nn.CrossEntropyLoss多分类任务类别编码为整数nn.BCEWithLogitsLoss二分类任务类别编码为浮点数BCE 是 binary cross entropy 的缩写即二元交叉熵它的公式为l o s s − [ y log ( p ) ( 1 − y ) log ( 1 − p ) ] loss-[y\log(p)(1-y)\log(1-p)]loss−[ylog(p)(1−y)log(1−p)]7.2 优化器Optimizer常用优化器torch.optim.SGD随机梯度下降optimizertorch.optim.SGD(model.parameters(),lr0.01)torch.optim.Adam自适应矩估计收敛更快optimizertorch.optim.Adam(model.parameters(),lr0.001)8. 训练对于一定数量的 epoches, 循环训练。例如# non batch trainingforepochinrange(epochs):model.train()# 显式设置训练模式optimizer.zero_grad()# 每次循环时梯度清零因为默认梯度在循环时是累加的y_predmodel(X_train)# 把输入数据传入到模型losscriterion(y_pred,y)# 计算误差loss.backward()# 执行反向传播计算梯度optimizer.step()# 根据梯度更新权重或9. 预测评估到预测评估阶段代码一般如下model.eval()# 切换到评估模式withtorch.no_grad():# 关闭梯度计算predmodel(X_test)# 得到模型输出带梯度predpred.detach()# 返回一个共享相同数据但不需要梯度的新张量predpred.numpy()# 转化为 numpy统计预测准确率或误差率也在这一步一个实例下面的代码使用原始的神经网络对 iris 数据集进行预测分类 Python version: 3.12 Author: Zhen Chen Email: chen.zhen5526gmail.com Time: 29/11/2025, 19:40 Desc: vanilla neuro network: batch and adam can increase the accuracy rate. 使用 CrossEntropyLoss() 最为多分类损失函数就不用将输入数据转化为 one hot了 importtorchimporttorch.nnasnnfromsklearnimportdatasetsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromtorch.utils.dataimportDataset,DataLoader# 1. 加载数据irisdatasets.load_iris()Xiris.data# (150, 4)yiris.target# (150,)# 2. 数据标准化scalerStandardScaler()Xscaler.fit_transform(X)# 3. 转成 tensorXtorch.tensor(X,dtypetorch.float32)# [150, 4]ytorch.tensor(y,dtypetorch.long)# CrossEntropyLoss 要 long# 4. 划分训练与测试集8:2X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 5. 创建 DatasetclassIrisDataset(Dataset):def__init__(self,X,y):self.XX self.yydef__len__(self):returnlen(self.X)def__getitem__(self,idx):returnself.X[idx],self.y[idx]train_datasetIrisDataset(X_train,y_train)test_datasetIrisDataset(X_test,y_test)# 采用 batch 能减少噪声train_loaderDataLoader(train_dataset,batch_size1,shuffleTrue)test_loaderDataLoader(test_dataset,batch_size1,shuffleTrue)# 6. 构建分类模型简单 MLPclassIrisNet(nn.Module):def__init__(self,input_size4,hidden_size10,output_size3):super().__init__()self.netnn.Sequential(nn.Linear(input_size,hidden_size),nn.Sigmoid(),nn.Linear(hidden_size,output_size),)# def __init__(self):# super().__init__()# self.net nn.Sequential(# nn.Linear(4, 10),# nn.Sigmoid(),# nn.Linear(10, 3), # 3 类输出# )defforward(self,x):returnself.net(x)modelIrisNet()# 7. 损失函数 优化器criterionnn.CrossEntropyLoss()# 多分类损失optimizertorch.optim.SGD(model.parameters(),lr0.1)# 8. 训练epochs50forepochinrange(epochs):model.train()total_loss0forXb,ybintrain_loader:optimizer.zero_grad()outputmodel(Xb)losscriterion(output,yb)loss.backward()optimizer.step()total_lossloss.item()ifepoch%100:print(fEpoch{epoch1}, Loss {total_loss:.4f})# 9. 测试集准确率model.eval()# 切换到评估模式correct0total0withtorch.no_grad():# 关闭梯度计算forXb,ybintest_loader:outputmodel(Xb)predtorch.argmax(output,dim1)correct(predyb).sum().item()totalyb.size(0)print(f\n测试集准确率{correct/total*100:.2f}%)