InfoGainLoss导致准确性和丢失0

时间:2017-07-13 07:05:48

标签: neural-network computer-vision deep-learning caffe pycaffe

我正在尝试用类不平衡训练网络进行语义分割。为了解释这一点,我试图实现InfoGainLoss图层并指定infogain_matrix,因为我发布了here,其中我使用1-频率(类)为每个对角线元素。
然而,当训练net时,即使使用低base_lr,准确度和损失也会立即收敛到0,并且网络将所有内容标记为0级(“未知”)。我现在的问题是infogain_matrix是否应该在我链接的帖子中指定,如果是这样,其他原因可能是网络的这种异常行为(我预计会丢失0准确度1或丢失INF准确度0)。

编辑:
因此,当我使用SoftMaxWithLoss层而不是InfoGainLoss运行Net时,它立即开始将所有内容归类为最具代表性的类(class1具有90%),并且不再更改。我现在的猜测是我错误地为infogain_matrix配置了lmdb。有人知道是否必须为caffe数据层指定lmdb的dtype(images和infogain_matrix存储为float32),虽然caffe documentation for the layer没有这样说吗?或者,caffe数据层对lmdb的期望是什么? 使用从here获取/修改的代码生成lmdbs,但是对于图像,意味着先前执行减法。我在python中测试了lmdb读数,这里我必须指定dtype,否则重塑为原始矩阵尺寸抛出错误。

EDIT2:
所以错误确实存在于lmdb定义中,对于dtype = float,数据需要附加到datum.float_data而不是datum.data,请参阅here。现在一切看起来都没问题,准确性和损失都没有更好的储物柜:)。

1 个答案:

答案 0 :(得分:2)

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

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

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_data,caffe不会抛出错误,但会导致像精度和丢失这样的严重行为都变为0(因为infogain_mat H可能是由于dtype不匹配,某些类为0)