Neural network InfoGainLoss会导致0的准确性和损失

Neural network InfoGainLoss会导致0的准确性和损失,neural-network,computer-vision,deep-learning,caffe,pycaffe,Neural Network,Computer Vision,Deep Learning,Caffe,Pycaffe,我正在尝试训练一个类不平衡的语义分割网络。为了说明这一点,我尝试实现InfoGainLoss层,并指定了发布的infogain_矩阵,在这里,我为每个对角线元素使用了1个频率(类)。 然而,当训练时,准确度和损失都会立即收敛到0,即使基数较低,网络也会将所有内容标记为0类(“未知”)。我现在的问题是,是否应该在我链接的帖子中指定infogain_矩阵,如果是,那么网络的这种异常行为还有什么其他原因(我预计损失0精度1或损失INF精度0) 编辑: 因此,当我使用SoftMaxWithLoss层而不

我正在尝试训练一个类不平衡的语义分割网络。为了说明这一点,我尝试实现InfoGainLoss层,并指定了发布的infogain_矩阵,在这里,我为每个对角线元素使用了1个频率(类)。
然而,当训练时,准确度和损失都会立即收敛到0,即使基数较低,网络也会将所有内容标记为0类(“未知”)。我现在的问题是,是否应该在我链接的帖子中指定infogain_矩阵,如果是,那么网络的这种异常行为还有什么其他原因(我预计损失0精度1或损失INF精度0)

编辑:
因此,当我使用SoftMaxWithLoss层而不是InfoGainLoss来运行网络时,它立即开始将所有内容分类为最具代表性的类(class1占90%),并且不再改变。我现在的猜测是,我为infogain_矩阵配置的lmdb不正确。是否有人知道是否必须为caffe数据层指定lmdb的数据类型(图像和infogain_矩阵存储为float32),尽管没有这样说?或者,caffe数据层希望lmdb提供什么类型的数据?
LMDB是使用从中获取/修改的代码生成的,但对于图像,首先执行平均减法。我在python中测试了lmdb读出,这里我必须指定数据类型,否则会将错误重塑为原始矩阵维度

编辑2:

因此,错误确实存在于lmdb定义中,对于dtype=float,需要将数据附加到datum.float_数据,而不是datum.data,请参阅。现在一切看起来都正常了,精度和损失都没有问题:)

错误在于lmdb定义中,对于dtype=float,需要将数据附加到datum.float_数据,而不是datum.data(需要将其保留为空,以便caffe自动扫描datum.float_数据)

因此,使用python生成lmdb数据集的代码可以修改如下:

with env.begin(write=True) as txn:
    # txn is a Transaction object
    for i in range(N):
        datum = caffe.proto.caffe_pb2.Datum()
        datum.channels = X.shape[1]
        datum.height = X.shape[2]
        datum.width = X.shape[3]
        datum.float_data.extend(X[i].astype(float).flat)
        datum.label = int(y[i])
        str_id = '{:08}'.format(i)
        # The encode is only essential in Python 3
        txn.put(str_id.encode('ascii'), datum.SerializeToString())
问题是,如果您错误地将浮点数据附加到datum.data而不是datum.float_数据,caffe不会抛出错误,但会导致异常行为,如精度和损失都变为0(因为对于某些类,由于数据类型不匹配,infogain_mat H可能为0)