我目前正在按照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]];
最终代码: