zoukankan      html  css  js  c++  java
  • pytorch 分割二分类的两种形式

    1、单通道输出

    在训练时,输出通道为1,网络的输出数值是任意的。标签是单通道的二值图,对输出使用sigmoid,使其数值归一化到[0,1],然后和标签做交叉熵损失。

    训练结束后,将输出的output经过sigmoid函数,然后取阈值(一般为0.5),大于阈值则为1否则取0,从而得到最终的预测结果。

    代码实现:

    #第一种
    output = net(input)  # net的最后一层没有使用sigmoid
    Loss = torch.nn.BCEWithLogitsLoss()#会先做sigmoid然后求交叉熵
    loss = Loss(output, target)
    
    #第二种
    output = net(input)  # net的最后一层没有使用sigmoid
    output = F.sigmoid(output)
    Loss = torch.nn.BCEWithLoss()
    loss = Loss(output, target)
    
    #预测
    output = net(input)  # net的最后一层没有使用sigmoid
    output = F.sigmoid(output)
    predict = torch.where(output>0.5,torch.ones_like(output),torch.zeros_like(output)

      

    2、二(多)通道输出

    在训练时,输出通道为2,网络的输出数值是任意的。让网络的输出经过softmax,归一化到[0,1],在各通道中,同一位置加起来的数值会等于1。标签是单通道的二值图,首先使用one-hot编码,使其变为二通道,当前通道值为1,另一通道上就为0。然后将输出和标签做交叉熵损失。

    训练结束后,取每个像素位置上对应最大值的通道序号为最终的预测值,从而得到最终的预测结果。

    代码实现:

    #训练
    output = net(input)  # net的最后一层没有使用sigmoid
    Loss = torch.nn.CrossEntropyLoss()
    loss = Loss(output, target)
    
    #预测
    output = net(input)  # net的最后一层没有使用sigmoid
    predict = output.argmax(dim=1) 
  • 相关阅读:
    部署prerender服务器
    Bzoj4727--Poi2017Turysta
    Bzoj4818--Sdoi2017序列计数
    Heoi2014系列题解
    scoi2017酱油记
    Burnside引理与Pólya定理
    2017省选前北京集训总结
    奥妙重重的随机发生器
    ???--???Insection is not allowed
    反演
  • 原文地址:https://www.cnblogs.com/Xycdada/p/13960988.html
Copyright © 2011-2022 走看看