1.DecompressionBombWarning: Image size (92680344 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.DecompressionBombWarning,
日期 : 2021-01-27
原因是图像尺寸超过PLI 默认读取图像尺寸。
一种方法是更改阈值上限 参考
from PIL import Image Image.MAX_IMAGE_PIXELS = 2300000000 # 更改阈值像素上限
第二种方法,使用其它的库,读入之后,缩放再给PIL使用。
2.列表保存生成的特征数据时,显存溢出
问题代码
for data in enumerate(testLoader): # 这边返回的是(执行次数,__getitem__返回数据) 。 Loader的batch_size= 1 print(data[0]) classNO = data[1][1] testImage= data[1][0] filePath =data[1][2] testEncode = model.encode(testImage.cuda()) featureList.append((testEncode,classNO ,filePath))
大概运行25次,显存溢出。 用的是ResNet152做迁移学习。显存是8G ,之前训练网络的时候,批次=25,显存就会溢出。对照,显然每次加载一幅图像生成特征值后,该次的网络占用没有释放。猜测虽然是eval ,但是每次运行后将testEncode 存储。系统检测到数据没释放,对应生成特征的网络过程也没释放。
解决办法如下
testEncode = model.encode(testImage.cuda()).detach().cpu() # 调用detach之后,存储新建副本,与网络无关。
3. 加载预训练模型并删除指定数据
加载预训练模型的时候,会碰到预训练模型类别数目和实际类别不一致。 网上搜索,有如下方法
1)创建模型时,设置类别数目和预训练模型一致,赋值完毕后,再更改输出头
checkpoint = torch.load(config.PREMODELPATH, map_location='cpu') #输出的层名称 classifiers = "head" msg = model.load_state_dict(checkpoint['model'], strict=False)
model.head = 新建输出头
此处,给出参考“timm”的代码。先删除预训练模型的头,然后直接赋值。
checkpoint = torch.load(config.PREMODELPATH, map_location='cpu') #输出的层名称 classifiers = "head" if classifiers is not None: if isinstance(classifiers, str): classifiers = (classifiers,) #类数目不一致,则删除输出层 if config.MODEL.NUM_CLASSES != 1000: for classifier_name in classifiers: # completely discard fully connected if model num_classes doesn't match pretrained weights del checkpoint["model"][classifier_name + '.weight'] del checkpoint["model"][classifier_name + '.bias']
原来预训
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch使用过程问题汇总 - Python技术站