tensowflow中的分类器从标签大小返回错误

时间:2019-04-27 00:39:56

标签: python python-3.x tensorflow neural-network

我有一个由两列组成的数据库,我想使用第一列来获取第二列。第一个元素大约有3000个元素,第二个元素恰好包含151个元素。为此,我在张量流中生成了一个密集的神经网络。但是,我在训练过程中遇到了一个奇怪的错误。

这是我生成的代码

import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split

df = pd.read_excel('nn.xlsx')
x_data = df.drop('NCM',axis=1)

lista = df['NCM'].values.tolist()
prods = df['PRODUTO'].values.tolist()

seen = set()
ncm = [x for x in lista if x not in seen and not seen.add(x)]

seen = set()
prods = [x for x in prods if x not in seen and not seen.add(x)]

assigned = tf.feature_column.categorical_column_with_vocabulary_list('PRODUTO',prods)
feat_cols = [assigned]
labels = df['NCM']  
X_train, X_test, y_train, y_test = train_test_split(x_data, labels, test_size=0.33, random_state=101)
input_func =         tf.estimator.inputs.pandas_input_fn(x=X_train,y=y_train,batch_size=10,num_epochs=1000,shuffle=True)

input_func = tf.estimator.inputs.pandas_input_fn(x=X_train,y=y_train,batch_size=10,num_epochs=1000,shuffle=True)
embedded_group_col = tf.feature_column.embedding_column(assigned,dimension=len(prods))

feat_cols = [embedded_group_col]

dnn_model = tf.estimator.DNNClassifier(hidden_units = [10,10,10],feature_columns=feat_cols,n_classes=len(ncm))
dnn_model.train(input_fn=input_func,steps = 1000)

代码运行良好,直到最后一行出现错误为止:

InvalidArgumentError (see above for traceback): assertion failed: [Labels must <= n_classes - 1] [Condition x <= y did not hold element-wise:x (dnn/head/labels:0) = ] [[22030000][22030000][22030000]...] [y (dnn/head/assert_range/Const:0) = ] [151]

这很奇怪,因为我保证类的数量与len(ncm)完全相同。

什么可能导致此错误?

1 个答案:

答案 0 :(得分:2)

仅使类数与len(ncm)相同是不够的。您必须确保目标标签ID(y_trainy_test)仅包含0到150之间的整数(因为类数为151)。

您可能想做一些与功能相似的事情-使用分类特征转换器将所有标签id映射为0到150(含)之间的整数。

例如,您可以尝试以下操作:

mapping_strings = tf.constant(['904060','21069090',...,'99998771'])
table = tf.contrib.lookup.index_table_from_tensor(
    mapping=mapping_strings, num_oov_buckets=0)
label_ids = table.lookup(labels)

请注意,在学习了分类器之后,要将类ID解码为类字符串(反向映射),可以使用tf.contrib.lookup.index_to_string_table_from_tensor