自己的数据集: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