使用PyTorch進行小樣本學習的影像分類
近年來,基於深度學習的模型在目標偵測和影像辨識等任務中表現出色。像ImageNet這樣具有挑戰性的影像分類資料集,包含1000種不同的物件分類,現在有些模型已經超過了人類層級。但是這些模型依賴監督訓練流程,標記訓練資料的可用性對它們有重大影響,並且模型能夠檢測到的類別也僅限於它們接受訓練的類別。
由於在訓練過程中沒有足夠的標記圖像用於所有類,這些模型在現實環境中可能不太有用。而我們希望的模型能夠識別它在訓練期間沒有見到過的類,因為幾乎不可能在所有潛在物件的圖像上進行訓練。我們將從幾個樣本中學習的問題被稱為「少樣本學習 Few-Shot learning」。
什麼是小樣本學習?
少樣本學習是機器學習的一個子領域。它涉及在只有少數訓練樣本和監督資料的情況下對新資料進行分類。只需少量的訓練樣本,我們創建的模型就可以相當好地執行。
考慮以下場景:在醫療領域,對於一些不常見的疾病,可能沒有足夠的x光影像用於訓練。對於這樣的場景,建立一個小樣本學習分類器是完美的解決方案。
小樣本的變化
#一般來說,研究人員確定了四個類型:
- N-Shot Learning (NSL)
- Few-Shot Learning ( FSL )
- One-Shot Learning (OSL)
- Zero-Shot Learning (ZSL)
當我們談論FSL 時,我們通常指的是N-way-K-Shot 分類。 N 代表類別數,K 代表每個類別中要訓練的樣本數。所以N-Shot Learning 被視為比所有其他概念更廣泛的概念。可以說 Few-Shot、One-Shot 和 Zero-Shot是 NSL 的子領域。而零樣本學習旨在在沒有任何訓練範例的情況下對看不見的類別進行分類。
在 One-Shot Learning 中,每個類別只有一個樣本。 Few-Shot 每個類別有 2 到 5 個樣本,也就是說 Few-Shot 是更靈活的 One-Shot Learning 版本。
小樣本學習方法
通常,在解決Few Shot Learning 問題時應考慮兩種方法:
資料級方法(DLA)
這個策略非常簡單,如果沒有足夠的資料來建立實體模型並防止欠擬合和過度擬合,那麼就應該添加更多資料。正因為如此,許多 FSL 問題都可以透過利用來更大大的基礎資料集的更多資料來解決。基本資料集的顯著特徵是它缺少構成我們對 Few-Shot 挑戰的支援集的類別。例如,如果我們想要對某種鳥類進行分類,則基礎資料集可能包含許多其他鳥類的圖片。
參數層級方法 (PLA)
從參數層級的角度來看,Few-Shot Learning 樣本相對容易過度擬合,因為它們通常具有大的高維空間。限制參數空間、使用正則化和使用適當的損失函數將有助於解決這個問題。少量的訓練樣本將被模型泛化。
透過將模型引導到廣闊的參數空間可以提高效能。由於缺乏訓練數據,正常的最佳化方法可能無法產生準確的結果。
因為上面的原因,訓練我們的模型以發現通過參數空間的最佳路徑,產生最佳的預測結果。這種方法稱為元學習。
小樣本學習影像分類演算法
有4種比較常見的小樣本學習的方法:
與模型無關的元學習Model-Agnostic Meta-Learning
基於梯度的元學習(GBML) 原則是MAML 的基礎。在 GBML 中,元學習者透過基礎模型訓練和學習所有任務表示的共享特徵來獲得先前的經驗。每次有新任務要學習時,元學習器都會利用其現有經驗和新任務提供的最少量的新訓練資料進行微調訓練。
一般情況下,如果我們隨機初始化參數經過幾次更新演算法將不會收斂到良好的效能。 MAML 試圖解決這個問題。 MAML 只需幾個梯度步驟並且保證沒有過度擬合的前提下,為元參數學習器提供了可靠的初始化,這樣可以對新任務進行最佳快速學習。
步驟如下:
- 元學習者在每個分集(episode)開始時創建自己的副本C,
- C 在這一分集上進行訓練(在base-model 的幫助下),
- C 對查詢集進行預測,
- 從這些預測中計算出的損失用於更新C,
- 這種情況一直持續到完成所有分集的訓練。
這種技術的最大優勢在於,它被認為與元學習演算法的選擇無關。因此MAML 方法被廣泛用於許多需要快速適應的機器學習演算法,尤其是深度神經網路。
匹配網路 Matching Networks
為解決 FSL 問題而創建的第一個度量學習方法是匹配網路 (MN)。
當使用匹配網路方法解決 Few-Shot Learning 問題時需要一個大的基礎資料集。 。
將該資料集分為幾個分集之後,對於每一分集,匹配網路進行以下操作:
- 來自支援集和查詢集的每個映像都被饋送到一個CNN,該CNN 為它們輸出特徵的嵌入
- 查詢圖像使用支援集訓練的模型得到嵌入特徵的餘弦距離,透過softmax 進行分類
- 分類結果的交叉熵損失通過CNN 反向傳播更新特徵嵌入模型
匹配網路可以透過這種方式學習建立圖像嵌入。 MN 能夠使用這種方法對照片進行分類,並且無需任何特殊的類別先驗知識。他只要簡單地比較類別的幾個實例就可以了。
由於類別因分集而異,因此匹配網路會計算對類別區分很重要的圖片屬性(特徵)。而當使用標準分類時,演算法會選擇每個類別獨有的特徵。
原型網路 Prototypical Networks
與匹配網路類似的是原型網路(PN)。它透過一些細微的變化來提高演算法的效能。 PN 比 MN 取得了更好的結果,但它們訓練過程本質上是相同的,只是比較了來自支援集的一些查詢圖片嵌入,但是 原型網路提供了不同的策略。
我們需要在 PN 中創建類別的原型:透過對類別中圖像的嵌入進行平均而創建的類別的嵌入。然後僅使用這些類別原型來比較查詢圖像嵌入。當用於單樣本學習問題時,它可與匹配網路相媲美。
關係網絡 Relation Network
關係網絡可以說是繼承了所有上面提到方法的研究的結果。 RN是基於PN思想的但包含了顯著的演算法改進。
該方法使用的距離函數是可學習的,而不是像先前研究的事先定義它。 關係模組位於嵌入模組之上,嵌入模組是從輸入影像計算嵌入和類別原型的部分。
可訓練的關係模組(距離函數)輸入是查詢影像的嵌入與每個類別的原型,輸出為每個分類匹配的關係分數。關係分數透過 Softmax 得到一個預測。
使用Open-AI Clip 進行零樣本學習
CLIP(Contrastive Language-Image Pre-Training)是一個在各種(圖像、文字)對上訓練的神經網路。它無需直接針對任務進行最佳化,就可以為給定的圖像來預測最相關的文字片段(類似於 GPT-2 和 3 的零樣本的功能)。
CLIP 在ImageNet「零樣本」上可以達到原始ResNet50 的效能,而且需要不使用任何標記範例,它克服了電腦視覺中的幾個主要挑戰,下面我們使用Pytorch來實現一個簡單的分類模型。
引入套件
! pip install ftfy regex tqdm ! pip install git+https://github.com/openai/CLIP.gitimport numpy as np import torch from pkg_resources import packaging print("Torch version:", torch.__version__)
載入模型
import clipclip.available_models() # it will list the names of available CLIP modelsmodel, preprocess = clip.load("ViT-B/32") model.cuda().eval() input_resolution = model.visual.input_resolution context_length = model.context_length vocab_size = model.vocab_size print("Model parameters:", f"{np.sum([int(np.prod(p.shape)) for p in model.parameters()]):,}") print("Input resolution:", input_resolution) print("Context length:", context_length) print("Vocab size:", vocab_size)
圖像預處理
我們將向模型輸入8個範例圖像及其文字描述,並比較對應特徵之間的相似性。
分詞器不區分大小寫,我們可以自由地給出任何合適的文字描述。
import os import skimage import IPython.display import matplotlib.pyplot as plt from PIL import Image import numpy as np from collections import OrderedDict import torch %matplotlib inline %config InlineBackend.figure_format = 'retina' # images in skimage to use and their textual descriptions descriptions = { "page": "a page of text about segmentation", "chelsea": "a facial photo of a tabby cat", "astronaut": "a portrait of an astronaut with the American flag", "rocket": "a rocket standing on a launchpad", "motorcycle_right": "a red motorcycle standing in a garage", "camera": "a person looking at a camera on a tripod", "horse": "a black-and-white silhouette of a horse", "coffee": "a cup of coffee on a saucer" }original_images = [] images = [] texts = [] plt.figure(figsize=(16, 5)) for filename in [filename for filename in os.listdir(skimage.data_dir) if filename.endswith(".png") or filename.endswith(".jpg")]: name = os.path.splitext(filename)[0] if name not in descriptions: continue image = Image.open(os.path.join(skimage.data_dir, filename)).convert("RGB") plt.subplot(2, 4, len(images) + 1) plt.imshow(image) plt.title(f"{filename}n{descriptions[name]}") plt.xticks([]) plt.yticks([]) original_images.append(image) images.append(preprocess(image)) texts.append(descriptions[name]) plt.tight_layout()
結果的視覺化如下:
我們對圖像進行規範化,對每個文字輸入進行標記,並運行模型的正傳播獲得圖像和文本的特徵。
image_input = torch.tensor(np.stack(images)).cuda() text_tokens = clip.tokenize(["This is " + desc for desc in texts]).cuda() with torch.no_grad():
我們將特徵歸一化,併計算每一對的點積,進行餘弦相似度計算
image_features /= image_features.norm(dim=-1, keepdim=True) text_features /= text_features.norm(dim=-1, keepdim=True) similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T count = len(descriptions) plt.figure(figsize=(20, 14)) plt.imshow(similarity, vmin=0.1, vmax=0.3) # plt.colorbar() plt.yticks(range(count), texts, fontsize=18) plt.xticks([]) for i, image in enumerate(original_images): plt.imshow(image, extent=(i - 0.5, i + 0.5, -1.6, -0.6), origin="lower") for x in range(similarity.shape[1]): for y in range(similarity.shape[0]): plt.text(x, y, f"{similarity[y, x]:.2f}", ha="center", va="center", size=12) for side in ["left", "top", "right", "bottom"]: plt.gca().spines[side].set_visible(False) plt.xlim([-0.5, count - 0.5]) plt.ylim([count + 0.5, -2]) plt.title("Cosine similarity between text and image features", size=20)
零樣本的圖像分類
from torchvision.datasets import CIFAR100 cifar100 = CIFAR100(os.path.expanduser("~/.cache"), transform=preprocess, download=True) text_descriptions = [f"This is a photo of a {label}" for label in cifar100.classes] text_tokens = clip.tokenize(text_descriptions).cuda() with torch.no_grad(): text_features = model.encode_text(text_tokens).float() text_features /= text_features.norm(dim=-1, keepdim=True) text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1) top_probs, top_labels = text_probs.cpu().topk(5, dim=-1) plt.figure(figsize=(16, 16)) for i, image in enumerate(original_images): plt.subplot(4, 4, 2 * i + 1) plt.imshow(image) plt.axis("off") plt.subplot(4, 4, 2 * i + 2) y = np.arange(top_probs.shape[-1]) plt.grid() plt.barh(y, top_probs[i]) plt.gca().invert_yaxis() plt.gca().set_axisbelow(True) plt.yticks(y, [cifar100.classes[index] for index in top_labels[i].numpy()]) plt.xlabel("probability") plt.subplots_adjust(wspace=0.5) plt.show()
可以看到,分類的效果還是非常好的。
以上是使用PyTorch進行小樣本學習的影像分類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在機器學習和資料科學領域,模型的可解釋性一直是研究者和實踐者關注的焦點。隨著深度學習和整合方法等複雜模型的廣泛應用,理解模型的決策過程變得尤為重要。可解釋人工智慧(ExplainableAI|XAI)透過提高模型的透明度,幫助建立對機器學習模型的信任和信心。提高模型的透明度可以透過多種複雜模型的廣泛應用等方法來實現,以及用於解釋模型的決策過程。這些方法包括特徵重要性分析、模型預測區間估計、局部可解釋性演算法等。特徵重要性分析可以透過評估模型對輸入特徵的影響程度來解釋模型的決策過程。模型預測區間估計

通俗來說,機器學習模型是一種數學函數,它能夠將輸入資料映射到預測輸出。更具體地說,機器學習模型是一種透過學習訓練數據,來調整模型參數,以最小化預測輸出與真實標籤之間的誤差的數學函數。在機器學習中存在多種模型,例如邏輯迴歸模型、決策樹模型、支援向量機模型等,每種模型都有其適用的資料類型和問題類型。同時,不同模型之間存在著許多共通性,或者說有一條隱藏的模型演化的路徑。將聯結主義的感知機為例,透過增加感知機的隱藏層數量,我們可以將其轉化為深度神經網路。而對感知機加入核函數的話就可以轉換為SVM。這一

本文將介紹如何透過學習曲線來有效辨識機器學習模型中的過度擬合和欠擬合。欠擬合和過擬合1、過擬合如果一個模型對資料進行了過度訓練,以至於它從中學習了噪聲,那麼這個模型就被稱為過擬合。過度擬合模型非常完美地學習了每一個例子,所以它會錯誤地分類一個看不見的/新的例子。對於一個過度擬合的模型,我們會得到一個完美/接近完美的訓練集分數和一個糟糕的驗證集/測試分數。略有修改:"過擬合的原因:用一個複雜的模型來解決一個簡單的問題,從資料中提取雜訊。因為小資料集作為訓練集可能無法代表所有資料的正確表示。"2、欠擬合如

1950年代,人工智慧(AI)誕生。當時研究人員發現機器可以執行類似人類的任務,例如思考。後來,在1960年代,美國國防部資助了人工智慧,並建立了實驗室進行進一步開發。研究人員發現人工智慧在許多領域都有用武之地,例如太空探索和極端環境中的生存。太空探索是對宇宙的研究,宇宙涵蓋了地球以外的整個宇宙空間。太空被歸類為極端環境,因為它的條件與地球不同。要在太空中生存,必須考慮許多因素,並採取預防措施。科學家和研究人員認為,探索太空並了解一切事物的現狀有助於理解宇宙的運作方式,並為潛在的環境危機

C++中機器學習演算法面臨的常見挑戰包括記憶體管理、多執行緒、效能最佳化和可維護性。解決方案包括使用智慧指標、現代線程庫、SIMD指令和第三方庫,並遵循程式碼風格指南和使用自動化工具。實作案例展示如何利用Eigen函式庫實現線性迴歸演算法,有效地管理記憶體和使用高效能矩陣操作。

譯者|李睿審校|重樓人工智慧(AI)和機器學習(ML)模型如今變得越來越複雜,這些模型產生的產出是黑盒子-無法向利害關係人解釋。可解釋性人工智慧(XAI)致力於透過讓利害關係人理解這些模型的工作方式來解決這個問題,確保他們理解這些模型實際上是如何做出決策的,並確保人工智慧系統中的透明度、信任度和問責制來解決這個問題。本文探討了各種可解釋性人工智慧(XAI)技術,以闡明它們的基本原理。可解釋性人工智慧至關重要的幾個原因信任度和透明度:為了讓人工智慧系統被廣泛接受和信任,使用者需要了解決策是如何做出的

編輯|ScienceAI問答(QA)資料集在推動自然語言處理(NLP)研究中發揮著至關重要的作用。高品質QA資料集不僅可以用於微調模型,也可以有效評估大語言模型(LLM)的能力,尤其是針對科學知識的理解和推理能力。儘管目前已有許多科學QA數據集,涵蓋了醫學、化學、生物等領域,但這些數據集仍有一些不足之處。其一,資料形式較為單一,大多數為多項選擇題(multiple-choicequestions),它們易於進行評估,但限制了模型的答案選擇範圍,無法充分測試模型的科學問題解答能力。相比之下,開放式問答

MetaFAIR聯合哈佛優化大規模機器學習時所產生的資料偏差,提供了新的研究架構。據所周知,大語言模型的訓練常常需要數月的時間,使用數百甚至上千個GPU。以LLaMA270B模型為例,其訓練總共需要1,720,320個GPU小時。由於這些工作負載的規模和複雜性,導致訓練大模型存在著獨特的系統性挑戰。最近,許多機構在訓練SOTA生成式AI模型時報告了訓練過程中的不穩定情況,它們通常以損失尖峰的形式出現,例如Google的PaLM模型訓練過程中出現了多達20次的損失尖峰。數值偏差是造成這種訓練不準確性的根因,
