TensorFlow:SparseSoftmaxCrossEntropyWithLogits错误?

Nat*_*eek 4 python machine-learning tensorflow

我现在正试图按照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();
Run Code Online (Sandbox Code Playgroud)

该错误似乎发生在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_from
tensorflow.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
  }
}
Run Code Online (Sandbox Code Playgroud)

我不确定它是什么意思"它没有找到有效的节点设备",但我认为它可能与低C包装中的某些东西有关?我的投入不好吗?任何帮助都会很棒,谢谢.

Nat*_*eek 19

这是一个输入问题.奇怪的是,错误信息并不能完全了解究竟是什么冲突.但是,回顾一下入门指南和我的代码差异,我注意到我的default_feature变量是用所有浮点数初始化的.我需要我的标签是一个整数来正确标记数据.由于sparse_softmax_cross_entropy函数的输出是一个标签,即int32/64,因此无法与float进行比较.这将导致C绑定发生异常错误,并导致声明的异常.有关sparse_softmax_cross_entropy损失函数的更多信息.

所以,而不是[[0.0], [0.0], [0.0], [0.0], [0.0]];应该[[0.0], [0.0], [0.0], [0.0], [0]];

最终代码:

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]]; #UPDATED SPOT!!!
    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();
Run Code Online (Sandbox Code Playgroud)