A Framework for Multiple-Instance Learning的复现与思考

准确率:0.6956521739130435。

思考

1.任何都是基于假设去处理数据。本文的假设就是出现一点在正包的交点中。假设是正包交于一点且该点距离所有的包距离最短。

遇到的问题:

1.我想找一点尽可能降低该点与正包的距离。实现。只是采用了简单的欧式距离。正包为欧式距离,负包是欧式距离加负号,

2.如果对musk数据未做任何处理,会导致e的x次幂直接为0。

复现代码:

from enum import auto
from scipy.io import loadmat
import numpy as np
import torch
import torch.utils.data as data_utils
from torch import nn
import torch.optim as optim
m = loadmat(r"musk_2_original.mat")
daaa=m.keys()
from torch import nn
x=torch.ones(1, 166, requires_grad=True)
x=x*100
x=torch.tensor(x,requires_grad=True)
optimizer = optim.Adam({x}, lr=4)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=500, gamma=0.1)
m1 = loadmat(r"musk_1_original.mat")
val_bag=[]
val_bag_lable=[]
train_bag=[]
train_bag_lable=[]
for i in m1['pos_bag']:
    for j in i:
        val_bag.append(torch.Tensor(j.T))
        val_bag_lable.append(1)
for i in m1['neg_bag']:
    for j in i:
        val_bag.append(torch.Tensor(j.T))
        val_bag_lable.append(0)
for i in m['pos_bag']:
    for j in i:
        train_bag.append(torch.Tensor(j.T))
        train_bag_lable.append(1)
for i in m['neg_bag']:
    for j in i:
        train_bag.append(torch.Tensor(j.T))
        train_bag_lable.append(0)
for j in range(5000):
    l=0
    optimizer.zero_grad()
    for i in range(len(train_bag)):
        p=0
        li=[]
        if train_bag_lable[i]==1:
            for m in range(len(train_bag[i])):
                w=torch.sqrt(torch.sum((train_bag[i][m]-x)**2))
                li.append(w)
                p=p+w
            #print("min",min(li))
        if train_bag_lable[i]==0:
            for m in range(len(train_bag[i])):
                w=torch.sqrt(torch.sum((train_bag[i][m]-x)**2))
                p=p+w
        l=l+p
    l.backward()
    optimizer.step()
    test_acc=0
    dist=0
    pos=0
    neg=0
    for i in range(len(val_bag)):
        for m in range(len(val_bag[i])):
            k1=torch.sqrt(torch.sum((val_bag[i][m]-x)**2))
            if m==0:
                dist=k1
            else:
                if dist>k1:
                    dist=k1
        if dist<1000:
            if val_bag_lable[i]==1:
                test_acc=test_acc+1
                pos=pos+1
        elif val_bag_lable[i]==0:
                test_acc=test_acc+1
                neg=neg+1  
#        if val_bag_lable[i]==1:    
#            print("dist",dist)      
    print("epoch",j,"loss",l,"acc",test_acc/len(val_bag),"pos",pos,"neg",neg)
posted @ 2022-11-03 10:26  祥瑞哈哈哈  阅读(38)  评论(0)    收藏  举报