Neural Networks for Multi-Instance Learning的复现与思考

准确率:0.8478260869565217。

原理:

从深度学习模型中选出一个输出值进行优化。即正包中选出最大值的去让网络拟合他。负包中选出最大值去近似0。

缺点:

模型自己选择最像正包的标签可能会导致模型错误识别正类。模型好像随着训练在验证集的准确率增加。并未过拟合。好像被没有受其影响。

没加BN层隐藏层需要较多的神经元。没有BN层好像也可以。

relu激活函数解决了梯度消失,但是没有解决梯度爆炸。

思考:
BN层非常影响训练速度,有时会导致模型的准确率降低。

程序:

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
network=nn.Sequential(nn.Linear(166,80),nn.Sigmoid(),nn.Linear(80,1),nn.Sigmoid())
#network=nn.Sequential(nn.BatchNorm1d(166),nn.Linear(166,2),nn.Softmax(dim=1))
w=nn.BatchNorm1d(166)

optimizer = optim.Adam(network.parameters(), lr=0.00004)
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(j.T)
val_bag_lable.append(1)
for i in m1[‘neg_bag’]:
for j in i:
val_bag.append(j.T)
val_bag_lable.append(0)
for i in m[‘pos_bag’]:
for j in i:
train_bag.append(j.T)
train_bag_lable.append(1)
for i in m[‘neg_bag’]:
for j in i:
train_bag.append(j.T)
train_bag_lable.append(0)
t=0.1
for j in range(5000):
r=0
e=0
er=0
acc=0
sum=0
network.train()
for i in range(len(train_bag)):

    if train_bag_lable[i]==0:
        sum=sum+1
        y=network(torch.Tensor(train_bag[i]))
        index=torch.argmax(y[:])
        l1=0.5*(y[index]-0)**2
        l1.backward()
        Y = torch.ge(y, 0.5).float()
        er=er+l1.cpu().mean()
        if 1 not in torch.ge(y[:], 0.5).float():
            acc=acc+1
    if train_bag_lable[i]==1:
        sum=sum+1
        y=network(torch.Tensor(train_bag[i]))
        #然后选出最大的
        index=torch.argmax(y[:])
        #l=-torch.log(y[index])
        l=0.5*(y[index]-1)**2
        l.backward()
        er=er+l.cpu()
        if 1 in torch.ge(y[:], 0.5).float():
            acc=acc+1
optimizer.step()
optimizer.zero_grad()
gai=0
if acc/sum>1 :
    for i in range(len(train_bag)):
        if torch.Tensor(train_bag[i]).shape[0]!=1:
            y=network(torch.Tensor(train_bag[i]))
            if train_bag_lable[i]==0:
                index=torch.argmax(y[:])
                index1=torch.argmin(y[:])
                if y[index1]/y[index]<=t:
                    train_bag_lable[i]=1
                    gai=gai+1
            if train_bag_lable[i]==1:
                index=torch.argmax(y[:])
                if y[index]/(1-y[index])<=t:
                    train_bag_lable[i]=0
                    gai=gai+1
    #print(len(train_bag_lable))
    if gai<0.001*sum:
        t=t+0.1
        t=min(t,0.9)

    print("gai t",gai,t)
network.eval()
test_acc=0
for i in range(len(val_bag)):
    y=network(torch.Tensor(val_bag[i]))
    if val_bag_lable[i]==1:
        Y = torch.ge(y[:], 0.5).float()
        if 1 in Y:
            test_acc=test_acc+1
        else:
            e=e+1
    else:
        Y = torch.ge(y[:], 0.5).float()
        if 1 not in Y:
            test_acc=test_acc+1
        else:
            r=r+1
print(j,er,acc/sum,test_acc/len(val_bag),e,r)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值