1. 程式人生 > 其它 >Pytorch提取AI模型的中間結果的方法

Pytorch提取AI模型的中間結果的方法

pytorch

演算法和資料的相互成全

 資料中,結構化資料的應用和管理相對簡單,然而隨著非結構化資料的大量湧現,其處理方式和傳統的結構化資料有所不同。
 其一:處理工具智慧化,智慧化一方面體現再AI模型的應用,另外一方面也可以說資料具有了獨特的情況,可隨著模型的不同,資料就有所不同
 其二,隨著模型的固化,其實也是一種智力方式的固化,不同的模型對資料的反應和推斷會不同,在經過各種模型的打磨下,資料將做為一種全新的概念
     資料不僅僅是記錄,也是改變。資料不僅僅是資源,也是一種生產資料。

資料應用演算法的主要方面

增加對非結構化資料的瞭解
增加需要迭代和低算力模型的改進
對資料進行管理

學習方法

做資料處理相關工作的技能,在處理演算法上有所不同    
  資料瞭解演算法的學術類做法
      瞭解其基本原理
  	寫簡單的模型,不斷的迭代模型
  
  資料瞭解演算法的工程化階段    
      1.利用演算法提供的模型進行推斷 infer
      2.寫程式碼提取模型的部分結果
      3.訓練並優化模型
      4.復現和實現模型

工程做法

 利用程式碼提取模型的部分結果
  目前主流上有三種做法
    第一種,是寫一個模型,重寫這個模型中的部分元件,這個元件執行相同的功能,卻只返回自己需要的輸出
	第二種,只執行模型的部分,按照通常做法建立模型,但使用自己的程式碼去替代原模型的forward()
	第三種,就是使用forward hooks

程式碼示例

import torch
import torch.cuda
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
import numpy as np
import cv2

def get_model():

    #model_path ="/home/test/soft/models/vgg16-397923af.pth"
    model_path ="/home/test/soft/models/resnet101-5d3b4d8f.pth"
    pre = torch.load(model_path)
    # 載入模型 
    #model_ft =  models.vgg16(pretrained=False)
    model_ft = models.resnet101(pretrained=False)
    model_ft.load_state_dict(pre)
    model_ft.cuda()
    return model_ft

    # # 檢視模型結構
    # print(model_ft)
    # # 檢視網路引數
    # for name, parameters in model_ft.named_parameters():
    #     print(name, ':', parameters.size())
    # # 網路模型的卷積方式以及權重數值
    # print("#############-parameters")
    # for child in model_ft.children():
    #     print(child) 
    #     # for param in child.parameters():
    #     #     print(param)

def deal_img(img_path):
    """Transforming images on GPU  單個影象匯入"""
    image = cv2.imread(img_path) 
    image_new =  cv2.resize(image, (224,224))
    my_transforms= transforms.Compose(
        [ 
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229,0.224,0.225]) 
        ]
        )
    my_tensor = my_transforms(image_new)
    my_tensor = my_tensor.resize_(1,3,224,224)
    my_tensor= my_tensor.cuda()
    return my_tensor

def cls_inference(cls_model,imgpth):
    input_tensor = deal_img(imgpth)
    cls_model.eval()
    result = cls_model(input_tensor)
    result_npy = result.data.cpu().numpy()
    max_index = np.argmax(result_npy[0])
    return max_index

# 方式一
def feature_extract(cls_model,imgpth):
    cls_model.fc = torch.nn.LeakyReLU(0.1)
    cls_model.eval()
    input_tensor = deal_img(imgpth)
    result = cls_model(input_tensor)
    result_npy = result.data.cpu().numpy()
    return result_npy[0]

#方法二 
# 定義一個特徵提取的類 resnet
#  提取特徵層
class Feature_extractor(nn.Module):
    #"""從一個已經搭建好的網路中方便地提取到某些層的輸出"""
    def __init__(self, submodule, extract_layers):
       super(Feature_extractor,self).__init__()
       self.submodule= submodule
       self.extract_layers = extract_layers
    #"針對該模型進行了修改-自定義了forward函式,選擇在哪一層提取特徵"
    #  forward函式針對Resnet模型進行了修改 
    def forward(self, input):
        outputs = []
        for name,module in self.submodule._modules.items():
            if name is "fc":
                input= input.view(input.size(0),-1)
            input = module(input)
            if name in self.extract_layers  and "fc" not in name:
                outputs.append(input)
        return outputs
		
def resnet_feature_extract(feature_model,imgpth):
    feature_model.eval()
    input_tensor = deal_img(imgpth)
    result = feature_model(input_tensor)
    return result[0]


#方法三 hook輸出conv層的特徵圖


## 主函式
if __name__ == "__main__":
    image_path="/home/test/soft/8.jpg"
    # 建立模型
    model = get_model()
    cls_label = cls_inference(model,image_path)
    print(cls_label)
	#
    #feature = feature_extract(model,image_path)
    #print(feature)
    print(model)
	###方式二
    # layers you want to extract`
    print("\n######################################\n")
    target_layers = [ "layer1", "conv1"] 
    result_feature = Feature_extractor(model,target_layers)
    feature_ge = resnet_feature_extract(result_feature,image_path)
    print(feature_ge)

參考:

  Use Models  https://detectron2.readthedocs.io/en/latest/tutorials/models.html