如何处理多标签分类问题中的 JSON 文件?
How can I handle a JSON File in a multi label classification problem?
我有一个多标签问题。我已经阅读了很多教程,并且都使用 CSV。但是我有一个JSON。一个图像可以有一到三个标签。这是 JSON 的样子:{"PIC_NAME": ["Label1"], "PIC_NAME": ["Label2", "Label6"], "PIC_NAME": ["Label20"], "PIC_NAME": ["Label4"], "PIC_NAME": ["Label5"], "PIC_NAME": ["Label1"], "PIC_NAME": ["Label15"], ...
CSV 使用二进制标签。但我只有字符串。有 20 种不同的标签。如果像教程中那样,那么一张图片应该用23个二进制数来标记。如果标签(例如 Label1)为真,则有一个 1,所有其他标签都设置为 0。我使用 Keras。
有谁知道如何用 JSON 解决问题?这是我阅读过的教程示例:https://www.analyticsvidhya.com/blog/2019/04/build-first-multi-label-image-classification-model-python/
例如,我们有一张有猫、狗和鸟的照片。图为一只狗和一只鸟。那么它应该是这样的:0 1 1。因为图中没有猫,所以第一个值是0。我希望它能像上面教程中的那样
如果我理解你的问题,你想用 [1 0 0 ... ] 替换 ["Label1"],即对你的标签进行热编码?
如果是,您可以查看 this 那里存在多标签问题。
所以你可以做这样的事情:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("blue", "jeans"),("blue", "dress"),("red", "dress"),("red", "shirt"),
("blue", "shirt"),("black", "jeans")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
它打印:
然后你的标签就被一次性编码了。
在您的问题中,您将 ["Label2"、"Label6"] 而不是衣服。
编辑:如果您只有一个标签而不是两个,它也可以工作:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("blue",),("blue", "dress"),("red", "dress"),("red", "shirt"),
("blue", "shirt"),("black", "jeans")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
要获得 类 的索引,您可以使用:
print(mlb.classes_)
编辑 2:
以你的例子为例:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("Label1",),("Label2",),("Label3",),("Label4","Label1"),
("Label4","Label5")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
print(mlb.classes_)
编辑 3:
这些将起作用:
labels = [["Label1"],["Label2"],["Label3"],["Label4","Label1"],
["Label4","Label5"]]
labels = [("Label1",),("Label2",),("Label3",),("Label4","Label1"),
("Label4","Label5")]
这不会(没有逗号):
labels = [("Label1"),("Label2"),("Label3"),("Label4","Label1"),
("Label4","Label5")]
我有一个多标签问题。我已经阅读了很多教程,并且都使用 CSV。但是我有一个JSON。一个图像可以有一到三个标签。这是 JSON 的样子:{"PIC_NAME": ["Label1"], "PIC_NAME": ["Label2", "Label6"], "PIC_NAME": ["Label20"], "PIC_NAME": ["Label4"], "PIC_NAME": ["Label5"], "PIC_NAME": ["Label1"], "PIC_NAME": ["Label15"], ...
CSV 使用二进制标签。但我只有字符串。有 20 种不同的标签。如果像教程中那样,那么一张图片应该用23个二进制数来标记。如果标签(例如 Label1)为真,则有一个 1,所有其他标签都设置为 0。我使用 Keras。
有谁知道如何用 JSON 解决问题?这是我阅读过的教程示例:https://www.analyticsvidhya.com/blog/2019/04/build-first-multi-label-image-classification-model-python/
例如,我们有一张有猫、狗和鸟的照片。图为一只狗和一只鸟。那么它应该是这样的:0 1 1。因为图中没有猫,所以第一个值是0。我希望它能像上面教程中的那样
如果我理解你的问题,你想用 [1 0 0 ... ] 替换 ["Label1"],即对你的标签进行热编码?
如果是,您可以查看 this 那里存在多标签问题。
所以你可以做这样的事情:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("blue", "jeans"),("blue", "dress"),("red", "dress"),("red", "shirt"),
("blue", "shirt"),("black", "jeans")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
它打印:
然后你的标签就被一次性编码了。
在您的问题中,您将 ["Label2"、"Label6"] 而不是衣服。
编辑:如果您只有一个标签而不是两个,它也可以工作:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("blue",),("blue", "dress"),("red", "dress"),("red", "shirt"),
("blue", "shirt"),("black", "jeans")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
要获得 类 的索引,您可以使用:
print(mlb.classes_)
编辑 2:
以你的例子为例:
from sklearn.preprocessing import MultiLabelBinarizer
labels = [("Label1",),("Label2",),("Label3",),("Label4","Label1"),
("Label4","Label5")]
mlb = MultiLabelBinarizer()
labels = mlb.fit_transform(labels)
print(labels)
print(mlb.classes_)
编辑 3:
这些将起作用:
labels = [["Label1"],["Label2"],["Label3"],["Label4","Label1"],
["Label4","Label5"]]
labels = [("Label1",),("Label2",),("Label3",),("Label4","Label1"),
("Label4","Label5")]
这不会(没有逗号):
labels = [("Label1"),("Label2"),("Label3"),("Label4","Label1"),
("Label4","Label5")]