我目前正在处理一个数据集,其中类之间的边界定义得不是很好。我不想使用常规分类,因为这些类的细微差别重叠可能无法使用该设置来表示。
我在PyTorch中看到过类似的设置,其中使用了二进制交叉熵损失函数,但除此之外,我不确定需要做些什么才能将我的问题从分类转变为Flux中的多标签分类。从Flux.jl docs上看,我可能想要使用自定义拆分标签?
发布于 2021-09-15 13:21:05
这个问题让我思考如何在我自己的ML库BetaML中实现多标签分类,最终它变得相对容易:
(编辑:只需使用几个DenseLayer和第二层的激活函数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中,如果最后一层有多个节点,则输出已经是一个向量)。
https://stackoverflow.com/questions/69164122
复制相似问题