【lightgbm/xgboost/nn代碼整理四】pytorch做二分類,多分類以及回歸任務(wù)
1.簡(jiǎn)介
本不打算整理pytorch代碼吭狡,因?yàn)樵跀?shù)據(jù)挖掘類比賽中沒有用過它尖殃,做圖像相關(guān)任務(wù)時(shí)用pytorch比較多。有個(gè)小哥提到讓整理一下划煮,就花了幾天時(shí)間整理了一份送丰,沒有很仔細(xì)調(diào)試過,有問題請(qǐng)讀者指出弛秋。下面將從數(shù)據(jù)處理器躏、網(wǎng)絡(luò)搭建和模型訓(xùn)練三個(gè)部分介紹。如果只是想要閱讀代碼蟹略,可直接移步到尾部鏈接登失。
2. 數(shù)據(jù)處理
參考上一節(jié)的數(shù)據(jù)處理
3.模型
pytorch 定義的mlp代碼如下:
class MLP(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output, dropout=0.5):
super(MLP, self).__init__()
self.dropout = torch.nn.Dropout(dropout)
self.hidden_1 = torch.nn.Linear(n_feature, n_hidden) # hidden layer
self.bn1 = torch.nn.BatchNorm1d(n_hidden)
self.hidden_2 = torch.nn.Linear(n_hidden, n_hidden//2)
self.bn2 = torch.nn.BatchNorm1d(n_hidden//2)
self.hidden_3 = torch.nn.Linear(n_hidden//2, n_hidden//4) # hidden layer
self.bn3 = torch.nn.BatchNorm1d(n_hidden//4)
self.hidden_4 = torch.nn.Linear(n_hidden // 4, n_hidden // 8) # hidden layer
self.bn4 = torch.nn.BatchNorm1d(n_hidden // 8)
self.out = torch.nn.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
定義的網(wǎng)路結(jié)構(gòu)和上一節(jié)keras中定義的一樣,同樣也添加了dropout層和bn層科乎。不同之處這個(gè)網(wǎng)絡(luò)最終的輸出都是線性輸出壁畸。
訓(xùn)練和預(yù)測(cè)
4.1 數(shù)據(jù)加載
pytorch是以tensor的形式加載數(shù)據(jù)贼急,需要將數(shù)據(jù)轉(zhuǎn)為tenser格式茅茂,如果有g(shù)pu處理器,并且安裝的也是gpu版本的pytorch,就可以使用gpu加速處理太抓,通過DataLoader來加載數(shù)據(jù)空闲,代碼如下。
x_test = np.array(test_X)
x_test = torch.tensor(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 訓(xùn)練
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 = torch.nn.CrossEntropyLoss() #多分類
#loss_fn = torch.nn.BCEWithLogitsLoss() #二分類
#loss_fn = torch.nn.L1Loss() #回歸
y_pred = model(x_batch)
loss = loss_fn(y_pred, y_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
定義完網(wǎng)絡(luò)后走敌,如果存在GPU碴倾,則需要將model也添加上gpu。優(yōu)化函數(shù)同keras一樣掉丽,都含有adam,sgd等跌榔。損失函數(shù)針對(duì)不同問題有所不同,在代碼中已有標(biāo)注捶障,上面列出的分類任務(wù)都采用的是交叉熵?fù)p失函數(shù)僧须,集成了最后一層的激活函數(shù),如多分類的CrossEntropyLoss项炼,它已經(jīng)集成了softmax函數(shù)担平,且不需要對(duì)類別類別做onehot處理,直接輸入int值即可锭部。
- optimizer.zero_grad():是為下一次訓(xùn)練清除梯度值
- loss.backward()是反向傳播暂论,計(jì)算每個(gè)參數(shù)的梯度值
- optimizer.step():是更新參數(shù)權(quán)重值包括,weights和biases
4.3 預(yù)測(cè)
在預(yù)測(cè)中eval()函數(shù)會(huì)自動(dòng)把BN和DropOut固定住拌禾,不會(huì)取平均取胎,而是用訓(xùn)練好的值。不然的話湃窍,一旦test的batch_size過小闻蛀,很容易就會(huì)被BN層導(dǎo)致生成圖片顏色失真極大摄杂。代碼如下
model.eval()
y_pred = model(x_batch)
test_preds_fold[i * batch_size:(i + 1) * batch_size] = y_pred.cpu().numpy()
由于計(jì)算的結(jié)果是tensor,需要轉(zhuǎn)為numpy循榆。
最終的結(jié)果轉(zhuǎn)化同keras一樣析恢,如二分類需要設(shè)定閾值。
代碼地址:data_mining_models
寫在最后
關(guān)注公號(hào):
ML與DL的成長(zhǎng)圣地秧饮。
知乎專欄:ML與DL成長(zhǎng)之路