7

だから、マービン・タイヒマンのテンソルフロー-fcnに基づいて、完全な畳み込みネットワーク(FCN)の構築に取り組んでいます

私の入力画像データは、とりあえず750x750x3のRGB画像です。ネットワークを実行した後、損失の計算に形状 [batch_size, 750,750,2] のロジットを使用します。

これは二項分類です。ここには 2 つのクラスがあり、[0, 1] のラベル ([batch_sizex750x750] の形状) があります。これらは以下の損失関数に入ります。

def loss(logits, labels, num_classes):
with tf.name_scope('loss mine'):
    logits = tf.to_float(tf.reshape(logits, [-1, num_classes]))

    #CHANGE labels type to int, for sparse_softmax...
    labels = tf.to_int64(tf.reshape(labels, [-1]))

    print ('shape of logits: %s' % str(logits.get_shape()))
    print ('shape of labels: %s' % str(labels.get_shape()))

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
    tf.add_to_collection('losses', cross_entropy)

    loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss

これらは、再形成後のロジットとラベルの形状です。

shape of logits: (562500, 2)
shape of labels: (562500,)

そしてここで、次のような ValueError がスローされます。

Shapes () and (562500,) are not compatible

以下の完全なトレースバック:

  File "train.py", line 89, in <module>
loss_train = loss.loss(logits, data.train.labels, 2)
File "/tensorflow-fcn/loss.py", line 86, in loss
loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/gen_math_ops.py", line 88, in add_n
result = _op_def_lib.apply_op("AddN", inputs=inputs, name=name)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op
op_def=op_def)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2262, in create_op
set_shapes_for_outputs(ret)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1702, in      set_shapes_for_outputs
shapes = shape_func(op)
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 1557, in _AddNShape
merged_shape = merged_shape.merge_with(input_.get_shape())
File "/tensorflow/lib/python2.7/site-packages/tensorflow/python/framework/tensor_shape.py", line 570, in merge_with
(self, other))
ValueError: Shapes () and (562500,) are not compatible

提案?私の実装はtf.add_to_collection('losses', cross_entropy)間違っていますか?

アップデート:

cross_entropy上記のコードを損失として直接返すことにより、ピクセル全体で合計せずに(またはそう思う)これを実行しようとしました。

うまくいったようです。(現在ValueError、トレーニング オプティマイザ関数から がスローされ、次のように記述さNo gradients provided for any variableれています。

更新 2:

上記 (勾配がないため ValueError に関して) は些細なことでした。hereで述べたように、このメッセージは通常、定義された tf.Variable オブジェクトと最小化されている損失テンソルの間にパスがない場合に発生します。

ただし、の使用に関する最初の問題は解決しtf.add_nません。TensorFlow で Graph コレクションがどのように機能するかの仕組みに関係していると思います。変数を初期化すると、エラーは次のようになります。

Shapes () and (?,) are not compatible
4

1 に答える 1

3

閉鎖。損失関数のコードに平均合計が欠けていたことが判明しました。この問題に直面している他の人は、次のように損失関数を変更すると、正常に機能するはずです。

    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels, name='Cross_Entropy')
    cross_entropy_mean = tf.reduce_mean(cross_entropy, name='xentropy_mean')
    tf.add_to_collection('losses', cross_entropy_mean)

    loss = tf.add_n(tf.get_collection('losses'), name='total_loss')
return loss 
于 2016-07-24T02:04:43.190 に答える