ViT预训练权重迁移-实现任意尺寸输入
在将基于transformer的视觉模型(比如 ViT, Swin Transformer等)迁移到自己的数据集上进行微调时,往往需要使得自己的数据集中图像尺寸和这些模型的输入图像尺寸一致,这些模型常见的输入尺寸为224x224,284x284,768x768等。 然而,如果自己的数据集中图像尺寸比较大,比如1024x1024,直接resize为224x224等低分辨率图像会造成信息损失。 能不能在迁移预训练权重的同时,使得模型能够适应任意尺寸的输入呢?可以。 接下来以ViT为例,首先通过实验探究一下出现这种限制的原因,然后给出解决方案。 ViT模型定义如下: 12345678model=VisionTransformer( image_size=[224,224],# 预训练模型的输入图像尺寸 patch_size=16, n_layers=1, d_model=768,# token 维度 d_ff=2, n_heads=8, ...
如何将PyTorch权重转换成TensorRT的engine
假设你已经训练好了一个基于PyTorch的神经网络模型MyModel,本文将一步一步演示如何将其转换到TensorRT的engine格式,实现高性能模型推理。 代码复制可用,建议收藏~ 1. 加载模型权重直接加载训练好的PyTorch权重即可: 12model=MyModel(in_channel=3,out_channel=1)model.load_state_dict(torch.load('my_model.pth')) 2. PyTorch权重转换到ONNXPyTorch本身已经提供了转换接口torch.onnx.export,所以转换起来也很容易: 12345model.cuda()model.eval()dummy_input = torch.randn(1,3, 512,512).cuda()torch.onnx.export(model, dummy_input, "onnx.onnx", opset_version=11,input_names = ['input'],output_names =...
AI绘画的基石-DDPM
在AI绘画发展历程中,涌现了多种不同的生成模型和算法,其中DDPM(Denoising Diffusion Probabilistic Model)是一种比较有效的图像生成模型之一,也是最近比较热门的AI绘画模型所采用的技术。DDPM的设计巧妙,可以从高斯噪声中生成高逼真度的图像。 DDPM相对于当前诸如stable difussion等AI绘画模型来说,扮演着类似于GAN相对于StyleGAN等模型的角色 因此,DDPM并不是特指某个网络结构,而是一种通用的训练思路 这几天结合着Hung-yi Lee的视频对DDPM的优化目标推导过程进行了梳理,在此记录下,以下是正文内容。 最大化似然函数可以等价于最小化KL散度,因此在生成模型(VAE, DM,...
经典目标检测
RCNN首先,使用Selective...
chatGPT是怎样炼成的
chatGPT会写作业,写代码,写文案,写提示词喂给AI绘画模型来作画,各种各样的玩法,使得chatGPT成为了一个”得力助手”,微软也在自家的搜索引擎Bing中引入了chatGPT,大有要引领搜索引擎新未来的趋势,chatGPT(或者类似的模型)正逐步走向大众视野。 在体验过chatGPT后,可以明显感觉到,对方不再像是各大手机厂商的智能语音助手,而是一个可以结合对话上下文语境实现真正连续对话的”机器人”。 是什么使得chatGPT脱颖而出呢? 这还要从许多年前讲起。 chatGPT的前身是GPT模型,GPT的全称是Generative Pre-trained...
都2023了,你还在用tqdm做进度条吗
谈到Python的进度条,相信大家用的最多的就是tqdm库了,比如这样: 1234import timefrom tqdm import tqdmfor i in tqdm(range(20)): time.sleep(1) 运行上述代码,便可以看到如下的进度条: 今天要分享的是另外一款Python进度条,相较于老前辈tqdm,在视觉效果上更加炫酷,话不多说,开整! 这款进度条依赖于rich库中的progress模块进行实现,所以第一步就是安装rich库,直接pip install rich即可搞定。 在完成rich库的安装后,就可以实现一个简易的Python进度条啦: 12345import timefrom rich.progress import trackfor i in track(range(20), description="Processing..."): time.sleep(1) 效果如下: 也可以同时展示多个任务进度条: 12345678910111213141516import timefrom...
为ONNX设置动态输入
在使用torch自带的方法将训练好的权重文件转换成onnx格式时,输入的张量可以是静态的,也可以通过一些设置修改成动态的。 静态:在导出onnx时传入输入尺寸,在之后的预测过程中也必须使用相同尺寸的输入。 这种方法对于像分割检测这种任务不太友好,我们希望模型能够自适应输入尺寸,所以需要设置成动态输入形式。 设置方法也很方便,只需在导出时传入dynamic_axes,指定要动态输入的维度即可。 123456789101112131415161718192021222324252627282930313233343536373839404142434445import argparseimport osimport numpy as npimport timeimport cv2from modeling.deeplab import *from dataloaders import custom_transforms as trfrom PIL import Imagefrom torchvision import transformsfrom dataloaders.utils...
VIT如何处理不同尺寸的输入图片?
假设vit的输入图片尺寸是224,将图片分为固定大小的patch,patch大小为patch_size=16x16 则每张图像会生成224x224/16x16=14*14=196个patch, 每个patch的长度是16*16*3=768 这里还需要加上一个特殊字符cls,因此最终的维度是197x768 相当于NLP中一个句子有197个单词,每个单词的embedding dim是768 现在,保持patch size不变,将输入图片尺寸改成288*288 当输入图片尺寸发生变化时,由于每个 patch 的尺寸固定,图片切分出的 patch 数就会发生变化。表现在上述特征图中,就是特征图的尺寸发生了变化。这样一来,我们原本位置编码图的尺寸就和图像特征图的尺寸对不上了,无法进行后续的计算。 找到了问题所在,解决的方法也就顺理成章了。位置编码代表的是 patch 所在位置的附加信息,那么如果和图像特征图的尺寸不匹配,只需要使用双三次插值法(Bicubic)对位置编码图进行插值缩放,缩放到与图像特征图一致的尺寸,就同样可以表现每个...
Kaggle-GI-Tract竞赛-EDA
每个case都对应若干Day的若干个scan得到的slices,在train.csv中,每个case-Day-slice占3行,分别对应3个类别(大肠、小肠、胃)的标注信息 因此,在制作每一个case-Day-slice的mask时(制作1D数据),这三行分别作为mask的一个通道,因此mask是3个通道的: 1234567891011def id2mask(id_): idf = df[df['id']==id_] wh = idf[['height','width']].iloc[0] shape = (wh.height, wh.width, 3) mask = np.zeros(shape, dtype=np.uint8) for i, class_ in enumerate(['large_bowel', 'small_bowel', 'stomach']): cdf =...
权重衰减和L2正则化
权重衰减是在更新模型的参数时,对当前参数乘以一个系数,公式如下: 而L2正则化是在损失函数后面加一项约束,如下: 在使用SGD作为优化器,且满足$\lambda’=\frac{\lambda}{\alpha}$时,权重衰减和L2正则化等价,证明如下: 参考: [1] https://blog.csdn.net/weixin_41803874/article/details/108730883 [2] https://zhuanlan.zhihu.com/p/498372080 [3] https://arxiv.org/pdf/1711.05101.pdf