多标签分类keras中的奇怪准确性

时间:2017-06-29 19:50:50

标签: machine-learning keras sparse-matrix multilabel-classification

我有一个多标签分类问题,我使用了下面的代码,但是在第一个时期,验证准确度跃升到99%,由于输入要素是从初始模型中提取的2048,因此数据的复杂性很奇怪(pool3:0) )图层和标签是[1000],(这里是文件的链接包含要素和标签的样本:https://drive.google.com/file/d/0BxI_8PO3YBPPYkp6dHlGeExpS1k/view?usp=sharing),  我在这里做错了什么?

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

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

预测输出为零!

我在训练模型以打扰预测方面做了什么错误?

#input is the features file and labels file

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:
        # create Numpy arrays of input data
        # and labels, from each line in the file
        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)

2 个答案:

答案 0 :(得分:4)

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

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,它所获得的值必须非常大或非常小,这反映在具有非常大(绝对值)权重的网上。此外,由于在每个训练输出中远远少于0,网络将很快到达静止点,在该静止点中它简单地输出全零(在这种情况下损失也不是很大,应该在0.016~0.16左右)。

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

答案 1 :(得分:1)

您是否尝试使用余弦相似度作为损失函数?

我遇到了相同的多标签+高尺寸问题。

余弦距离考虑了模型输出(预测)和所需输出(真实类)矢量的方向。

它是两个向量之间的归一化点积。

在喀拉拉邦,cosine_proximity函数为-1 * cosine_distance。意味着-1对应于两个具有相同大小和方向的向量。