TensorFlow: SparseSoftmaxCrossEntropyWithLogits 错误?

我目前正在按照TensorFlow的入门指南进行学习,但遇到了一个难题。我没有找到任何关于我看到的错误的支持信息,而且我确信我的代码与他们网站上的示例没有太大偏差。

代码:

import tensorflow as tf;import tensorflow.contrib.eager as tfe;tf.enable_eager_execution();iris_dataset_url = 'http://download.tensorflow.org/data/iris_training.csv';iris_csv_file = tf.keras.utils.get_file('iris_dataset.csv', iris_dataset_url);iris_dataset_tests_url = 'http://download.tensorflow.org/data/iris_test.csv';iris_tests_csv_file = tf.keras.utils.get_file('iris_tests_dataset.csv', iris_dataset_tests_url);def iris_data_parse_line(line):    default_feature = [[0.0], [0.0], [0.0], [0.0], [0.0]];    parsed_line = tf.decode_csv(line, default_feature);    features = tf.reshape(parsed_line[:-1], shape=(4,), name="features");    label = tf.reshape(parsed_line[-1], shape=(), name="label");    return features, label;def prediction_loss_diff(features, label, model):    predicted_label = model(features);    return tf.losses.sparse_softmax_cross_entropy(label, predicted_label);def gradient_tune(features, targets, model):    with tf.GradientTape() as tape:        prediction_loss = prediction_loss_diff(features, targets, model);    return tape.gradient(prediction_loss, model.variables);def train_model(training_dataset, model, optimizer):    train_loss_results = []    train_accuracy_results = []    rounds = 201;    for round_num in range(rounds):        epoch_loss_avg = tfe.metrics.Mean();        epoch_accuracy = tfe.metrics.Accuracy();        for features, label in training_dataset:            gradients = gradient_tune(features, label, model);            optimizer.apply_gradients(                    zip(gradients, model.variables),                    global_step=tf.train.get_or_create_global_step());def main():    print("TensorFlow version: {}".format(tf.VERSION));    print("Eager execution: {}".format(tf.executing_eagerly()));    iris_dataset = (tf.data.TextLineDataset(iris_csv_file)                           .skip(1)                           .map(iris_data_parse_line)                           .shuffle(1000)                           .batch(32));    model = tf.keras.Sequential([        tf.keras.layers.Dense(10, activation="relu", input_shape=(4,)),        tf.keras.layers.Dense(10, activation="relu"),        tf.keras.layers.Dense(3)    ]);    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01);    train_model(iris_dataset, model, optimizer);if __name__ == "__main__":    main();

错误似乎发生在prediction_loss_diff函数中。它应该使用sparse_softmax_cross_entropy损失函数。然而,我一直收到以下错误:

Traceback (most recent call last):  File "main.py", line 69, in <module>    main();  File "main.py", line 66, in main    train_model(iris_dataset, model, optimizer);  File "main.py", line 41, in train_model    gradients = gradient_tune(features, label, model);  File "main.py", line 27, in gradient_tune    prediction_loss = prediction_loss_diff(features, targets, model);  File "main.py", line 23, in prediction_loss_diff    return tf.losses.sparse_softmax_cross_entropy(label, predicted_label);  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/losses/losses_impl.py", line 853, in sparse_softmax_cross_entropy    name="xentropy")  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py", line 2050, in sparse_softmax_cross_entropy_with_logits    precise_logits, labels, name=name)  File "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/gen_nn_ops.py", line 7504, in sparse_softmax_cross_entropy_with_logits    _six.raise_from(_core._status_to_exception(e.code, message), None)  File "<string>", line 2, in raise_fromtensorflow.python.framework.errors_impl.InternalError: Could not find valid device for node name: "SparseSoftmaxCrossEntropyWithLogits"op: "SparseSoftmaxCrossEntropyWithLogits"input: "dummy_input"input: "dummy_input"attr {  key: "T"  value {    type: DT_FLOAT  }}attr {  key: "Tlabels"  value {    type: DT_FLOAT  }}

我不确定“找不到有效节点设备”是什么意思,但我猜测这可能与底层的C包装有关?我的输入有问题吗?任何帮助都将不胜感激,谢谢。


回答:

这是个输入问题。奇怪的是,错误消息并未完全指明具体的冲突之处。然而,在对比了入门指南的代码和我的代码后,我发现我的default_feature变量初始化为所有浮点数。我需要将标签设置为整数以正确标记数据。因为sparse_softmax_cross_entropy函数的输出是一个标签,即int32/64,它不能与浮点数进行比较。这会导致与C绑定相关的异常错误,并导致所述的异常。关于sparse_softmax_cross_entropy损失函数的更多信息。

因此,不是[[0.0], [0.0], [0.0], [0.0], [0.0]];而应该是[[0.0], [0.0], [0.0], [0.0], [0]];

最终代码:

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注