自己的数据集:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)

Posted

技术标签:

【中文标题】自己的数据集:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)【英文标题】:Own Dataset: ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int) 【发布时间】:2022-01-11 14:22:04 【问题描述】:

我对 Tensorflow 还是很陌生,我尝试了一个标准的介绍性示例,其中的数据集略有不同。但是,我收到一个错误,无法继续:

ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)。

还有:

TypeError:无法为 3 01 04 02 0 构建 TypeSpec 名称:Parch,dtype:类型为 Series 的对象

    import tensorflow as tf
    import tensorflow._api.v2.compat.v2.feature_column as fc
    import pandas as pd
    import numpy as np
    
    
    #df = pd.read_csv("train.csv")
    #df = df.drop(columns=['Cabin', 'Name','Ticket','PassengerId'])
    df = 'Survived': [0, 1, 1, 1, 0], 'Pclass': [3, 1, 3, 1, 3], 'Sex': ['male', 'female', 'female', 'female', 'male'],
          'Age': [22.0, 38.0, 26.0, 35.0, 35.0], 'SibSp': [1, 1, 0, 1, 0], 'Parch': [0, 0, 0, 0, 0], 'Fare': [7.2500,
          71.2833, 7.9250, 53.1000, 8.0500], 'Embarked': ['S', 'C', 'S', 'S', 'S']
    df = pd.DataFrame(df)
    df.dropna(inplace=True)
    
    df['Pclass'] = df['Pclass'].astype('object')
    df['SibSp'] = df['SibSp'].astype('object')
    df['Parch'] = df['Parch'].astype('object')
    
    train, test = np.split(df.sample(frac=1), [int(0.8*len(df))])
    y_train_labels = train.pop('Survived')
    y_test_labels = test.pop('Survived')
    
    numerical_columns = ['Age','Fare']
    categorical_columns = ['Sex','Embarked','Pclass','Parch','SibSp']
    
    feature_column = []
    for feature in categorical_columns:
        vocabulary = df[feature].unique()
        feature_column.append(tf.feature_column.categorical_column_with_vocabulary_list(feature,vocabulary))
    
    for feature in numerical_columns:
        feature_column.append(tf.feature_column.numeric_column(feature, dtype=tf.float32))
    
    def make_input_fn(data_df, label_df, num_epochs=20, shuffle=True, batch_size=32):
        def input_function():
            ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
            if shuffle:
                ds = ds.shuffle(1000)
            ds = ds.batch(batch_size).repeat(num_epochs)
            return ds
        return input_function()
    
    train_input_fn = make_input_fn(train, y_train_labels)
    eval_input_fn = make_input_fn(test, y_test_labels, num_epochs=1, shuffle=False)
    
    
    linear_est = tf.estimator.LinearClassifier(feature_columns=feature_column)
    linear_est.train(train_input_fn)
    result = linear_est.evaluate(eval_input_fn)

我从我的数据集中提供了一个最小可重复的示例,如果有任何其他可能的错误,请告诉我。

【问题讨论】:

【参考方案1】:

我认为特征Pclass, SibSp, and Parch 应该归类为数字特征。通常你使用categorical_column_with_vocabulary_list将字符串映射为数值,但是上面提到的三个特性已经是数值了。如果您真的想使用categorical_column_with_vocabulary_list,那么首先将您的特征转换为字符串或将它们保留为整数。如记录的here:

当您的输入是字符串或整数格式,并且您有一个内存词汇表将每个值映射到一个整数 ID 时,请使用此选项。

这是一个具有数字特征的示例:

import tensorflow as tf
import tensorflow._api.v2.compat.v2.feature_column as fc
import pandas as pd
import numpy as np

df = 'Survived': [0, 1, 1, 1, 0], 
      'Pclass': [3, 1, 3, 1, 3], 
      'Sex': ['male', 'female', 'female', 'female', 'male'],
      'Age': [22.0, 38.0, 26.0, 35.0, 35.0], 
      'SibSp': [1, 1, 0, 1, 0], 
      'Parch': [0, 0, 0, 0, 0], 
      'Fare': [7.2500, 71.2833, 7.9250, 53.1000, 8.0500], 
      'Embarked': ['S', 'C', 'S', 'S', 'S']
df = pd.DataFrame(df)
df.dropna(inplace=True)

df['Pclass'] = df['Pclass'].astype(np.float32)
df['SibSp'] = df['SibSp'].astype(np.float32)
df['Parch'] = df['Parch'].astype(np.float32)

train, test = np.split(df.sample(frac=1), [int(0.8*len(df))])
y_train_labels = train.pop('Survived')
y_test_labels = test.pop('Survived')

numerical_columns = ['Age','Fare', 'Pclass', 'SibSp', 'Parch']
categorical_columns = ['Sex', 'Embarked']

feature_column = []
for feature in categorical_columns:
    vocabulary = df[feature].unique()
    feature_column.append(tf.feature_column.categorical_column_with_vocabulary_list(feature,vocabulary))

for feature in numerical_columns:
    feature_column.append(tf.feature_column.numeric_column(feature, dtype=tf.float32))

def make_input_fn(data_df, label_df, num_epochs=20, shuffle=True, batch_size=32):
    def input_function():
        ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
            ds = ds.shuffle(1000)
        ds = ds.batch(batch_size).repeat(num_epochs)
        return ds
    return input_function

train_input_fn = make_input_fn(train, y_train_labels)
eval_input_fn = make_input_fn(test, y_test_labels, num_epochs=1, shuffle=False)

linear_est = tf.estimator.LinearClassifier(feature_columns=feature_column)
linear_est.train(train_input_fn)
result = linear_est.evaluate(eval_input_fn)

【讨论】:

谢谢,你的例子有效。您能解释一下为什么将它们归类为对象时它不起作用吗?在我看来,这应该没什么区别。 更新了答案。如果您不将特征转换为 object 类型,您的示例将起作用,因为 categorical_column_with_vocabulary_list 需要整数或字符串输入。

以上是关于自己的数据集:ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:无法将字符串转换为浮点数:Python中的“lisans”

Python ValueError:无法将字符串转换为浮点数:

Numpy加载CSV - ValueError:无法将字符串转换为float

无法在 Python 中捕获 ValueError

Mask-RCNN,ValueError:无法将输入数组从形状(70)广播到形状(1)

Python ValueError:形状不匹配:无法将对象广播到单个形状