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']

  原来预训