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)

浙公网安备 33010602011771号