成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用PyTorch進行知識蒸餾的代碼示例

人工智能 機器學習
隨著機器學習模型的復雜性和能力不斷增加。提高大型復雜模型在小數據集性能的一種有效技術是知識蒸餾,它包括訓練一個更小、更有效的模型來模仿一個更大的“教師”模型的行為。

隨著機器學習模型的復雜性和能力不斷增加。提高大型復雜模型在小數據集性能的一種有效技術是知識蒸餾,它包括訓練一個更小、更有效的模型來模仿一個更大的“教師”模型的行為。

在本文中,我們將探索知識蒸餾的概念,以及如何在PyTorch中實現它。我們將看到如何使用它將一個龐大、笨重的模型壓縮成一個更小、更高效的模型,并且仍然保留原始模型的準確性和性能。

我們首先定義知識蒸餾要解決的問題。

我們訓練了一個大型深度神經網絡來執行復雜的任務,比如圖像分類或機器翻譯。這個模型可能有數千層和數百萬個參數,這使得它很難部署在現實應用程序、邊緣設備等中。并且這個超大的模型還需要大量的計算資源來運行,這使得它在一些資源受限的平臺上無法工作。

解決這個問題的一種方法是使用知識蒸餾將大模型壓縮成較小的模型。這個過程包括訓練一個較小的模型來模仿給定任務中大型模型的行為。

我們將使用來自Kaggle的胸部x光數據集進行肺炎分類來進行知識蒸餾的示例。我們使用的數據集被組織成3個文件夾(train, test, val),并包含每個圖像類別的子文件夾(Pneumonia/Normal)。共有5,863張x射線圖像(JPEG)和2個類別(肺炎/正常)。

比較一下這兩個類的圖片:

圖片

數據的加載和預處理與我們是否使用知識蒸餾或特定模型無關,代碼片段可能如下所示:

transforms_train = transforms.Compose([
transforms.Resize((224, 224)),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])])

transforms_test = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])])

train_data = ImageFolder(root=train_dir, transform=transforms_train)
test_data = ImageFolder(root=test_dir, transform=transforms_test)

train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
test_loader = DataLoader(test_data, batch_size=32, shuffle=True)

教師模型

在這個背景中教師模型我們使用Resnet-18并且在這個數據集上進行了微調。

import torch
import torch.nn as nn
import torchvision

class TeacherNet(nn.Module):
def __init__(self):
super().__init__()
self.model = torchvision.models.resnet18(pretrained=True)
for params in self.model.parameters():
params.requires_grad_ = False

n_filters = self.model.fc.in_features
self.model.fc = nn.Linear(n_filters, 2)

def forward(self, x):
x = self.model(x)
return x

微調訓練的代碼如下

 def train(model, train_loader, test_loader, optimizer, criterion, device):
dataloaders = {'train': train_loader, 'val': test_loader}

for epoch in range(30):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)

for phase in ['train', 'val']:
if phase == 'train':
model.train()
else:
model.eval()

running_loss = 0.0
running_corrects = 0

for inputs, labels in tqdm.tqdm(dataloaders[phase]):
inputs = inputs.to(device)
labels = labels.to(device)

optimizer.zero_grad()

with torch.set_grad_enabled(phase == 'train'):
outputs = model(inputs)
loss = criterion(outputs, labels)

_, preds = torch.max(outputs, 1)

if phase == 'train':
loss.backward()
optimizer.step()

running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)

epoch_loss = running_loss / len(dataloaders[phase].dataset)
epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)

print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))

這是一個標準的微調訓練步驟,訓練后我們可以看到該模型在測試集上達到了91%的準確性,這也就是我們沒有選擇更大模型的原因,因為作為測試91的準確率已經足夠作為基類模型來使用了。

我們知道模型有1170萬個參數,因此不一定能夠適應邊緣設備或其他特定場景。

學生模型

我們的學生是一個更淺的CNN,只有幾層和大約100k個參數。

class StudentNet(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(3, 4, kernel_size=3, padding=1),
nn.BatchNorm2d(4),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.fc = nn.Linear(4 * 112 * 112, 2)

def forward(self, x):
out = self.layer1(x)
out = out.view(out.size(0), -1)
out = self.fc(out)
return out

看代碼就非常的簡單,對吧。

如果我可以簡單地訓練這個更小的神經網絡,我為什么還要費心進行知識蒸餾呢?我們最后會附上我們通過超參數調整等手段從頭訓練這個網絡的結果最為對比。

但是現在我們繼續我們的知識蒸餾的步驟

知識蒸餾訓練

訓練的基本步驟是不變的,但是區別是如何計算最終的訓練損失,我們將使用教師模型損失,學生模型的損失和蒸餾損失一起來計算最終的損失。

class DistillationLoss:
def __init__(self):
self.student_loss = nn.CrossEntropyLoss()
self.distillation_loss = nn.KLDivLoss()
self.temperature = 1
self.alpha = 0.25

def __call__(self, student_logits, student_target_loss, teacher_logits):
distillation_loss = self.distillation_loss(F.log_softmax(student_logits / self.temperature, dim=1),
F.softmax(teacher_logits / self.temperature, dim=1))

loss = (1 - self.alpha) * student_target_loss + self.alpha * distillation_loss
return loss

損失函數是下面兩個東西的加權和:

  • 分類損失,稱為student_target_loss
  • 蒸餾損失,學生對數和教師對數之間的交叉熵損失

圖片

簡單的講,我們的教師模型需要教導學生如何“思考”的,這就是指的是它的不確定性;例如,如果教師模型的最終輸出概率是[0.53,0.47],我們希望學生也得到同樣類似結果,這些預測之間的差異就是蒸餾損失。

為了控制損失,還有有兩個主要參數:

  • 蒸餾損失的權重:0意味著我們只考慮蒸餾損失,反之亦然。
  • 溫度:衡量教師預測的不確定性。

在上面的要點中,alpha和temperature的值都是根據我們嘗試過一些組合得到的最佳結果的值。

結果對比

這是這個實驗的表格摘要。

圖片

我們可以清楚地看到使用更小(99.14%),更淺的CNN所獲得的巨大好處:與無蒸餾訓練相比,準確率提升了10點,并且比Resnet-18快11倍!也就是說,我們的小模型真的從大模型中學到了有用的東西。


責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2023-10-20 16:14:43

2024-01-30 01:12:37

自然語言時間序列預測Pytorch

2023-05-05 00:16:08

深度學習圖像分割Pytorch

2023-02-19 15:26:51

深度學習數據集

2025-02-27 10:41:53

2023-08-15 16:20:42

Pandas數據分析

2020-05-14 10:00:06

Python數據技術

2024-07-19 08:00:00

深度學習知識蒸餾

2022-10-30 15:00:40

小樣本學習數據集機器學習

2011-08-23 15:32:43

Oracle rege正則表達式

2024-12-02 01:10:04

神經網絡自然語言DNN

2024-07-17 11:46:10

2023-06-06 15:42:13

Optuna開源

2009-11-13 14:22:11

ADO.NET Dat

2024-01-25 10:19:10

2024-11-04 14:42:12

2024-12-04 09:15:00

AI模型

2023-09-01 14:49:09

AI微軟

2024-06-11 00:00:01

用ReactGraphQLCRUD

2021-03-19 17:59:30

深度學習音頻程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 国产精品免费观看 | 欧美色专区 | 日韩视频一区在线观看 | 91亚洲精华国产 | 国产一区在线看 | 一级在线观看 | 国产精品成人在线观看 | 色综合久| 久久乐国产精品 | 久久精彩视频 | 日韩三区 | 亚洲va欧美va人人爽午夜 | 亚洲一区二区国产 | 亚洲精品2区 | 欧美一区二区三区久久精品 | 国产成人一区 | 久久精品国产免费高清 | 99精品一级欧美片免费播放 | 羞羞视频网站免费看 | 欧美一级欧美一级在线播放 | 国产美女黄色 | 一区二区三区中文字幕 | 亚洲一区久久 | 亚洲天堂一区二区 | 国产精品免费一区二区三区 | 精品中文字幕在线 | 日韩一区二区在线视频 | 先锋资源网站 | 久久久久国产精品一区二区 | 一级a爱片性色毛片免费 | 免费人成激情视频在线观看冫 | 91在线精品视频 | 国产成人一区二区 | 日日干夜夜草 | 国产成人精品一区二区在线 | 日韩欧美国产成人一区二区 | 永久精品| 男女爱爱福利视频 | 精品久久久久久久久久久院品网 | 日日操日日干 |