2017-07-13 39 views
3

私はクラスインバランスを使ったセマンティックセグメンテーションのためにネットをトレーニングしようとしています。これを説明するために、私はInfoGainLossレイヤーを実装しようとしましたが、代わりにhereとして投稿されたinfogain_matrixを指定しました。ここでは各対角要素に対して1周波数(クラス)を使用しました。
しかし、netをトレーニングすると、精度と損失の両方がbase_lrが低くてもすぐに0に収束し、ネットラベルではすべてがクラス0(「不明」)になります。私の質問は今、私がリンクしているポストのようにinfogain_matrixを指定する必要があるかどうかです。もしそうならば、ネットの異常な振る舞いには他に何らかの理由があります(私は損失0精度1または損失INF精度0のいずれかを期待しました)。InfoGainLossは精度と損失を0にします

編集:
は、私が代わりにInfoGainLossのSoftMaxWithLoss層とネットを実行するときに、それはすぐに最も代表的なクラス(90%とのClass1)としてすべてを分類するために開始し、もはや変更されません。私の推測では、infogain_matrixのlmdbが正しく構成されていないということです。 caffe documentation for the layerはそう言っていませんが、誰かがcaffeデータレイヤのlmdbのdtypeを指定する必要があるかどうかを知っていますか(画像とinfogain_matrixはfloat32として格納されます)?また、caffeデータレイヤーがlmdbから期待しているdtypesは何ですか? から取られ/変更されたコードを使用して、lmdbsが生成されたが、画像平均の減算は、優先的に実行された。私はPythonでlmdbのreadoutをテストしました。ここではdtypeを指定しなければなりませんでした。さもなければ元の行列の次元にエラーが発生しました。

EDIT2:
ので間違いは確かDTYPE =フロート用として、データがhereを参照してください、代わりにdatum.dataのdatum.float_dataに追加する必要があり、lmdb定義にありました。今度はすべてが大丈夫で、精度と損失はロッカーではありません:)

答えて

2

dtype = floatの場合、間違いはdatm.dataの代わりにdatum.float_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にfloatデータを追加した場合、カフェは、エラーをスローしません。精度と損失の両方が0になるような振る舞いになります(dtypeの不一致により、infogain_mat Hが特定のクラスで0になる可能性があります)

関連する問題