使用TensorFlow训练NN时出错:TypeError:' Series'对象是可变的,因此它们不能被散列

时间:2018-05-18 12:39:43

标签: python python-2.7 pandas tensorflow

是的,我错过了转换目标功能。我尝试以不同方式编写代码,并在导入数据集后立即转换整数中的要素。代码如下:

import math
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import metrics
from tensorflow.python.data import Dataset

FEATURES = ["cap-shape", "cap-surface", "cap-color", "bruises", "odor", "gill-attachment",
                              "gill-spacing", "gill-size", "gill-color", "stalk-shape", "stalk-root",
                              "stalk-surface-above-ring", "stalk-surface-below-ring", "stalk-color-above-ring",
                              "stalk-color-below-ring", "veil-type", "veil-color", "ring-number", "ring-type",
                              "spore-print-color", "population", "habitat"]


def preprocess_features(data):
    selected_features = data[["cap-shape", "cap-surface", "cap-color", "bruises", "odor", "gill-attachment",
                              "gill-spacing", "gill-size", "gill-color", "stalk-shape", "stalk-root",
                              "stalk-surface-above-ring", "stalk-surface-below-ring", "stalk-color-above-ring",
                              "stalk-color-below-ring", "veil-type", "veil-color", "ring-number", "ring-type",
                              "spore-print-color", "population", "habitat"]]
    processed_features = selected_features.copy()
    return processed_features


def preprocess_targets(data):
    output_targets = pd.DataFrame()
    output_targets["class"] = data["class"]
    return output_targets


def construct_feature_columns(features):
    return {tf.feature_column.numeric_column(my_feature) for my_feature in features}


def input_fn(features, targets, batch_size=1, num_epochs=None):
    features = {key: np.array(value) for key, value in dict(features).items()}

    ds = Dataset.from_tensor_slices((features, targets))
    ds = ds.batch(batch_size).repeat(num_epochs)

    features, labels = ds.make_one_shot_iterator().get_next()
    return features, labels


def train_nn_classifier_model(learning_rate, steps, batch_size, hidden_units, training_examples, training_targets,
                              validation_examples, validation_targets):
    global validation_root_mean_squared_error, training_root_mean_squared_error
    periods = 10
    steps_per_period = steps / periods

    my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
    my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
    train_dnn_classifier = tf.estimator.DNNClassifier(feature_columns=construct_feature_columns(training_examples),
                                                      hidden_units=hidden_units, optimizer=my_optimizer)

    training_input_fn = lambda: input_fn(training_examples, training_targets, batch_size)
    predict_training_input_fn = lambda: input_fn(training_examples, training_targets, num_epochs=1)
    predict_validation_input_fn = lambda: input_fn(validation_examples, validation_targets, num_epochs=1)

    print "Training model..."
    # Error array
    training_rmse = []
    validation_rmse = []
    for period in xrange(0, periods):
        train_dnn_classifier.train(input_fn=training_input_fn(), steps=steps_per_period)

        training_predictions = train_dnn_classifier.predict(input_fn=predict_training_input_fn)
        training_predictions = np.array([it['predictions'][0] for it in training_predictions])

        validation_predictions = train_dnn_classifier.predict(input_fn=predict_validation_input_fn)
        validation_predictions = np.array([it['predictions'][0] for it in validation_predictions])

        training_root_mean_squared_error = math.sqrt(metrics.mean_squared_error(training_predictions, training_targets))
        validation_root_mean_squared_error = math.sqrt(metrics.mean_squared_error(validation_predictions,
                                                                                  validation_targets))
        print "  period %02d : %0.2f" % (period, training_root_mean_squared_error)
        training_rmse.append(training_root_mean_squared_error)
        validation_rmse.append(validation_root_mean_squared_error)
    print "Model training finished."

    print "Final RMSE (on training data):   {:0.2f}".format(training_root_mean_squared_error)
    print "Final RMSE (on validation data): {:0.2f}".format(validation_root_mean_squared_error)

    return train_dnn_classifier


# Train & test set
data_set = pd.read_csv("mushrooms.csv")
for i in range(len(FEATURES)):
    encoder = preprocessing.LabelEncoder()
    encoder.fit(data_set[FEATURES[i]])
    data_set[FEATURES[i]] = encoder.transform(data_set[FEATURES[i]])

msk = np.random.rand(len(data_set)) < 0.8
train_set = data_set[msk]
test_set = data_set[~msk]

# Prepare training and validation on it
training = preprocess_features(train_set)
validation = preprocess_features(train_set)

training_targets = preprocess_targets(train_set)
validation_targets = preprocess_targets(train_set)

# Prepare test
test = preprocess_features(test_set)
test_targets = preprocess_targets(test_set)

dnn_classifier = train_nn_classifier_model(learning_rate=0.001, steps=100, batch_size=100, hidden_units=[10, 10],
                                           training_examples=training, training_targets=training_targets,
                                           validation_examples=validation, validation_targets=validation_targets)

predict_testing_input_fn = lambda: input_fn(test, test_targets, num_epochs=1)

test_predictions = dnn_classifier.predict(input_fn=predict_testing_input_fn)
test_predictions = np.array([item['predictions'][0] for item in test_predictions])

root_mean_squared_error = math.sqrt(metrics.mean_squared_error(test_predictions, test_targets))

print "Final RMSE (on test data): {0.2f}".format(root_mean_squared_error)

具体部分是

for i in range(len(FEATURES)):
    encoder = preprocessing.LabelEncoder()
    encoder.fit(data_set[FEATURES[i]])
    data_set[FEATURES[i]] = encoder.transform(data_set[FEATURES[i]])

其他应该有效,因为我从Google https://colab.research.google.com/notebooks/mlcc/intro_to_neural_nets.ipynb?utm_source=mlcc&utm_campaign=colab-external&utm_medium=referral&utm_content=introneuralnets-colab&hl=it#scrollTo=zvCqgNdzpaFg开始遵循本教程,但我收到此错误,而且我不知道如何修复它。你能再帮我一次吗?

Traceback (most recent call last):
  File "/Users/.../individual_task_3.py", line 112, in <module>
    validation_examples=validation, validation_targets=validation_targets)
  File "/Users/.../individual_task_3.py", line 66, in train_nn_classifier_model
    train_dnn_classifier.train(input_fn=training_input_fn(), steps=steps_per_period)
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 352, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 809, in _train_model
    input_fn, model_fn_lib.ModeKeys.TRAIN))
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 668, in _get_features_and_labels_from_input_fn
    result = self._call_input_fn(input_fn, mode)
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 751, in _call_input_fn
    input_fn_args = util.fn_args(input_fn)
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/estimator/util.py", line 53, in fn_args
    args = tf_inspect.getfullargspec(fn).args
  File "/Users/.../venv/lib/python2.7/site-packages/tensorflow/python/util/tf_inspect.py", line 65, in getfullargspec
    if d.decorator_argspec is not None), spec_fn(target))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 816, in getargspec
    raise TypeError('{!r} is not a Python function'.format(func))
TypeError: ({'habitat': <tf.Tensor 'IteratorGetNext:8' shape=(?,) dtype=int64>, 'cap-surface': <tf.Tensor 'IteratorGetNext:3' shape=(?,) dtype=int64>, 'cap-shape': <tf.Tensor 'IteratorGetNext:2' shape=(?,) dtype=int64>, 'cap-color': <tf.Tensor 'IteratorGetNext:1' shape=(?,) dtype=int64>, 'stalk-color-above-ring': <tf.Tensor 'IteratorGetNext:14' shape=(?,) dtype=int64>, 'stalk-shape': <tf.Tensor 'IteratorGetNext:17' shape=(?,) dtype=int64>, 'ring-number': <tf.Tensor 'IteratorGetNext:11' shape=(?,) dtype=int64>, 'odor': <tf.Tensor 'IteratorGetNext:9' shape=(?,) dtype=int64>, 'gill-attachment': <tf.Tensor 'IteratorGetNext:4' shape=(?,) dtype=int64>, 'stalk-color-below-ring': <tf.Tensor 'IteratorGetNext:15' shape=(?,) dtype=int64>, 'stalk-surface-below-ring': <tf.Tensor 'IteratorGetNext:19' shape=(?,) dtype=int64>, 'gill-spacing': <tf.Tensor 'IteratorGetNext:7' shape=(?,) dtype=int64>, 'spore-print-color': <tf.Tensor 'IteratorGetNext:13' shape=(?,) dtype=int64>, 'gill-color': <tf.Tensor 'IteratorGetNext:5' shape=(?,) dtype=int64>, 'population': <tf.Tensor 'IteratorGetNext:10' shape=(?,) dtype=int64>, 'veil-color': <tf.Tensor 'IteratorGetNext:20' shape=(?,) dtype=int64>, 'ring-type': <tf.Tensor 'IteratorGetNext:12' shape=(?,) dtype=int64>, 'bruises': <tf.Tensor 'IteratorGetNext:0' shape=(?,) dtype=int64>, 'stalk-surface-above-ring': <tf.Tensor 'IteratorGetNext:18' shape=(?,) dtype=int64>, 'veil-type': <tf.Tensor 'IteratorGetNext:21' shape=(?,) dtype=int64>, 'stalk-root': <tf.Tensor 'IteratorGetNext:16' shape=(?,) dtype=int64>, 'gill-size': <tf.Tensor 'IteratorGetNext:6' shape=(?,) dtype=int64>}, <tf.Tensor 'IteratorGetNext:22' shape=(?, 1) dtype=string>) is not a Python function

1 个答案:

答案 0 :(得分:2)

问题是你正在尝试创建一个集合(使用set语法{...}),其元素是panda.Series,它们不可清除,因此不能放入集合或用作键对于字典,tensorflow使用列名作为字典中的键。

似乎不是传递Series对象而是传递字符串作为特征列名称,代码应该起作用。