国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用Pytorch實現(xiàn)對比學(xué)習(xí)SimCLR 進(jìn)行自監(jiān)督預(yù)訓(xùn)練

開發(fā) 前端
SimCLR(Simple Framework for Contrastive Learning of Representations)是一種學(xué)習(xí)圖像表示的自監(jiān)督技術(shù)。 與傳統(tǒng)的監(jiān)督學(xué)習(xí)方法不同,SimCLR 不依賴標(biāo)記數(shù)據(jù)來學(xué)習(xí)有用的表示。 它利用對比學(xué)習(xí)框架來學(xué)習(xí)一組有用的特征,這些特征可以從未標(biāo)記的圖像中捕獲高級語義信息。

SimCLR(Simple Framework for Contrastive Learning of Representations)是一種學(xué)習(xí)圖像表示的自監(jiān)督技術(shù)。 與傳統(tǒng)的監(jiān)督學(xué)習(xí)方法不同,SimCLR 不依賴標(biāo)記數(shù)據(jù)來學(xué)習(xí)有用的表示。 它利用對比學(xué)習(xí)框架來學(xué)習(xí)一組有用的特征,這些特征可以從未標(biāo)記的圖像中捕獲高級語義信息。

SimCLR 已被證明在各種圖像分類基準(zhǔn)上優(yōu)于最先進(jìn)的無監(jiān)督學(xué)習(xí)方法。 并且它學(xué)習(xí)到的表示可以很容易地轉(zhuǎn)移到下游任務(wù),例如對象檢測、語義分割和小樣本學(xué)習(xí),只需在較小的標(biāo)記數(shù)據(jù)集上進(jìn)行最少的微調(diào)。

圖片

SimCLR 主要思想是通過增強模塊 T 將圖像與同一圖像的其他增強版本進(jìn)行對比,從而學(xué)習(xí)圖像的良好表示。這是通過通過編碼器網(wǎng)絡(luò) f(.) 映射圖像,然后進(jìn)行投影來完成的。 head g(.) 將學(xué)習(xí)到的特征映射到低維空間。 然后在同一圖像的兩個增強版本的表示之間計算對比損失,以鼓勵對同一圖像的相似表示和對不同圖像的不同表示。

本文我們將深入研究 SimCLR 框架并探索該算法的關(guān)鍵組件,包括數(shù)據(jù)增強、對比損失函數(shù)以及編碼器和投影的head 架構(gòu)。

我們這里使用來自 Kaggle 的垃圾分類數(shù)據(jù)集來進(jìn)行實驗

增強模塊

SimCLR 中最重要的就是轉(zhuǎn)換圖像的增強模塊。 SimCLR 論文的作者建議,強大的數(shù)據(jù)增強對于無監(jiān)督學(xué)習(xí)很有用。 因此,我們將遵循論文中推薦的方法。

  • 調(diào)整大小的隨機裁剪
  • 50% 概率的隨機水平翻轉(zhuǎn)
  • 隨機顏色失真(顏色抖動概率為 80%,顏色下降概率為 20%)
  • 50% 概率為隨機高斯模糊

def get_complete_transform(output_shape, kernel_size, s=1.0):
"""
Color distortion transform

Args:
s: Strength parameter

Returns:
A color distortion transform
"""
rnd_crop = RandomResizedCrop(output_shape)
rnd_flip = RandomHorizontalFlip(p=0.5)

color_jitter = ColorJitter(0.8*s, 0.8*s, 0.8*s, 0.2*s)
rnd_color_jitter = RandomApply([color_jitter], p=0.8)

rnd_gray = RandomGrayscale(p=0.2)
gaussian_blur = GaussianBlur(kernel_size=kernel_size)
rnd_gaussian_blur = RandomApply([gaussian_blur], p=0.5)
to_tensor = ToTensor()
image_transform = Compose([
to_tensor,
rnd_crop,
rnd_flip,
rnd_color_jitter,
rnd_gray,
rnd_gaussian_blur,
])
return image_transform

class ContrastiveLearningViewGenerator(object):
"""
Take 2 random crops of 1 image as the query and key.
"""
def __init__(self, base_transform, n_views=2):
self.base_transform = base_transform
self.n_views = n_views

def __call__(self, x):
views = [self.base_transform(x) for i in range(self.n_views)]
return views

下一步就是定義一個PyTorch 的 Dataset 。

class CustomDataset(Dataset):
def __init__(self, list_images, transform=None):
"""
Args:
list_images (list): List of all the images
transform (callable, optional): Optional transform to be applied on a sample.
"""
self.list_images = list_images
self.transform = transform

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

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

img_name = self.list_images[idx]
image = io.imread(img_name)
if self.transform:
image = self.transform(image)

return image

作為樣例,我們使用比較小的模型 ResNet18 作為主干,所以他的輸入是 224x224 圖像,我們按照要求設(shè)置一些參數(shù)并生成dataloader

out_shape = [224, 224]
kernel_size = [21, 21] # 10% of out_shape

# Custom transform
base_transforms = get_complete_transform(output_shape=out_shape, kernel_size=kernel_size, s=1.0)
custom_transform = ContrastiveLearningViewGenerator(base_transform=base_transforms)

garbage_ds = CustomDataset(
list_images=glob.glob("/kaggle/input/garbage-classification/garbage_classification/*/*.jpg"),
transform=custom_transform
)

BATCH_SZ = 128

# Build DataLoader
train_dl = torch.utils.data.DataLoader(
garbage_ds,
batch_size=BATCH_SZ,
shuffle=True,
drop_last=True,
pin_memory=True)

SimCLR

我們已經(jīng)準(zhǔn)備好了數(shù)據(jù),開始對模型進(jìn)行復(fù)現(xiàn)。上面的增強模塊提供了圖像的兩個增強視圖,它們通過編碼器前向傳遞以獲得相應(yīng)的表示。 SimCLR 的目標(biāo)是通過鼓勵模型從兩個不同的增強視圖中學(xué)習(xí)對象的一般表示來最大化這些不同學(xué)習(xí)表示之間的相似性。

編碼器網(wǎng)絡(luò)的選擇不受限制,可以是任何架構(gòu)。 上面已經(jīng)說了,為了簡單演示,我們使用 ResNet18。 編碼器模型學(xué)習(xí)到的表示決定了相似性系數(shù),為了提高這些表示的質(zhì)量,SimCLR 使用投影頭將編碼向量投影到更豐富的潛在空間中。 這里我們將ResNet18的512維度的特征投影到256的空間中,看著很復(fù)雜,其實就是加了一個帶relu的mlp。

class Identity(nn.Module):
def __init__(self):
super(Identity, self).__init__()
def forward(self, x):
return x

class SimCLR(nn.Module):
def __init__(self, linear_eval=False):
super().__init__()
self.linear_eval = linear_eval
resnet18 = models.resnet18(pretrained=False)
resnet18.fc = Identity()
self.encoder = resnet18
self.projection = nn.Sequential(
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 256)
)
def forward(self, x):
if not self.linear_eval:
x = torch.cat(x, dim=0)
encoding = self.encoder(x)
projection = self.projection(encoding)
return projection

對比損失

對比損失函數(shù),也稱為歸一化溫度標(biāo)度交叉熵?fù)p失 (NT-Xent),是 SimCLR 的一個關(guān)鍵組成部分,它鼓勵模型學(xué)習(xí)相同圖像的相似表示和不同圖像的不同表示。

NT-Xent 損失是使用一對通過編碼器網(wǎng)絡(luò)傳遞的圖像的增強視圖來計算的,以獲得它們相應(yīng)的表示。 對比損失的目標(biāo)是鼓勵同一圖像的兩個增強視圖的表示相似,同時迫使不同圖像的表示不相似。

NT-Xent 將 softmax 函數(shù)應(yīng)用于增強視圖表示的成對相似性。 softmax 函數(shù)應(yīng)用于小批量內(nèi)的所有表示對,得到每個圖像的相似性概率分布。 溫度參數(shù)temperature 用于在應(yīng)用 softmax 函數(shù)之前縮放成對相似性,這有助于在優(yōu)化過程中獲得更好的梯度。

在獲得相似性的概率分布后,通過最大化同一圖像的匹配表示的對數(shù)似然和最小化不同圖像的不匹配表示的對數(shù)似然來計算 NT-Xent 損失。

LABELS = torch.cat([torch.arange(BATCH_SZ) for i in range(2)], dim=0)
LABELS = (LABELS.unsqueeze(0) == LABELS.unsqueeze(1)).float() #one-hot representations
LABELS = LABELS.to(DEVICE)

def ntxent_loss(features, temp):
"""
NT-Xent Loss.

Args:
z1: The learned representations from first branch of projection head
z2: The learned representations from second branch of projection head
Returns:
Loss
"""
similarity_matrix = torch.matmul(features, features.T)
mask = torch.eye(LABELS.shape[0], dtype=torch.bool).to(DEVICE)
labels = LABELS[~mask].view(LABELS.shape[0], -1)
similarity_matrix = similarity_matrix[~mask].view(similarity_matrix.shape[0], -1)

positives = similarity_matrix[labels.bool()].view(labels.shape[0], -1)

negatives = similarity_matrix[~labels.bool()].view(similarity_matrix.shape[0], -1)

logits = torch.cat([positives, negatives], dim=1)
labels = torch.zeros(logits.shape[0], dtype=torch.long).to(DEVICE)

logits = logits / temp
return logits, labels

所有的準(zhǔn)備都完成了,讓我們訓(xùn)練 SimCLR 看看效果!

simclr_model = SimCLR().to(DEVICE)
criterion = nn.CrossEntropyLoss().to(DEVICE)
optimizer = torch.optim.Adam(simclr_model.parameters())

epochs = 10
with tqdm(total=epochs) as pbar:
for epoch in range(epochs):
t0 = time.time()
running_loss = 0.0
for i, views in enumerate(train_dl):
projections = simclr_model([view.to(DEVICE) for view in views])
logits, labels = ntxent_loss(projections, temp=2)
loss = criterion(logits, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()

# print stats
running_loss += loss.item()
if i%10 == 9: # print every 10 mini-batches
print(f"Epoch: {epoch+1} Batch: {i+1} Loss: {(running_loss/100):.4f}")
running_loss = 0.0
pbar.update(1)
print(f"Time taken: {((time.time()-t0)/60):.3f} mins")

上面代碼訓(xùn)練了10輪,假設(shè)我們已經(jīng)完成了預(yù)訓(xùn)練過程,可以將預(yù)訓(xùn)練的編碼器用于我們想要的下游任務(wù)。這可以通過下面的代碼來完成。

from torchvision.transforms import Resize, CenterCrop
resize = Resize(255)
ccrop = CenterCrop(224)
ttensor = ToTensor()

custom_transform = Compose([
resize,
ccrop,
ttensor,
])

garbage_ds = ImageFolder(
root="/kaggle/input/garbage-classification/garbage_classification/",
transform=custom_transform
)

classes = len(garbage_ds.classes)

BATCH_SZ = 128

train_dl = torch.utils.data.DataLoader(
garbage_ds,
batch_size=BATCH_SZ,
shuffle=True,
drop_last=True,
pin_memory=True,
)

class Identity(nn.Module):
def __init__(self):
super(Identity, self).__init__()
def forward(self, x):
return x

class LinearEvaluation(nn.Module):
def __init__(self, model, classes):
super().__init__()
simclr = model
simclr.linear_eval=True
simclr.projection = Identity()
self.simclr = simclr
for param in self.simclr.parameters():
param.requires_grad = False
self.linear = nn.Linear(512, classes)
def forward(self, x):
encoding = self.simclr(x)
pred = self.linear(encoding)
return pred

eval_model = LinearEvaluation(simclr_model, classes).to(DEVICE)
criterion = nn.CrossEntropyLoss().to(DEVICE)
optimizer = torch.optim.Adam(eval_model.parameters())

preds, labels = [], []
correct, total = 0, 0

with torch.no_grad():
t0 = time.time()
for img, gt in tqdm(train_dl):
image = img.to(DEVICE)
label = gt.to(DEVICE)
pred = eval_model(image)
_, pred = torch.max(pred.data, 1)
total += label.size(0)
correct += (pred == label).float().sum().item()

print(f"Time taken: {((time.time()-t0)/60):.3f} mins")

print(
"Accuracy of the network on the {} Train images: {} %".format(
total, 100 * correct / total
)
)

上面的代碼最主要的部分就是讀取剛剛訓(xùn)練的simclr模型,然后凍結(jié)所有的權(quán)重,然后再創(chuàng)建一個分類頭self.linear ,進(jìn)行下游的分類任務(wù)

總結(jié)

本文介紹了SimCLR框架,并使用它來預(yù)訓(xùn)練隨機初始化權(quán)重的ResNet18。預(yù)訓(xùn)練是深度學(xué)習(xí)中使用的一種強大的技術(shù),用于在大型數(shù)據(jù)集上訓(xùn)練模型,學(xué)習(xí)可以轉(zhuǎn)移到其他任務(wù)中的有用特征。SimCLR論文認(rèn)為,批量越大,性能越好。我們的實現(xiàn)只使用128個批大小,只訓(xùn)練10個epoch。所以這不是模型的最佳性能,如果需要性能對比還需要進(jìn)一步的訓(xùn)練。

下圖是論文作者給出的性能結(jié)論:

圖片

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2022-01-06 09:57:02

數(shù)據(jù)計算機神經(jīng)網(wǎng)絡(luò)

2022-11-28 14:00:24

人工智能

2023-09-06 09:59:12

雷達(dá)技術(shù)

2024-09-26 16:51:23

2024-01-29 00:24:07

圖像模型預(yù)訓(xùn)練

2020-07-29 12:16:12

預(yù)訓(xùn)練自訓(xùn)練神經(jīng)網(wǎng)絡(luò)

2019-03-10 22:22:06

PyTorchKeras深度學(xué)習(xí)

2020-01-20 14:25:19

數(shù)據(jù)平臺架構(gòu)

2025-06-12 08:46:00

2025-06-11 14:45:57

強化學(xué)習(xí)訓(xùn)練模型

2024-07-30 09:14:13

模型數(shù)據(jù)

2025-03-17 09:12:00

訓(xùn)練模型AI

2023-02-08 10:49:56

深度學(xué)習(xí)模型

2025-07-09 07:52:59

2024-12-03 09:49:07

2025-08-15 12:36:04

2022-10-30 15:00:40

小樣本學(xué)習(xí)數(shù)據(jù)集機器學(xué)習(xí)

2022-05-17 16:38:40

數(shù)據(jù)訓(xùn)練

2017-12-26 13:53:31

深度學(xué)習(xí)遷移學(xué)習(xí)
點贊
收藏

51CTO技術(shù)棧公眾號

深夜福利久久| 欧美综合社区国产| 日韩影院免费视频| 欧美另类69精品久久久久9999| 欧美aaa一级| 国产91高潮流白浆在线麻豆 | 亚洲国产精品嫩草影院久久av| 欧美成人欧美edvon| 尤物视频免费在线观看| 高清国产一区二区三区| 蜜桃精品久久久久久久免费影院| 国产成人ay| 欧美第一黄网免费网站| 亚洲天堂导航| 欧美一区二区三区日韩| 在线麻豆国产传媒1国产免费| 99久久精品国产网站| 欧美一区二区在线| 国内精品久久久久久久影视麻豆| 国产精品久久久久久久7电影| 综合视频一区| 欧美成人精品不卡视频在线观看| 一个人看的www视频在线免费观看| 欧美日韩免费在线视频| 一二三中文字幕在线| 亚洲综合激情另类小说区| 免费99热在线观看| 中文字幕成人网| 五月婷婷深爱五月| 久久久亚洲综合| 日本新janpanese乱熟| 久久免费精品国产久精品久久久久| 精品人妻人人做人人爽| 高清av一区二区| 成人网站免费观看入口| 国产 日韩 欧美大片| 国产在线视频综合| 国产一区二区精品久久| 国产女教师bbwbbwbbw| 国产福利不卡视频| 欧美日韩二三区| 99热99精品| 男人舔女人下面高潮视频| 国产精品无码永久免费888| www.这里只有精品| 亚洲在线中文字幕| 视频在线不卡| 欧美日韩在线三区| 制服丝袜在线播放| 亚洲欧美在线x视频| 日日夜夜亚洲| 欧美性资源免费| 日韩在线视屏| 精品国产乱码久久久久久久软件 | 国产黄色片大全| 亚洲免费伊人电影| 午夜在线观看91| 欧美男生操女生| 污片视频在线免费观看| 亚洲欧美日韩一区二区在线| 国产激情欧美| 97色在线视频| 在线国产一区| 亚洲欧美久久234| 久久久国际精品| 奇米影视888狠狠狠777不卡| 日韩视频一区二区三区| 婷婷久久免费视频| 国产久一一精品| 日韩在线卡一卡二| 熟妇人妻va精品中文字幕| 亚洲国产va精品久久久不卡综合| 免费观看久久久久| 丝袜情趣国产精品| 久久综合成人| 精品一区二区成人免费视频| 国产精品久久久久久久久快鸭 | 日本午夜免费福利视频| 欧美午夜影院一区| av成人亚洲| 国产一区在线播放| 久久97超碰国产精品超碰| 向日葵污视频在线观看| 在线不卡中文字幕播放| 国产精品一区二区精品| 成人xxxxx色| 91网页版在线| 成年人在线看| 久久久国产一区二区| 欧美在线资源| 欧美亚洲另类色图| 欧美性猛交xxxx偷拍洗澡| 原纱央莉成人av片| 成人亚洲欧美一区二区三区| 成人综合婷婷国产精品久久蜜臀| 天堂中文字幕在线| 日日噜噜噜夜夜爽亚洲精品| 国内自拍视频一区二区三区 | 欧美三区美女| 老司机激情视频| 欧美性猛xxx| 国产亚洲高清一区| 开心色怡人综合网站| 国产精品传媒在线| 成人影院在线视频| 成人自拍性视频| 久久综合九色综合欧美亚洲| 黄视频网站在线| 欧美在线视频播放| 粉嫩绯色av一区二区在线观看 | 亚洲精品国产精品国自产在线| 国产精品欧美大片| 亚洲精品欧美精品| 色综合中文字幕| swag国产精品一区二区| 亚洲一区二区三区乱码 | 日韩三级av| 国产乱人伦精品一区二区三区| 色94色欧美sute亚洲线路一ni| heyzo欧美激情| 国产中文字幕乱人伦在线观看| 欧美色国产精品| 久久人人99| 成人免费网站视频www| 中文字幕久久亚洲| 美女视频免费一区| 欧美极品另类| 91精品国产99久久久久久红楼| 国产日韩视频一区二区三区| 中文av在线全新| 久久亚洲高清| 91久久精品一区二区三区| 国产成人影院| 免费女人黄页| 久久成人人人人精品欧| 国产成人精品免费网站| h片精品在线观看| 麻豆一区区三区四区产品精品蜜桃| 精品久久久久久久久久| 国产探花一区| 日本成本人片免费观看| 性欧美xxxx交| 国产精品污污网站在线观看| 国产午夜亚洲精品一级在线| 久久久久久久久久久99| 中文字幕在线成人| 99精品欧美一区二区三区综合在线| 日本美女一区| 少妇久久久久久被弄到高潮| 日韩精品极品视频| 麻豆精品国产传媒mv男同| h片视频在线观看| 成人免费看片视频在线观看| 国产视频久久久久| 国产91在线观看丝袜| 精品自拍视频| 妞干网在线观看视频| 久久久www成人免费精品| 不卡av在线免费观看| 9999精品免费视频| 亚洲成人av免费看| 国产不卡av在线| 欧美日韩视频免费播放| 欧美三区视频| 国模雨婷捆绑高清在线| 奇米777四色影视在线看| 久久精品99久久久香蕉| 久久久精品tv| 精品一区二区三区在线| 天堂成人在线| 欧美在线3区| 日韩激情片免费| 99国产欧美久久久精品| 人人精品视频| 深夜福利视频在线免费观看| 国产日韩三区| 精品国产乱码久久久久久久久| 免费观看成人av| 亚洲精品一区二区在线播放∴| 免费看污污网站| 成人激情免费在线| 精品乱人伦小说| 97se亚洲国产综合自在线观| 久久人人爽人人爽人人片av不| 在线免费观看av网站| 噜噜噜噜噜久久久久久91| 亚洲欧洲日本专区| 国产精品国产三级国产aⅴ无密码| 91亚洲国产高清| 丁香花在线电影小说观看| 春日野结衣av| 亚洲专区中文字幕| 亚洲精品网址在线观看| 国产欧美日韩另类视频免费观看 | 成人免费观看视频在线观看| 欧美中文在线字幕| 欧美一级久久久| 国产日韩欧美在线一区| 欧美女激情福利| 成人四虎影院|