Arrays 如何为KERAS多标签问题提供数据生成器?

Arrays 如何为KERAS多标签问题提供数据生成器?,arrays,machine-learning,keras,deep-learning,multilabel-classification,Arrays,Machine Learning,Keras,Deep Learning,Multilabel Classification,我正在研究KERAS的多标签分类问题。 当我像这样执行代码时,会出现以下错误: ValueError:检查目标时出错:预期激活\u 19有2个维度,但得到了形状为(32,6,6)的数组。 这是因为我在标签词典中的列表中充满了“0”和“1”,正如我最近了解到的那样,这不适合return语句中的keras.utils.to_category。softmax也不能处理多个“1” 我想我首先需要一个标签编码器,然后对标签进行一个热编码,以避免标签中出现多个“1”,这与softmax不匹配 我希望有人能给

我正在研究KERAS的多标签分类问题。 当我像这样执行代码时,会出现以下错误:

ValueError:检查目标时出错:预期激活\u 19有2个维度,但得到了形状为(32,6,6)的数组。

这是因为我在标签词典中的列表中充满了“0”和“1”,正如我最近了解到的那样,这不适合return语句中的keras.utils.to_category。softmax也不能处理多个“1”

我想我首先需要一个标签编码器,然后对
标签
进行一个热编码,以避免标签中出现多个“1”,这与softmax不匹配

我希望有人能给我一个如何预处理或转换标签数据的提示,以修复代码。我会非常感激的。 即使是一段代码片段也会很棒

csv如下所示:

Filename  label1  label2  label3  label4  ...   ID
abc1.jpg    1       0       0       1     ...  id-1
def2.jpg    0       1       0       1     ...  id-2
ghi3.jpg    0       0       0       1     ...  id-3
...

由于您已经将标签作为0和1的21个元素的向量,因此不应在函数
\u数据生成(self,list\u id\u temp)
中使用
keras.utils.to\u category
。只需返回
X
y

好的,我有一个解决方案,但我不确定这是最好的

from sklearn import preprocessing #for LAbelEncoder


labels_list = [x[1] for x in labels.items()] #get the list of all sequences

def convert(list):  
    res = int("".join(map(str, list)))

    return res

label_int = [convert(i) for i in labels_list] #Convert each sequence to int 

print(label_int) #E.g : [1,2,3] become 123


le = preprocessing.LabelEncoder()
le.fit(label_int)
labels = le.classes_   #Encode each int to only get the uniques
print(labels)
d = dict([(y,x) for x,y in enumerate(labels)])   #map each unique sequence to an label like 0, 1, 2, 3 ...
print(d)

labels_encoded = [d[i] for i in label_int]  #get all the sequence and encode them with label obtained 
print(labels_encoded)

labels_encoded = to_categorical(labels_encoded) #encode to_cagetorical 
print(labels_encoded)
我想这不是很干净,但它起作用了

你需要改变你的最后一个致密层,使其拥有相当于编码序列长度的神经元

对于预测,您将使用dict“d”将预测值映射到原始序列样式

如果你需要澄清,请告诉我

对于一些测试序列,它为您提供了:

labels = {'id-0': [1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
          'id-1': [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
          'id-2': [0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
          'id-3': [1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
          'id-4': [0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]}

[100100001100000001011, 10100001100000000001, 100001100010000001, 100100001100000001011, 10100001100000000001]
[100001100010000001 10100001100000000001 100100001100000001011]
{100001100010000001: 0, 10100001100000000001: 1, 100100001100000001011: 2}
[2, 1, 0, 2, 1]
[[0. 0. 1.]
 [0. 1. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [0. 1. 0.]]
澄清后编辑: 好的,我读了更多关于这个主题的内容,再次说明
softmax的问题是,它将尝试最大化一个类,同时最小化其他类。
因此,我建议保留21个1和0的数组,但不要使用
Softmax
,而是使用
Sigmoid
(预测每个类0到1之间的概率)和
二进制交叉熵

并使用treshold进行预测:

preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0
preds=model.predict(X_检验)
preds[preds>=0.5]=1

preds[predsi已经试过了,但我的损失越来越大。因此我正在寻找一种不同的方法。无论如何,谢谢!@sebk-Oh,这是一个不同的问题,与你提到的错误无关。没错,错误不会再发生了,但执行仍然不会satisfying@sebk你现在的问题根本没有传达出问题所在m你有想法。请问一个关于损失没有改善的新问题。类似这样的问题对你很有用:嘿,akila,这不是关于损失,更多的是关于我如何以何种方式将数据传递给数据生成器。我的问题是关于我问的预处理“我希望有人能给我一个如何预处理或转换标签数据的提示…”谢谢:)标签用于图像重建。例如,如果标签1(序列中的第一位数字)这意味着,图像中有一座山,如果有一个0,就没有山。如果label2表示太阳,第二个数字是1,那么图像中有一个太阳……我希望这是可以理解的。我想按照您之前提到的评论:从21个标签开始[0,1,2,3,…]然后你对这个数组进行一次热编码,然后把它交给你的网络。我只是不知道如何像你建议的那样准确地塑造我的数据…我昨天晚上也发现了这个sigmoid选项:)。无论如何,代码的性能不如预期的好。我添加了批处理规范,尝试了退出,并多次更改了模型的架构。最好acc的结果是71%,这一点都不令人惊讶……我将检查我的输入数据和hpoe以找到错误……改进性能的一些提示:尝试其他优化器(adam?),查看训练和val损失曲线,以发现潜在的过拟合/欠拟合,改变学习率,增加网络的复杂性(更多conv、更多bloc、剩余bloc、挤压和激发bloc等),添加更多数据,预处理图像(如果尚未完成)…如果您愿意,可以共享您的网络,我可以查看潜在的改进!
preds = model.predict(X_test)
preds[preds>=0.5] = 1
preds[preds<0.5] = 0