国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

手把手教你用pytorch實現(xiàn)k折交叉驗證,解決類別不平衡

這篇具有很好參考價值的文章主要介紹了手把手教你用pytorch實現(xiàn)k折交叉驗證,解決類別不平衡。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在用深度學習做分類的時候,常常需要進行交叉驗證,目前pytorch沒有通用的一套代碼來實現(xiàn)這個功能??梢越柚?sklearn中的 StratifiedKFold,KFold來實現(xiàn),其中StratifiedKFold可以根據(jù)類別的樣本量,進行數(shù)據(jù)劃分。以5折為例,它可以實現(xiàn)每個類別的樣本都是4:1劃分。

代碼簡單的示例如下:

from sklearn.model_selection import  StratifiedKFold
skf = StratifiedKFold(n_splits=5)
for i, (train_idx, val_idx) in enumerate(skf.split(imgs, labels)):
    trainset, valset = np.array(imgs)[[train_idx]],np.array(imgs)[[val_idx]]
    traintag, valtag = np.array(labels)[[train_idx]],np.array(labels)[[val_idx]]

以上示例是將所有imgs列表與對應的labels列表進行split,得到train_idx代表訓練集的下標,val_idx代表驗證集的下標。后續(xù)代碼只需要將split完成的trainset與valset輸入dataset即可。

接下來用我自己數(shù)據(jù)集的實例來完整地實現(xiàn)整個過程,即從讀取數(shù)據(jù),到開始訓練。如果你的數(shù)據(jù)集存儲方式和我不同,改一下數(shù)據(jù)讀取代碼即可。關鍵是如何獲取到imgs和對應的labels。

我的數(shù)據(jù)存儲方式是這樣的(類別為文件夾名,屬于該類別的圖像在該文件夾下):

"""A generic data loader where the images are arranged in this way: ::

    root/dog/xxx.png
    root/dog/xxy.png
    root/dog/xxz.png

    root/cat/123.png
    root/cat/nsdf3.png
    root/cat/asd932_.png

?以下代碼是獲取imgs與labels的過程:

import os
import numpy as np

IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png')

def is_image_file(filename):
    return filename.lower().endswith(IMG_EXTENSIONS)

def find_classes(dir):
    classes = [d.name for d in os.scandir(dir) if d.is_dir()]
    classes.sort()
    class_to_idx = {cls_name: i for i, cls_name in enumerate(classes)}
    return classes, class_to_idx

if __name__ == "__main__":
    dir = 'your root path'
    classes, class_to_idx = find_classes(dir)
    imgs = []
    labels = []
    for target_class in sorted(class_to_idx.keys()):
        class_index = class_to_idx[target_class]
        target_dir = os.path.join(dir, target_class)
        if not os.path.isdir(target_dir):
            continue
        for root, _, fnames in sorted(os.walk(target_dir, followlinks=True)):
            for fname in sorted(fnames):
                path = os.path.join(root, fname)
                if is_image_file(path):
                    imgs.append(path)
                    labels.append(class_index)

上述代碼只需要把dir改為自己的root路徑即可。接下來對所有數(shù)據(jù)進行5折split。其中我自己寫了MyDataset類,可以直接照搬用。

from sklearn.model_selection import  StratifiedKFold
    skf = StratifiedKFold(n_splits=5) #5折
    for i, (train_idx, val_idx) in enumerate(skf.split(imgs, labels)):
        trainset, valset = np.array(imgs)[[train_idx]],np.array(imgs)[[val_idx]]
        traintag, valtag = np.array(labels)[[train_idx]],np.array(labels)[[val_idx]]
        train_dataset = MyDataset(trainset, traintag, data_transforms['train'] )
        val_dataset = MyDataset(valset, valtag, data_transforms['val'])
from PIL import Image
import torch
from torch.utils.data import Dataset, DataLoader


class MyDataset(Dataset):

    def __init__(self, imgs, labels, transform=None,target_transform=None):

        self.imgs = imgs
        self.labels = labels
        self.transform = transform
        self.target_transform = target_transform

    def __len__(self):
        return len(self.imgs)

    def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        path = self.imgs[idx]
        target = self.labels[idx]

        with open(path, 'rb') as f:
            img = Image.open(f)
            img = img.convert('RGB')

        if self.transform:
            img = self.transform(img)

        if self.target_transform is not None:
            target = self.target_transform(target)

        return img, target

有了數(shù)據(jù)集之后,就可以創(chuàng)建dataloader了,后面就是正常的訓練代碼:

from sklearn.model_selection import  StratifiedKFold
    skf = StratifiedKFold(n_splits=5) #5折
    for i, (train_idx, val_idx) in enumerate(skf.split(imgs, labels)):
        trainset, valset = np.array(imgs)[[train_idx]],np.array(imgs)[[val_idx]]
        traintag, valtag = np.array(labels)[[train_idx]],np.array(labels)[[val_idx]]
        train_dataset = MyDataset(trainset, traintag, data_transforms['train'] )
        val_dataset = MyDataset(valset, valtag, data_transforms['val'])
        train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=args.batch_size,
                                                  shuffle=True, num_workers=args.workers)
        test_dataloader = torch.utils.data.DataLoader(val_dataset, batch_size=args.batch_size,
                                                  shuffle=True, num_workers=args.workers)

        # define model
        model = resnet18().cuda()
        # define criterion
        criterion = torch.nn.CrossEntropyLoss()
        # Observe that all parameters are being optimized.
        optimizer = optim.SGD(model.parameters(),
                              lr=args.lr,
                              momentum=args.momentum,
                              weight_decay=args.weight_decay)
        for epoch in range(args.epoch):
            train_acc, train_loss = train(train_dataloader, model, criterion, args)
            test_acc, tect_acc_top5, test_loss = validate(test_dataloader, model, criterion, args)

為了保證每次跑的時候分的數(shù)據(jù)都是一致的,注意shuffle=False(默認)

StratifiedKFold(n_splits=5,shuffle=False)

以上就是實現(xiàn)的基本代碼,之所以在代碼層面實現(xiàn)k折而不是在數(shù)據(jù)層面做,比如預先把數(shù)據(jù)等分為5份。是因為這個代碼可以支持數(shù)據(jù)樣本的隨意增減,不需要人為地再去分數(shù)據(jù),十分方便。?文章來源地址http://www.zghlxwxcb.cn/news/detail-447854.html

到了這里,關于手把手教你用pytorch實現(xiàn)k折交叉驗證,解決類別不平衡的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 手把手教你用AirtestIDE無線連接手機

    手把手教你用AirtestIDE無線連接手機

    一直以來,我們發(fā)現(xiàn)同學們都挺喜歡用無線的方式連接手機,正好安卓11出了個無線連接的新姿勢,我們今天就一起來看看,如何用AirtestIDE無線連接你的Android設備~ 當 手機與電腦處在同一個wifi 下,即可嘗試無線連接手機了,但是這種方式受限于網(wǎng)絡連接的穩(wěn)定性,可能會出

    2023年04月18日
    瀏覽(27)
  • 手把手教你用Python編寫郵箱腳本引擎

    手把手教你用Python編寫郵箱腳本引擎

    版權聲明:原創(chuàng)不易,本文禁止抄襲、轉載需附上鏈接,侵權必究! 郵箱是傳輸信息方式之一,個人,企業(yè)等都在使用,朋友之間發(fā)消息,注冊/登錄信息驗證,訂閱郵箱,企業(yè)招聘,向客戶發(fā)送消息等都是郵箱的使用場景;郵箱有兩個較重要的協(xié)議:SMTP和POP3,均位于OSI7層

    2024年02月06日
    瀏覽(104)
  • 手把手教你用 Jenkins 自動部署 SpringBoot

    手把手教你用 Jenkins 自動部署 SpringBoot

    CI/CD 是一種通過在應用開發(fā)階段引入自動化來頻繁向客戶交付應用的方法。 CI/CD 的核心概念可以總結為三點: 持續(xù)集成 持續(xù)交付 持續(xù)部署 CI/CD 主要針對在集成新代碼時所引發(fā)的問題(俗稱\\\"集成地獄\\\")。 為什么會有集成地獄這個“雅稱”呢?大家想想我們一個項目部署的

    2024年02月02日
    瀏覽(30)
  • 手把手教你用jmeter做壓力測試(詳圖)

    手把手教你用jmeter做壓力測試(詳圖)

    壓力測試是每一個Web應用程序上線之前都需要做的一個測試,他可以幫助我們發(fā)現(xiàn)系統(tǒng)中的瓶頸問題,減少發(fā)布到生產環(huán)境后出問題的幾率;預估系統(tǒng)的承載能力,使我們能根據(jù)其做出一些應對措施。所以壓力測試是一個非常重要的步驟,下面我?guī)Т蠹襾硎褂靡豢顗毫y試工

    2024年02月02日
    瀏覽(29)
  • 手把手教你用MindSpore訓練一個AI模型!

    手把手教你用MindSpore訓練一個AI模型!

    首先我們要先了解深度學習的概念和AI計算框架的角色( https://zhuanlan.zhihu.com/p/463019160 ),本篇文章將演示怎么利用MindSpore來訓練一個AI模型。和上一章的場景一致,我們要訓練的模型是用來對手寫數(shù)字圖片進行分類的LeNet5模型 請參考( http://yann.lecun.com/exdb/lenet/ )。 圖1 M

    2024年02月04日
    瀏覽(34)
  • 手把手教你用git上傳項目到GitHub

    手把手教你用git上傳項目到GitHub

    github的官方網(wǎng)址:https://github.com?,如果沒有賬號,趕緊注冊一個。 點擊Sign in進入登錄界面,輸入賬號和密碼登入github。 創(chuàng)建成功可以看到自己的倉庫地址,如此,我的遠程免費的倉庫就創(chuàng)建了。它還介紹了github倉庫的常用指令。這個指令需要在本地安裝git客戶端。 Git是目

    2024年01月18日
    瀏覽(29)
  • 手把手教你用Git——詳解git merge

    關于本教程的編寫環(huán)境 本文基于 Windows10系統(tǒng) , Mac 系統(tǒng)的小伙伴可以嘗試 Homebrew 。由于本人手里并沒有搭載 MacOS 的電腦,因此 Homebrew 相關的使用請自行嘗試。 對于使用 Windows11系統(tǒng) 的小伙伴,本文的教程是通用的,不過一些細節(jié)可能略有不同,這點希望小伙伴們注意一下

    2024年02月05日
    瀏覽(27)
  • 手把手教你用UNet做醫(yī)學圖像分割系統(tǒng)

    手把手教你用UNet做醫(yī)學圖像分割系統(tǒng)

    兄弟們好呀,這里是肆十二,這轉眼間寒假就要過完了,相信大家的畢設也要準備動手了吧,作為一名大作業(yè)區(qū)的UP主,也該蹭波熱度了,之前關于圖像分類和目標檢測我們都出了相應的教程,所以這期內容我們搞波新的,我們用Unet來做醫(yī)學圖像分割。我們將會以皮膚病的數(shù)

    2024年02月03日
    瀏覽(93)
  • 手把手教你用 Docker 部署 Vue3 項目

    手把手教你用 Docker 部署 Vue3 項目

    用 docker 可以幫我們快速部署前端項目,本文介紹了如何用 docker 快速部署 vue3 項目。請準備好一臺云服務器并安裝好 docker,然后開始閱讀本教程。 執(zhí)行 npm run build 打包后項目目錄中會多出一個 dist 文件夾 利用 docker 拉取 nginx 鏡像 在服務器中創(chuàng)建工作目錄,這里我放在 /ho

    2024年02月05日
    瀏覽(35)
  • 爬蟲實戰(zhàn)|手把手教你用Python爬蟲(附詳細源碼)

    爬蟲實戰(zhàn)|手把手教你用Python爬蟲(附詳細源碼)

    實踐來源于理論,做爬蟲前肯定要先了解相關的規(guī)則和原理,要知道互聯(lián)網(wǎng)可不是法外之地,你一頓爬蟲騷操作搞不好哪天就… ?首先,咱先看下爬蟲的定義:網(wǎng)絡爬蟲(又稱為網(wǎng)頁蜘蛛,網(wǎng)絡機器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自

    2024年02月02日
    瀏覽(102)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包