<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ViT 微調(diào)實戰(zhàn)

          共 9694字,需瀏覽 20分鐘

           ·

          2024-08-01 10:05

          點擊上方小白學(xué)視覺”,選擇加"星標"或“置頂

               
          重磅干貨,第一時間送達

          探索 CIFAR-10 圖像分類

          介紹

          你一定聽說過“Attention is all your need”?Transformers 最初從文本開始,現(xiàn)在已無處不在,甚至在圖像中使用了一種稱為視覺變換器 (ViT) 的東西,這種變換器最早是在論文《一張圖片勝過 16x16 個單詞:用于大規(guī)模圖像識別的 Transformers》中引入的。這不僅僅是另一個浮華的趨勢;事實證明,它們是強有力的競爭者,可以與卷積神經(jīng)網(wǎng)絡(luò) (CNN) 等傳統(tǒng)模型相媲美。

          ViT 簡要概述:
          • 將圖像分成多個塊,將這些塊傳遞到全連接(FC)網(wǎng)絡(luò)或 FC+CNN 以獲取輸入嵌入向量。
          • 添加位置信息。
          • 將其傳遞到傳統(tǒng)的 Transformer 編碼器中,并在末端附加一個 FC 層。

           ViT 架構(gòu)

          這個故事并不是關(guān)于理解 ViT 的細節(jié),而更像是關(guān)于如何使用 Hugging Face 和 PyTorch 微調(diào)預(yù)訓(xùn)練的 ViT 圖像分類模型并將其用于您自己的任務(wù)的指南。

          問題描述

          我們的目標是利用預(yù)訓(xùn)練的 Vision Transformer 模型對 CIFAR-10 數(shù)據(jù)集*進行圖像分類。然而,挑戰(zhàn)在于用于訓(xùn)練模型的數(shù)據(jù)集和目標數(shù)據(jù)集的大小和輸出類別數(shù)量不匹配。為了解決這個問題,我們采用了Fine Tuning

          我們將使用的模型是google/vit-base-patch16–224 (任何數(shù)據(jù)集/模型都可以通過適當(dāng)調(diào)整來使用)。該模型已在 ImageNet-21k(1400 萬張圖像,21,843 個類別)上進行了訓(xùn)練,并在 ImageNet-1k(100 萬張圖像,1,000 個類別)上進行了微調(diào)。它使用 16x16 的補丁大小并處理大小為 3x224x224 的圖像。

          我們的目標是在CIFAR-10數(shù)據(jù)集上進一步微調(diào)它,該數(shù)據(jù)集只有 10 個輸出類和大小為 3x32x32 的圖像。本教程可作為對 Hugging Face 庫中現(xiàn)有的任何 ViT 進行微調(diào)以用于各種任務(wù)的起點。


          設(shè)置環(huán)境

          您可以使用 Jupyter 或Google Colab。安裝并導(dǎo)入必要的庫和框架。
          !pip install torch torchvision!pip install transformers datasets!pip install transformers[torch]
          # PyTorchimport torchimport torchvisionfrom torchvision.transforms import Normalize, Resize, ToTensor, Compose # 用于顯示圖像from PIL import Imageimport matplotlib.pyplot as pltfrom torchvision.transforms import ToPILImage # 加載數(shù)據(jù)集from datasets import load_dataset # Transformers從transformers import ViTImageProcessor, ViTForImageClassification從transformers import TrainingArguments, Trainer # 矩陣運算import  numpy as np # 評估from sklearn.metrics import accuracy_scorefrom sklearn.metrics import confused_matrix, ConfusionMatrixDisplay


          數(shù)據(jù)預(yù)處理

          僅使用一小部分數(shù)據(jù)集進行演示。將數(shù)據(jù)分為訓(xùn)練、驗證和測試數(shù)據(jù)集:
          trainds, testds = load_dataset("cifar10", split=["train[:5000]","test[:1000]"])splits = trainds.train_test_split(test_size=0.1)trainds = splits['train']valds = splits['test']trainds, valds, testds
          # Output(Dataset({     features: ['img', 'label'],     num_rows: 4500 }), Dataset({     features: ['img', 'label'],     num_rows: 500 }), Dataset({     features: ['img', 'label'],     num_rows: 1000 }))
          如果您不熟悉數(shù)據(jù)集包,可以按照以下方法訪問項目:
          trainds.featurestrainds.num_rowstrainds[ 0 ]
          # Output({'img': Image(decode=True, id=None),  'label': ClassLabel(names=['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'], id=None)}, 4500, {'img': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=32x32>,  'label': 0})
          現(xiàn)在讓我們將整數(shù)標簽映射到字符串標簽,反之亦然。
          itos = dict((k,v) for k,v in enumerate(trainds.features['label'].names))stoi = dict((v,k) for k,v in enumerate(trainds.features['label'].names))itos
          # Output{0: 'airplane',  1: 'automobile',  2: 'bird',  3: 'cat',  4: 'deer',  5: 'dog',  6: 'frog',  7: 'horse',  8: 'ship',  9: 'truck'}
          現(xiàn)在,讓我們顯示數(shù)據(jù)集中的圖像和相應(yīng)的標簽。
          index = 0img, lab = trainds[index]['img'], itos[trainds[index]['label']]print(lab)img

          飛機:3x32x32 圖像
          現(xiàn)在,讓我們使用 Hugging Face 和 PyTorch 進行一些圖像處理。我們使用ViTImageProcessor來處理圖像到補丁的轉(zhuǎn)換(圖像標記器)和規(guī)范化。
          model_name = "google/vit-base-patch16-224"processor = ViTImageProcessor.from_pretrained(model_name) 
          mu, sigma = processor.image_mean, processor.image_std #get default mu,sigmasize = processor.size
          我們使用 TorchVision Transformers 管道。可以使用其他轉(zhuǎn)換來滿足您的數(shù)據(jù)需求。
          norm = Normalize(mean=mu, std=sigma) #normalize image pixels range to [-1,1]
          # resize 3x32x32 to 3x224x224 -> convert to Pytorch tensor -> normalize_transf = Compose([ Resize(size['height']), ToTensor(), norm])
          # apply transforms to PIL Image and store it to 'pixels' keydef transf(arg): arg['pixels'] = [_transf(image.convert('RGB')) for image in arg['img']] return arg
          將轉(zhuǎn)換應(yīng)用于每個數(shù)據(jù)集。
          trainds.set_transform(transf)valds.set_transform(transf)testds.set_transform(transf)
          要查看轉(zhuǎn)換后的圖像,請運行以下代碼片段:
          idx = 0ex = trainds[idx]['pixels']ex = (ex+1)/2 #imshow requires image pixels to be in the range [0,1]exi = ToPILImage()(ex)plt.imshow(exi)plt.show()

          轉(zhuǎn)換后的飛機:3x224x224


          微調(diào)模型

          我們使用 Hugging Face 的ViTForImageClassification,它將圖像作為輸入并輸出類別的預(yù)測。我們首先看看原始模型的分類器是什么樣子的。
          model_name = "google/vit-base-patch16-224"model = ViTForImageClassification.from_pretrained(model_name)print(model.classifier)
          # OutputLinear(in_features=768, out_features=1000, bias=True)
          它輸出 1000 個類的概率,因為它最初是在 ImageNet-1k 上進行微調(diào)的。

          我們可以使用以下參數(shù)對其進行微調(diào)以輸出 10 個類:num_labels 基本上改變了最終線性層中的節(jié)點數(shù),ignore_mismatched_sizes 因為它最初有 1000 個輸出節(jié)點,但現(xiàn)在我們只有 10 個,以及標簽索引和標簽字符串的映射。
          model = ViTForImageClassification.from_pretrained(model_name, num_labels=10, ignore_mismatched_sizes=True, id2label=itos, label2id=stoi)print(model.classifier)
          # OutputLinear(in_features=768, out_features=10, bias=True)

          擁抱臉部訓(xùn)練師


          訓(xùn)練器提供了高級別的抽象,簡化了訓(xùn)練和評估。
          讓我們從訓(xùn)練參數(shù)開始,您可以在其中定義超參數(shù)、日志記錄、指標等。
          args = TrainingArguments(    f"test-cifar-10",    save_strategy="epoch",    evaluation_strategy="epoch",    learning_rate=2e-5,    per_device_train_batch_size=10,    per_device_eval_batch_size=4,    num_train_epochs=3,    weight_decay=0.01,    load_best_model_at_end=True,    metric_for_best_model="accuracy",    logging_dir='logs',    remove_unused_columns=False,)
          現(xiàn)在,我們需要一個用于數(shù)據(jù)加載的collate 函數(shù)。它將像素值堆疊到張量中,并為標簽創(chuàng)建張量。該模型需要一批輸入中的 pixel_values 和 labels,因此不要更改這些張量的名稱。

          我們還需要一個函數(shù)來計算指標。在我們的例子中,我們將使用準確度。我建議將示例輸入傳遞給這些函數(shù)并打印值以更好地理解它們。
          def collate_fn(examples):    pixels = torch.stack([example["pixels"] for example in examples])    labels = torch.tensor([example["label"] for example in examples])    return {"pixel_values": pixels, "labels": labels}
          def compute_metrics(eval_pred): predictions, labels = eval_pred predictions = np.argmax(predictions, axis=1) return dict(accuracy=accuracy_score(predictions, labels))
          現(xiàn)在,將模型、訓(xùn)練參數(shù)、數(shù)據(jù)集、整理函數(shù)、度量函數(shù)和我們之前定義的圖像處理器傳遞到 Trainer 中:
          trainer = Trainer(    model,    args,     train_dataset=trainds,    eval_dataset=valds,    data_collator=collate_fn,    compute_metrics=compute_metrics,    tokenizer=processor,)


          訓(xùn)練模型

          我們必須訓(xùn)練我們微調(diào)的最后一層,同時保持所有其他層凍結(jié)。只需調(diào)用以下命令即可完成此操作:
          trainer.train()
          訓(xùn)練完成后,您可以看到如下日志和輸出:
          # OutputTrainOutput(global_step=675, training_loss=0.22329048227380824, metrics={'train_runtime': 1357.9833, 'train_samples_per_second': 9.941, 'train_steps_per_second': 0.497, 'total_flos': 1.046216869705728e+18, 'train_loss': 0.22329048227380824, 'epoch': 3.0})


          評估

          outputs = trainer.predict(testds)print(outputs.metrics)
          # Output{'test_loss': 0.07223748415708542, 'test_accuracy': 0.973, 'test_runtime': 28.5169, 'test_samples_per_second': 35.067, 'test_steps_per_second': 4.383}
          以下是訪問輸出的方法:
          itos[np.argmax(outputs.predictions[0])], itos[outputs.label_ids[0]]
          要繪制混淆矩陣,請使用以下代碼:
          y_true = outputs.label_idsy_pred = outputs.predictions.argmax(1)
          labels = trainds.features['label'].namescm = confusion_matrix(y_true, y_pred)disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=labels)disp.plot(xticks_rotation=45)

          混淆矩陣

                 
          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。

          交流群

          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产在线观看国产精品产拍 | 欧美熟女性爱 | 影音先锋女人av资源站 | 伊人大香蕉视频在线观看 | 中日韩A片 |