多标签分类中的奇怪准确率问题keras

我有一个多标签分类问题,我使用了以下代码,但在第一个epoch中验证准确率就跳到了99%,这很奇怪,因为数据的复杂性很大,输入特征是从inception模型(pool3:0层)中提取的2048个特征,标签是[1000],(这里是一个包含特征和标签样本的文件链接:https://drive.google.com/file/d/0BxI_8PO3YBPPYkp6dHlGeExpS1k/view?usp=sharing),我在这里做错了什么吗?

注意:标签是稀疏向量,仅包含1到10个条目为1,其余为零

model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy']) 

预测的输出全是零!

我在训练模型时做错了什么导致预测出现问题?

#输入是特征文件和标签文件def generate_arrays_from_file(path ,batch_size=100):x=np.empty([batch_size,2048])y=np.empty([batch_size,1000])while True:    f = open(path)    i = 1      for line in f:        # 从文件的每一行创建输入数据和标签的Numpy数组        words=line.split(',')        words=map(float, words[1:])        x_= np.array(words[0:2048])        y_=words[2048:]        y_= np.array(map(int,y_))        x_=x_.reshape((1, -1))        #print np.squeeze(x_)        y_=y_.reshape((1,-1))        x[i]= x_        y[i]=y_        i += 1        if i == batch_size:            i=1            yield (x, y)    f.close()model = Sequential()model.add(Dense(units=2048, activation='sigmoid', input_dim=2048))model.add(Dense(units=1000, activation="sigmoid", kernel_initializer="uniform"))model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])model.fit_generator(generate_arrays_from_file('train.txt'),                validation_data= generate_arrays_from_file('test.txt'),                validation_steps=1000,epochs=100,steps_per_epoch=1000,                   verbose=1)

回答:

我认为准确率的问题在于你的输出是稀疏的。

Keras使用以下公式计算准确率:

K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)

所以,在你的情况下,只有1到10个非零标签,全部预测为0的准确率将达到99.9%到99%。

至于模型无法学习的问题,我认为问题在于你使用了sigmoid作为最后的激活函数,并使用0或1作为输出值。这是一个不好的做法,因为要让sigmoid返回0或1,它的输入值必须非常大或非常小,这会导致网络的权重绝对值变得非常大。此外,由于每个训练输出中1的数量远少于0,网络很快就会达到一个静止点,简单地输出全零(在这种情况下,损失也不会很大,大约在0.016到0.16之间)。

你可以做的就是缩放你的输出标签,使它们介于(0.2, 0.8)之间,这样网络的权重就不会变得太大或太小。或者,你可以使用relu作为激活函数。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注