我尝试过自己,但无法达到最终目的,这就是为什么在此处发布内容,请指导我。
这是我正在使用的代码
if (mBlogWrapper != null && mBlogWrapper.isNotEmpty()) {
character = mBlogWrapper as MutableList<ABCCharacters>
mutableLiveData.value = character
}
我已附加了一个图像文件,可以清楚地看到我的问题。
因为如果我们遵循这些
等 它们在每个图像上都有多个标签,但就我而言,我有多个标签及其属性。
答案 0 :(得分:0)
如果您的目标是预测' L ',' M '和' H ',则您使用的是不正确的损失函数。您应该使用binary_crossentropy
。在这种情况下,目标的形状将为 batch ×3。
categorical_crossentropy
假定输出为分类分布:一个值的矢量,这些值总和为1。换句话说,您有多种可能,但只有其中一种才是正确的。
binary_crossentropy
假设输出向量中的每个数字都是(有条件的)独立的二进制分布,因此每个数字都在0到1之间,但它们不一定要加一,因为它可以碰巧他们都正确。
如果您的目标是为每个label1,...,label6预测值,则应为每个标签建模分类分布。您有六个标签,每个标签都有3个值,因此需要18个数字(登录)。在这种情况下,目标的形状将为 batch ×6×3。
model.add(Dense(18, activation='none'))
因为您不希望单个分布超过18个值,而是超过6×3个值,所以您需要首先重塑logit:
model.add(Reshape((6, 3))
model.add(Softmax())
答案 1 :(得分:0)
基于以上讨论。这是上述问题的解决方案。 正如我提到的,我们总共有5个标签,每个标签还有另外三个标签,例如(L,M,H)我们可以通过这种方式执行编码
# create a one hot encoding for one list of tags
def custom_encode(tags, mapping):
# create empty vector
encoding=[]
for tag in tags:
if tag == 'L':
encoding.append([1,0,0])
elif tag == 'M':
encoding.append([0,1,0])
else:
encoding.append([0,0,1])
return encoding
所以编码的y矢量看起来像
**Labels Tags Encoded Tags**
Label1 ----> [L,L,L,M,H] ---> [ [1,0,0], [1,0,0], [1,0,0], [0,1,0], [0,0,1] ]
Label2 ----> [L,H,L,M,H] ---> [ [1,0,0], [0,0,1], [1,0,0], [0,1,0], [0,0,1] ]
Label3 ----> [L,M,L,M,H] ---> [ [1,0,0], [0,1,0], [1,0,0], [0,1,0], [0,0,1] ]
Label4 ----> [M,M,L,M,H] ---> [ [0,1,0], [0,1,0], [1,0,0], [0,1,0], [0,0,1] ]
Label5 ----> [M,L,L,M,H] ---> [ [0,1,0], [1,0,0], [1,0,0], [0,1,0], [0,0,1] ]
最后一层就像
model.add(Dense(15)) #because we have total 5 labels and each has 3 tags so 15 neurons will be on final layer
model.add(Reshape((5,3))) # each 5 have further 3 tags we need to reshape it
model.add(Activation('softmax'))