PyTorch 新手,使用 Data Loader 加载数据后无法进行预测

Posted

技术标签:

【中文标题】PyTorch 新手,使用 Data Loader 加载数据后无法进行预测【英文标题】:New to PyTorch, having trouble making predictions once data is loaded using Data Loader 【发布时间】:2020-10-01 07:42:26 【问题描述】:

我对 PyTorch 完全陌生(以前使用过张量流),但我被困在我正在做的事情上。我的任务是使用预训练模型从应用程序文档中提取特征,然后计算相似度分数以识别重复项。我已将所有 pdf 转换为 .jpg,并加载了预训练模型并修改了最后一层以提取特征。文件夹结构是这样的:

root
|- Application 1
|   |- image 1
|   |- image 2...
|- Application 2
|   |- image 1
|   |- image 2...

我要做的是从每个子目录中的图像中提取特征并计算它们之间的欧几里德距离并输出相似度矩阵。我遇到问题的地方,这可能看起来很基本,实际上是在加载数据后做出预测。以下是我到目前为止的代码,任何帮助将不胜感激。

def get_pretrained_model_notop(model_name): #pull the model and change last layer
    pretrained_model = model_name(pretrained=True) #downloads pretrained model weights
    for param in pretrained_model.parameters():
        param.requires_grad = False #freezes layers
    pretrained_model = nn.Sequential(*list(pretrained_model.children())[:-1]) #drops final layer, because we aren't classifying 1000 imagenet classes
    pretrained_model.fc = nn.Sequential(
    nn.Flatten() #adds flatten layer at end of model
                            )
    if torch.cuda.is_available(): #uses GPU if available
        pretrained_model = pretrained_model.cuda()
    return pretrained_model

def get_similarity(pretrained_model,train_imgs):   #function to extract features from the model and compute similarity scores
    bottleneck_feature_example = pretrained_model(train_imgs)
    similarity = euclidean_distances(bottleneck_feature_example)
    similarity=similarity/similarity.max()
    similarity_df = pd.DataFrame(similarity)
    similarity_df=1-similarity_df
    return np.round(similarity_df,4)

transforms =           transforms.Compose([transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])])

img_dir='path'
images = datasets.ImageFolder(img_dir,transform=transforms)  
data_loader = torch.utils.data.DataLoader(images,
            batch_size=32,
            shuffle=True,
            num_workers=4)

model_list=[models.densenet201]
model_name=['densenet201']
pretrained_model=[get_pretrained_model_notop(selected_model) for selected_model in model_list]
for data in data_loader:
    pred=[get_similarity(pretrained,data) for pretrained in pretrained_model]
    pred_label_ensemble=sum(pred) / len(pred)   
    pred_label_ensemble.columns=page_numbers
    prob_output_folder = unzipped.replace('MF_loan_document', 'MF_loan_document_results')
    pred_label_ensemble.to_csv(prob_output_folder+'/'+'results.csv',index=False)

【问题讨论】:

【参考方案1】:

您没有具体说明问题,但我认为这是因为您期望 images 但将 data 传递给 get_similarity。所以,你需要改变:

pred=[get_similarity(pretrained,data) for pretrained in pretrained_model]

到:

pred = [get_similarity(pretrained, data[0]) for pretrained in pretrained_model]

因为data 是一个带有(images, labels) 的元组。

【讨论】:

【参考方案2】:

要从 pytorch 模型中获取功能,您需要注册一个前向挂钩。 这样您就不需要修改模型本身。 打印模型并选择你想要的层 -

model.chosen_layer.register_forward_hook(print_intermediate)

每次转发时都会调用函数 print_intermediate print_intermediate 的签名是

def print_intermediate(self, in_val): print (in_val)

您可以使用全局列表或一些数据结构来存储激活并计算欧几里得距离,而不是打印。

【讨论】:

以上是关于PyTorch 新手,使用 Data Loader 加载数据后无法进行预测的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PYTorch 中定义数据加载器

PyTorch 使用一些错误记录

如何使用 PyTorch 拆分为 train_loader 和 test_loader?

Pytorch-DataLoader(数据迭代器)

Pytorch-DataLoader(数据迭代器)

.data 在 pytorch 中仍然有用吗?