復制錯誤的最簡單示例:
import tensorflow as tf
def loss(y, logits):
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits))
return loss
Input = tf.keras.layers.Input(dtype=tf.float32, shape=(20,), name="X")
hidden = tf.keras.layers.Dense(40, activation=tf.keras.activations.relu, name="hidden1")(Input)
logits = tf.keras.layers.Dense(10, name="outputs")(hidden)
optimizer = tf.keras.optimizers.Adam()
model = tf.keras.Model(inputs=Input, outputs=logits)
model.summary()
model.compile(optimizer=optimizer, loss=loss)
我知道,在這種情況下,模型的輸出是 (batch_size, 10) 而我的標簽具有 (batch_size,) 尺寸。這就是我使用tf.nn.sparse_softmax_cross_entropy_with_logits.
在我可以為此模型提供任何型別的標簽之前,編譯失敗并出現以下錯誤:
C:\Stas\Development\Anaconda3\lib\site-packages\tensorflow_core\python\ops\nn_ops.py in sparse_softmax_cross_entropy_with_logits(_sentinel, labels, logits, name)
3445 raise ValueError("Rank mismatch: Rank of labels (received %s) should "
3446 "equal rank of logits minus 1 (received %s)." %
-> 3447 (labels_static_shape.ndims, logits.get_shape().ndims))
3448 if (static_shapes_fully_defined and
3449 labels_static_shape != logits.get_shape()[:-1]):
ValueError: Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).
經過一番調查,我看到編譯失敗,因為 tensorflow 以某種方式認為我的“target_output”的形狀為(None,None),而我的輸出的形狀為(None,10),所以由于維度數相等,交叉熵稀疏不能應用。
我了解到,在 TF 2.1 中,可以直接將 target_output 作為引數進行編譯,而現在這是不可能的。
我繼續這樣做的正確方法是什么?
uj5u.com熱心網友回復:
根據檔案,您只需要確保您的標簽具有形狀[batch_size]。這是一個作業示例tf.squeeze:
import tensorflow as tf
def loss(y, logits):
y = tf.squeeze(y, axis=-1)
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits))
return loss
Input = tf.keras.layers.Input(dtype=tf.float32, shape=(20,), name="X")
hidden = tf.keras.layers.Dense(40, activation=tf.keras.activations.relu, name="hidden1")(Input)
logits = tf.keras.layers.Dense(10, name="outputs")(hidden)
optimizer = tf.keras.optimizers.Adam()
model = tf.keras.Model(inputs=Input, outputs=logits)
model.summary()
model.compile(optimizer=optimizer, loss=loss)
x = tf.random.normal((50, 20))
y = tf.random.uniform((50, 1), maxval=10, dtype=tf.int32)
model.fit(x, y, epochs=2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452269.html
