web-dev-qa-db-ja.com

TensorFlowでシーンラベリングのピクセル単位の分類を実装するにはどうすればよいですか?

GoogleのTensorFlowを使用してディープラーニングモデルに取り組んでいます。モデルはシーンのセグメント化とラベル付けに使用する必要があります。

  1. SiftFlowデータセットを使用しています。これにはのセマンティッククラス256x256ピクセルの画像があります。
  2. その結果、畳み込みとデコンボリューションを使用した最終レイヤーで、次のテンソル(配列)に到達します[256、256、33]
  3. 次に、Softmaxを適用し、結果をサイズ[256、256]のセマンティックラベルと比較します。

質問:最終レイヤーに平均平均またはargmaxを適用して、その形状が[256,256,1]になるようにし、各ピクセルをループして、分類しているかのように分類する必要があります- 256x256インスタンス?答えが「はい」の場合、そうでない場合、他にどのようなオプションがありますか?

17
Gooshan

ソフトマックスを適用してクロスエントロピー損失を使用するには、をそのまま維持する必要がありますサイズbatch_size x 256 x 256 x 33のネットワークの最終出力。したがって、は、ネットワークの出力確率を破壊するため、平均化またはargmaxを意味するを使用できません。

すべてのbatch_size x 256 x 256ピクセルをループし、このピクセルの予測にクロスエントロピー損失を適用する必要があります。これは、組み込み関数tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)を使用すると簡単です。

いくつかの警告 ドキュメントから 以下のコードを適用する前に:

  • 警告:この操作では、効率を上げるために内部でロジットに対してソフトマックスを実行するため、スケールされていないロジットが必要です。ソフトマックスの出力でこの演算を呼び出さないでください。誤った結果が生成されます。
  • ロジットであり、形状[batch_size、num_classes]とdtype(float32またはfloat64のいずれか)である必要があります。
  • ラベルの形状は[batch_size]で、dtypeはint64である必要があります。

秘訣は、関数に必要なバッチサイズとしてbatch_size * 256 * 256を使用することです。 logitslabelsをこの形式に変更します。私が使用するコードは次のとおりです。

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

reshaped_logits = tf.reshape(logits, [-1, 33])  # shape [batch_size*256*256, 33]
reshaped_labels = tf.reshape(labels, [-1])  # shape [batch_size*256*256]
loss = sparse_softmax_cross_entropy_with_logits(reshaped_logits, reshaped_labels)

次に、その損失にオプティマイザを適用できます。


更新:v0.10

documentation of tf.sparse_softmax_cross_entropy_with_logitsは、logitsの任意の形状を受け入れるようになったことを示しているため、テンソルの形状を変更する必要はありません(@chillingerに感謝)。

inputs = tf.placeholder(tf.float32, [batch_size, 256, 256, 3])  # input images
logits = inference(inputs)  # your outputs of shape [batch_size, 256, 256, 33] (no final softmax !!)
labels = tf.placeholder(tf.float32, [batch_size, 256, 256])  # your labels of shape [batch_size, 256, 256] and type int64

loss = sparse_softmax_cross_entropy_with_logits(logits, labels)
12