【问题标题】:Multi label classification in Flux.jl?Flux.jl 中的多标签分类?
【发布时间】:2021-09-13 14:06:45
【问题描述】:

我目前正在使用一个数据集,其中类之间的边界没有很好地定义。我不想使用常规分类,因为使用该设置可能无法表示这些类的细微差别重叠。

我在 PyTorch 中看到了类似的设置,其中使用了二元交叉熵损失函数,但除此之外,我不确定需要做些什么来将我的问题从 Flux 中的分类转换为多标签分类。从Flux.jl docs 看来,我可能想要使用自定义拆分标签?

【问题讨论】:

    标签: julia flux.jl


    【解决方案1】:

    这个问题让我想到了如何在我自己的ML库BetaML中实现多标签分类,结果还是比较容易的:

    (编辑:仅使用几个DenseLayers 和第二层的激活函数f=x -> (tanh(x) + 1)/2 简化了模型)

    using BetaML
    
    # Creating test data..
    X = rand(2000,2)
    # note that the Y are 0.0/1.0 floats
    Y = hcat(round.(tanh.(0.5 .* X[:,1] + 0.8 .* X[:,2])),
             round.(tanh.(0.5 .* X[:,1] + 0.3 .* X[:,2])),
             round.(tanh.(max.(0.0,-3 .* X[:,1].^2 + 2 * X[:,1] + 0.5 .* X[:,2]))))
    # Creating the NN model...
    l1 = DenseLayer(2,10,f = relu)
    l2 = DenseLayer(10,3,f = x -> (tanh(x) + 1)/2)
    mynn = buildNetwork([l1,l2],squaredCost,name="Multinomial multilabel regression Model")
    # Train of the model...
    train!(mynn,X,Y,epochs=100,batchSize=8)
    # Predictions...
    ŷ = round.(predict(mynn,X))
    (nrec,ncat) = size(Y) 
    # Just a basic accuracy measure. I could think to extend the ConfusionMatrix measures to multi-label classification if needed..
    overallAccuracy = sum(ŷ .== Y)/(nrec*ncat) # 0.999
    

    我最初考虑使用带有可学习beta 参数的softmax,但后来我意识到这种方式是不可能的:模型如何区分Y = [0 0 0]Y = [1 1 1]?因此,我最终得到了一个具有调整的tanh 函数的层,该函数保证我“独立”地为每个标签提供 [0,1] 范围内的输出,并将阈值设置为 0.5,即最大化损失的值(在 BetaML如果最后一层有多个节点,则输出已经是一个向量。

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 2019-04-01
      • 2019-03-22
      • 2019-02-26
      • 2013-07-23
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多