2016-04-04 11 views
1

私はTensorFlowに画像分類子を構築しています。私のトレーニングデータにはクラスの不均衡があります。したがって、損失を計算する際には、各クラスの損失をトレーニングデータのそのクラスの逆数で重み付けする必要があります。TensorFlow:グローバルスコープで変数を定義する

だから、ここに私のコードは次のとおりです。

# Get the softmax from the final layer of the network 
softmax = tf.nn.softmax(final_layer) 
# Weight the softmax by the inverse frequency of the weights 
weighted_softmax = tf.mul(softmax, class_weights) 
# Compute the cross entropy 
cross_entropy = -tf.reduce_sum(y_ * tf.log(softmax)) 
# Define the optimisation 
train_step = tf.train.AdamOptimizer(1e-5).minimize(cross_entropy) 

# Run the training 
session.run(tf.initialize_all_variables()) 
for i in range(10000): 
    # Get the next batch 
    batch = datasets.train.next_batch(64) 
    # Run a training step 
    train_step.run(feed_dict = {x: batch[0], y_: batch[1]}) 

私の質問は:私は、グローバルスコープでちょうどtf.constant(...)としてclass_weightsを保存することができますか?または、cross_entropyを計算するときにパラメータとして渡す必要がありますか?

私が思っている理由は、class_weightsがすべてのバッチで異なるということです。したがって、グローバルスコープで定義されたばかりの場合、Tensor Flowグラフが構築されると、class_weightsの初期値が取得され、更新されないことが心配です。一方、weighted_softmaxを計算するときにfeed_dictを使用してclass_weightsを渡すのであれば、最近の更新された値をclass_weightsに使用するようにTensor Flowに明示しています。

ご協力いただければ幸いです。ありがとう!

答えて

1

class_weightsがあると思います。クラス加重は、ミニバッチごとではなく、データセット全体に対して実行する必要があります。

また、別の方法としてサンプリングを検討して、各バッチの各クラスの数が等しくなるようにすることもできます。

+0

バランスのとれていないクラスでミニバッチを使用する予定がある場合でも、グローバルクラスの統計情報で重み付けを行う必要がありますか?私はそれがミニバッチ内のクラス統計によって重み付けするのが理にかなっていると思ったでしょうか?計算されたグラジエントは、そのミニバッチのためのものなので、グローバルなクラスの統計に気を付けるべきではありません。 – Karnivaurus

+1

あなたは良い点を作っています。 1つは、ミニバッチがより広いクラスの分布からサンプリングされるためです。あなたがミニバッチでウエイトしていた場合、そのウエイトは完全な反復でより広いディストリビューションのウエイトに収束します。ですから、class_weightsを1回だけ計算するほうが効率的だと考えています。私はこれのために引用のいくつかの種類を見つけることができたらいいのに、これまでのことはできません... –

関連する問題