InfoGainLoss导致精度和损失为0

InfoGainLoss leads to accuracy and loss of 0

我正在尝试训练网络进行 class 不平衡的语义分割。为了解决这个问题,我尝试实现 InfoGainLoss 层并指定 infogain_matrix 为 posted here,我改为使用 1- frequency(class) 每个对角线元素。
然而,当训练 net 时,准确性和损失立即收敛到 0,即使 base_lr 很低,并且网络将所有内容标记为 class 0 ("unknown")。我现在的问题是 infogain_matrix 是否应该像我链接的 post 中那样指定,如果是的话还有什么其他原因可能导致这种网络异常行为(我预计损失 0 精度 1 或损失 INF精度 0).

编辑:
因此,当我 运行 使用 SoftMaxWithLoss 层而不是 InfoGainLoss 的 Net 时,它立即开始 class 将所有内容都确定为最具代表性的 class(class1 占 90%),并且不再改变。我现在的猜测是我错误地为 infogain_matrix 配置了 lmdb。有人知道是否必须为 caffe 数据层指定 lmdb 的数据类型(图像和 infogain_matrix 存储为 float32),尽管 caffe documentation for the layer 没有这么说吗?或者,caffe 数据层期望从 lmdb 获得什么数据类型?
lmdbs 是使用 here 中的代码 taken/modified 生成的,但对于图像,优先执行均值减法。我在 python 中测试了 lmdb 读数,在这里我必须指定数据类型,否则重塑为原始矩阵尺寸会引发错误。

编辑 2:
所以错误确实在lmdb定义中,至于dtype=float,数据需要附加到datum.float_data而不是datum.data,见here。现在一切看起来都很好,准确度和损失都没有问题 :)

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

因此 here 中用于使用 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_data,caffe 不会抛出错误,但会导致古怪的行为,例如准确度和损失都变为 0(由于 dtype 不匹配,infogain_mat H 对于某些 类 可能为 0)