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