私は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に明示しています。
ご協力いただければ幸いです。ありがとう!
バランスのとれていないクラスでミニバッチを使用する予定がある場合でも、グローバルクラスの統計情報で重み付けを行う必要がありますか?私はそれがミニバッチ内のクラス統計によって重み付けするのが理にかなっていると思ったでしょうか?計算されたグラジエントは、そのミニバッチのためのものなので、グローバルなクラスの統計に気を付けるべきではありません。 – Karnivaurus
あなたは良い点を作っています。 1つは、ミニバッチがより広いクラスの分布からサンプリングされるためです。あなたがミニバッチでウエイトしていた場合、そのウエイトは完全な反復でより広いディストリビューションのウエイトに収束します。ですから、class_weightsを1回だけ計算するほうが効率的だと考えています。私はこれのために引用のいくつかの種類を見つけることができたらいいのに、これまでのことはできません... –