【问题标题】:InfoGainLoss leads to accuracy and loss of 0InfoGainLoss 导致准确率和损失为 0
【发布时间】:2017-12-17 19:45:00
【问题描述】:

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

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

编辑2:
所以错误确实在 lmdb 定义中,至于 dtype=float,需要将数据附加到 datum.float_data 而不是 datum.data,请参阅here。现在一切看起来都还不错,而且准确度和损失都不是储物柜古怪的:)

【问题讨论】:

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


    【解决方案1】:

    错误在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(因为 infogain_mat H 可能是由于 dtype 不匹配,某些类为 0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2023-03-23
      • 2018-06-10
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多