日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch - K折交叉验证过程说明及实现

發布時間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch - K折交叉验证过程说明及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼主要核心思想來自:https://www.cnblogs.com/JadenFK3326/p/12164519.html

K折交叉交叉驗證的過程如下:

以200條數據,十折交叉驗證為例子,十折也就是將數據分成10組,進行10組訓練,每組用于測試的數據為:數據總條數/組數,即每組20條用于valid,180條用于train,每次valid的都是不同的。

(1)將200條數據,分成按照 數據總條數/組數(折數),進行切分。然后取出第i份作為第i次的valid,剩下的作為train

(2)將每組中的train數據利用DataLoader和Dataset,進行封裝。

(3)將train數據用于訓練,epoch可以自己定義,然后利用valid做驗證。得到一次的train_loss和?valid_loss。

(4)重復(2)(3)步驟,得到最終的 averge_train_loss和averge_valid_loss

上述過程如下圖所示:

上述的代碼如下:

import torch import torch.nn as nn from torch.utils.data import DataLoader,Dataset import torch.nn.functional as F from torch.autograd import Variable#####構造的訓練集#### x = torch.rand(100,28,28) y = torch.randn(100,28,28) x = torch.cat((x,y),dim=0) label =[1] *100 + [0]*100 label = torch.tensor(label,dtype=torch.long)######網絡結構########## class Net(nn.Module):#定義Netdef __init__(self):super(Net, self).__init__() self.fc1 = nn.Linear(28*28, 120) self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 2)def forward(self, x):x = x.view(-1, self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return xdef num_flat_features(self, x):size = x.size()[1:] num_features = 1for s in size:num_features *= sreturn num_features##########定義dataset########## class TraindataSet(Dataset):def __init__(self,train_features,train_labels):self.x_data = train_featuresself.y_data = train_labelsself.len = len(train_labels)def __getitem__(self,index):return self.x_data[index],self.y_data[index]def __len__(self):return self.len########k折劃分############ def get_k_fold_data(k, i, X, y): ###此過程主要是步驟(1)# 返回第i折交叉驗證時所需要的訓練和驗證數據,分開放,X_train為訓練數據,X_valid為驗證數據assert k > 1fold_size = X.shape[0] // k # 每份的個數:數據總條數/折數(組數)X_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size) #slice(start,end,step)切片函數##idx 為每組 validX_part, y_part = X[idx, :], y[idx]if j == i: ###第i折作validX_valid, y_valid = X_part, y_partelif X_train is None:X_train, y_train = X_part, y_partelse:X_train = torch.cat((X_train, X_part), dim=0) #dim=0增加行數,豎著連接y_train = torch.cat((y_train, y_part), dim=0)#print(X_train.size(),X_valid.size())return X_train, y_train, X_valid,y_validdef k_fold(k, X_train, y_train, num_epochs=3,learning_rate=0.001, weight_decay=0.1, batch_size=5):train_loss_sum, valid_loss_sum = 0, 0train_acc_sum ,valid_acc_sum = 0,0for i in range(k):data = get_k_fold_data(k, i, X_train, y_train) # 獲取k折交叉驗證的訓練和驗證數據net = Net() ### 實例化模型### 每份數據進行訓練,體現步驟三####train_ls, valid_ls = train(net, *data, num_epochs, learning_rate,\weight_decay, batch_size) print('*'*25,'第',i+1,'折','*'*25)print('train_loss:%.6f'%train_ls[-1][0],'train_acc:%.4f\n'%valid_ls[-1][1],\'valid loss:%.6f'%valid_ls[-1][0],'valid_acc:%.4f'%valid_ls[-1][1])train_loss_sum += train_ls[-1][0]valid_loss_sum += valid_ls[-1][0]train_acc_sum += train_ls[-1][1]valid_acc_sum += valid_ls[-1][1]print('#'*10,'最終k折交叉驗證結果','#'*10) ####體現步驟四#####print('train_loss_sum:%.4f'%(train_loss_sum/k),'train_acc_sum:%.4f\n'%(train_acc_sum/k),\'valid_loss_sum:%.4f'%(valid_loss_sum/k),'valid_acc_sum:%.4f'%(valid_acc_sum/k))#########訓練函數########## def train(net, train_features, train_labels, test_features, test_labels, num_epochs, learning_rate,weight_decay, batch_size):train_ls, test_ls = [], [] ##存儲train_loss,test_lossdataset = TraindataSet(train_features, train_labels) train_iter = DataLoader(dataset, batch_size, shuffle=True) ### 將數據封裝成 Dataloder 對應步驟(2)#這里使用了Adam優化算法optimizer = torch.optim.Adam(params=net.parameters(), lr= learning_rate, weight_decay=weight_decay)for epoch in range(num_epochs):for X, y in train_iter: ###分批訓練 output = net(X)loss = loss_func(output,y)optimizer.zero_grad()loss.backward()optimizer.step()### 得到每個epoch的 loss 和 accuracy train_ls.append(log_rmse(0,net, train_features, train_labels)) if test_labels is not None:test_ls.append(log_rmse(1,net, test_features, test_labels))#print(train_ls,test_ls)return train_ls, test_lsdef log_rmse(flag,net,x,y):if flag == 1: ### valid 數據集net.eval()output = net(x)result = torch.max(output,1)[1].view(y.size())corrects = (result.data == y.data).sum().item()accuracy = corrects*100.0/len(y) #### 5 是 batch_sizeloss = loss_func(output,y)net.train()return (loss.data.item(),accuracy)loss_func = nn.CrossEntropyLoss() ###申明loss函 k_fold(10,x,label) ### k=10,十折交叉驗證

上述代碼中,直接按照順序從x中每次截取20條作為valid,也可以先打亂然后在截取,這樣效果應該會更好。如下所示:

import random import torchx = torch.rand(100,28,28) y = torch.randn(100,28,28) x = torch.cat((x,y),dim=0) label =[1] *100 + [0]*100 label = torch.tensor(label,dtype=torch.long)index = [i for i in range(len(x))] random.shuffle(index) x = x[index] label = label[index]

?

總結

以上是生活随笔為你收集整理的pytorch - K折交叉验证过程说明及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。