1

私は、「softmax_cross_entropy_with_logits」を 147 クラスの問題のコスト関数の一部として機能させることに取り組んできました。「sigmoid_cross_entropy_with_logits」で動作するコードがありますが、softmax に移行したいと考えています。

ランク 3 からランク 2 に変更してコードを機能させるために、さまざまな試みを何度も試みましたが (役に立ちませんでした)、立ち往生しました。ノートブックでいくつかのおもちゃのコードを試してみましたが、softmax_cross .... はエラーをアサートしません。また、float32 を float64 にキャストしようとしましたが (ノートブックの例では 64 ビットを使用して動作していたため)、それでもエラーがアサートされました。

おもちゃのコードは次のとおりです。

y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863  ,  0.61939586,  0.15274114],
#        [ 0.49674623,  0.20196195,  0.30129182]])

y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0.,  1.,  0.],
#        [ 0.,  0.,  1.]])

loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 ,  1.19967598])

cross_ent = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
print sess.run(cross_ent)
#[ 0.4790107   1.19967598]
print y_hat
#Tensor("Const:0", shape=(2, 3), dtype=float64)
print y_true
#Tensor("Const_1:0", shape=(2, 3), dtype=float64)
total_loss_2 = tf.reduce_mean(cross_ent)
sess.run(total_loss_2)
# 0.83934333897877922

これが私のコードフラグメントです:(サイズは以下にエラーで印刷されています)

        self.error0        = tf.nn.softmax_cross_entropy_with_logits(tf.to_double(self.outputSplit0), tf.to_double(self.YactSplit0), "SoftMax0")
        self.error1        = tf.nn.softmax_cross_entropy_with_logits(self.outputSplit1, self.YactSplit1, "SoftMax1")
        self.error        = self.error0 + self.error1

私がやろうとしているのは、結果ごとに2つのエンコードされた「単語」があるため、単語ごとに個別にエラーを計算しようとしていますが、まだ機能しませんでした. 上記の最初の行でエラーが発生します。

self.outputSplit0 Tensor("LSTM/Reshape_2:0", shape=(8000, 147), dtype=float32)
self.YactSplit0 Tensor("LSTM/Reshape_4:0", shape=(8000, 147), dtype=float32)
Traceback (most recent call last):
  File "modelbuilder.py", line 352, in <module>
    brain.create_variables()
  File "/home/greg/Model/LSTM_qnet.py", line 58, in create_variables
    self.error0        = tf.nn.softmax_cross_entropy_with_logits(tf.to_double(self.outputSplit0), tf.to_double(self.YactSplit0), "SoftMax0")
  File "/home/greg/tensorflow/_python_build/tensorflow/python/ops/nn_ops.py", line 1436, in softmax_cross_entropy_with_logits
    precise_logits = _move_dim_to_end(precise_logits, dim, input_rank)
  File "/home/greg/tensorflow/_python_build/tensorflow/python/ops/nn_ops.py", line 1433, in _move_dim_to_end
    0, [math_ops.range(dim_index), math_ops.range(dim_index + 1, rank),
  File "/home/greg/tensorflow/_python_build/tensorflow/python/ops/math_ops.py", line 1094, in range
    assert all(arg.dtype in dtype_hierarchy for arg in [start, limit, delta])
AssertionError

ここで何が起こっているのでしょうか?エラーは「範囲」機能によるものと思われますが、何が間違っているのかわかりません。

4

1 に答える 1