概述
import os
import warnings
from pprint import pprint
from glob import glob
from tqdm import tqdm
import torch
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torchvision.transforms as T
from box import Box
from timm import create_model
from sklearn.model_selection import StratifiedKFold
from torchvision.io import read_image
from torch.utils.data import DataLoader, Dataset
from pytorch_grad_cam import GradCAMPlusPlus
from pytorch_grad_cam.utils.image import show_cam_on_image
import pytorch_lightning as pl
from pytorch_lightning.utilities.seed import seed_everything
from pytorch_lightning import callbacks
from pytorch_lightning.callbacks.progress import ProgressBarBase
from pytorch_lightning.callbacks.early_stopping import EarlyStopping
from pytorch_lightning.loggers import TensorBoardLogger
from pytorch_lightning import LightningDataModule, LightningModule
config = {'seed': 20211111,
'root': './input/petfinder-pawpularity-score/',
'n_splits': 5,
'epoch': 60,
'trainer': {
'gpus': 1,
'accumulate_grad_batches': 1,
'progress_bar_refresh_rate': 1,
'fast_dev_run': False,
'num_sanity_val_steps': 0,
'resume_from_checkpoint': None,
},
'transform':{
'name': 'get_default_transforms',
'image_size': 600
},
'train_loader':{
'batch_size': 2,
'shuffle': True,
'num_workers': 4,
'pin_memory': False,
'drop_last': True,
},
'val_loader': {
'batch_size': 2,
'shuffle': False,
'num_workers': 4,
'pin_memory': False,
'drop_last': False
},
'model':{
'name': 'vit_large_patch16_384',
'output_dim': 1
},
'optimizer':{
'name': 'optim.AdamW',
'params':{
'lr': 1e-5
},
},
'scheduler':{
'name': 'optim.lr_scheduler.CosineAnnealingWarmRestarts',
'params':{
'T_0': 20,
'eta_min': 1e-4,
}
},
'loss': 'nn.BCEWithLogitsLoss',
}
config = Box(config)
pprint(config)
class Model(pl.LightningModule):
def __init__(self, cfg):
super().__init__()
self.cfg = cfg
self.__build_model()
self._criterion = eval(self.cfg.loss)()
self.transform = get_default_transforms()
self.save_hyperparameters(cfg)
def __build_model(self):
self.backbone = create_model(
self.cfg.model.name, pretrained=True, num_classes=0, in_chans=3
)
num_features = self.backbone.num_features
self.fc = nn.Sequential(
nn.Dropout(0.5), nn.Linear(num_features, self.cfg.model.output_dim)
)
def forward(self, x):
f = self.backbone(x)
out = self.fc(f)
return out
def training_step(self, batch, batch_idx):
loss, pred, labels = self.__share_step(batch, 'train')
return {'loss': loss, 'pred': pred, 'labels': labels}
def validation_step(self, batch, batch_idx):
loss, pred, labels = self.__share_step(batch, 'val')
return {'pred': pred, 'labels': labels}
def __share_step(self, batch, mode):
images, labels = batch
labels = labels.float() / 100.0
images = self.transform[mode](images)
if torch.rand(1)[0] < 0.5 and mode == 'train':
mix_images, target_a, target_b, lam = mixup(images, labels, alpha=0.5)
logits = self.forward(mix_images).squeeze(1)
loss = self._criterion(logits, target_a) * lam +
(1 - lam) * self._criterion(logits, target_b)
else:
logits = self.forward(images).squeeze(1)
loss = self._criterion(logits, labels)
pred = logits.sigmoid().detach().cpu() * 100.
labels = labels.detach().cpu() * 100.
return loss, pred, labels
def training_epoch_end(self, outputs):
self.__share_epoch_end(outputs, 'train')
def validation_epoch_end(self, outputs):
self.__share_epoch_end(outputs, 'val')
def __share_epoch_end(self, outputs, mode):
preds = []
labels = []
for out in outputs:
pred, label = out['pred'], out['labels']
preds.append(pred)
labels.append(label)
preds = torch.cat(preds)
labels = torch.cat(labels)
metrics = torch.sqrt(((labels - preds) ** 2).mean())
self.log(f'{mode}_loss', metrics)
def check_gradcam(self, dataloader, target_layer, target_category, reshape_transform=None):
cam = GradCAMPlusPlus(
model=self,
#target_layer=target_layer,
target_layers=[target_layer],
use_cuda=self.cfg.trainer.gpus,
reshape_transform=reshape_transform)
org_images, labels = iter(dataloader).next()
cam.batch_size = len(org_images)
images = self.transform['val'](org_images)
images = images.to(self.device)
logits = self.forward(images).squeeze(1)
pred = logits.sigmoid().detach().cpu().numpy() * 100
labels = labels.cpu().numpy()
grayscale_cam = cam(input_tensor=images, target_category=target_category, eigen_smooth=True)
org_images = org_images.detach().cpu().numpy().transpose(0, 2, 3, 1) / 255.
return org_images, grayscale_cam, pred, labels
def configure_optimizers(self):
optimizer = eval(self.cfg.optimizer.name)(
self.parameters(), **self.cfg.optimizer.params
)
scheduler = eval(self.cfg.scheduler.name)(
optimizer,
**self.cfg.scheduler.params
)
return [optimizer], [scheduler]
IMAGENET_MEAN = [0.485, 0.456, 0.406] # RGB
IMAGENET_STD = [0.229, 0.224, 0.225] # RGB
def get_default_transforms():
transform = {
"train": T.Compose(
[
T.RandomHorizontalFlip(),
T.RandomVerticalFlip(),
T.RandomAffine(15, translate=(0.1, 0.1), scale=(0.9, 1.1)),
T.ColorJitter(brightness=0.1, contrast=0.1, saturation=0.1),
T.ConvertImageDtype(torch.float),
T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
]
),
"val": T.Compose(
[
T.ConvertImageDtype(torch.float),
T.Normalize(mean=IMAGENET_MEAN, std=IMAGENET_STD),
]
),
}
return transform
model = Model(config)
最后
以上就是平淡纸鹤为你收集整理的通过timm下载模型的全部内容,希望文章能够帮你解决通过timm下载模型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复