代码之家  ›  专栏  ›  技术社区  ›  ORippler

InfoGainLoss导致准确性和0的损失

  •  3
  • ORippler  · 技术社区  · 8 年前

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

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

    编辑2:
    here .现在一切看起来都很好,准确度和损失都不奇怪:)

    1 回复  |  直到 8 年前
        1
  •  2
  •   ORippler    8 年前

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

    所以代码来自 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())
    

    问题是,如果将浮点数据错误地附加到数据中,caffe不会抛出错误。数据而不是基准。float_数据,但会导致异常行为,如精度和损失都变为0(因为对于某些类,由于数据类型不匹配,infogain_mat H可能为0)

    推荐文章