pytorch做⼆分类,多分类以及回归任务
【lightgbm/xgboost/nn代码整理四】pytorch做⼆分类,多分类以及回归任务
1.简介
本不打算整理pytorch代码,因为在数据挖掘类⽐赛中没有⽤过它,做图像相关任务时⽤pytorch⽐较多。有个⼩哥提到让整理⼀下,就花了⼏天时间整理了⼀份,没有很仔细调试过,有问题请读者指出。下⾯将从数据处理、⽹络搭建和模型训练三个部分介绍。如果只是想要阅读代码,可直接移步到尾部链接。
2. 数据处理
参考上⼀节的数据处理
3.模型
pytorch 定义的mlp代码如下:
class Module):
def__init__(self, n_feature, n_hidden, n_output, dropout=0.5):
super(MLP, self).__init__()
self.dropout = Dropout(dropout)
self.hidden_1 = Linear(n_feature, n_hidden)# hidden layer
self.bn1 = BatchNorm1d(n_hidden)
self.hidden_2 = Linear(n_hidden, n_hidden//2)
self.bn2 = BatchNorm1d(n_hidden//2)
self.hidden_3 = Linear(n_hidden//2, n_hidden//4)# hidden layer
eval是做什么的self.bn3 = BatchNorm1d(n_hidden//4)
self.hidden_4 = Linear(n_hidden //4, n_hidden //8)# hidden layer
self.bn4 = BatchNorm1d(n_hidden //8)
self.out = Linear(n_hidden//8, n_output)# output layer
def forward(self, x):
x = F.relu(self.hidden_1(x))# activation function for hidden layer
x = self.dropout(self.bn1(x))
x = F.relu(self.hidden_2(x))# activation function for hidden layer
x = self.dropout(self.bn2(x))
x = F.relu(self.hidden_3(x))# activation function for hidden layer
x = self.dropout(self.bn3(x))
x = F.relu(self.hidden_4(x))# activation function for hidden layer
x = self.dropout(self.bn4(x))
x = self.out(x)
return x
定义的⽹路结构和上⼀节keras中定义的⼀样,同样也添加了dropout层和bn层。不同之处这个⽹络最终的输出都是线性输出。
训练和预测
4.1 数据加载
pytorch是以tensor的形式加载数据,需要将数据转为tenser格式,如果有gpu处理器,并且安装的也是gpu版本的pytorch,就可以使⽤gpu加速处理,通过DataLoader来加载数据,代码如下。
x_test = np.array(test_X)
x_test = sor(x_test, dtype=torch.float)
if torch.cuda.is_available():
x_test = x_test.cuda()
test = TensorDataset(x_test)
test_loader = DataLoader(test, batch_size=batch_size, shuffle=False)
4.2 训练
model = MLP(x_train.shape[1],512, classes, dropout=0.3)
if torch.cuda.is_available():
model = model.cuda()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=1e-5)
loss_fn = CrossEntropyLoss()#多分类
#loss_fn = BCEWithLogitsLoss() #⼆分类
#loss_fn = L1Loss() #回归
y_pred = model(x_batch)
loss = loss_fn(y_pred, y_batch)
<_grad()
loss.backward()
optimizer.step()
定义完⽹络后,如果存在GPU,则需要将model也添加上gpu。优化函数同keras⼀样,都含有adam,sgd等。损失函数针对不同问题有所不同,在代码中已有标注,上⾯列出的分类任务都采⽤的是交叉熵损失函数,集成了最后⼀层的激活函数,如多分类的CrossEntropyLoss,它已经集成了softmax函数,且不需要对类别类别做onehot处理,直接输⼊int值即可。
<_grad():是为下⼀次训练清除梯度值
loss.backward()是反向传播,计算每个参数的梯度值
optimizer.step():是更新参数权重值包括,weights和biases
4.3 预测
在预测中eval()函数会⾃动把BN和DropOut固定住,不会取平均,⽽是⽤训练好的值。不然的话,⼀旦test的batch_size过⼩,很容易就会被BN层导致⽣成图⽚颜⾊失真极⼤。代码如下
model.eval()
y_pred = model(x_batch)
test_preds_fold[i * batch_size:(i +1)* batch_size]= y_pred.cpu().numpy()
由于计算的结果是tensor,需要转为numpy。
最终的结果转化同keras⼀样,如⼆分类需要设定阈值。
代码地址:
写在后⾯
欢迎您关注作者知乎:
推荐关注:AI成长社,ML与DL的成长圣地。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论