我有一个由两列组成的数据库,我想使用第一列来获取第二列。第一个元素大约有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)完全相同。
什么可能导致此错误?
答案 0 :(得分:2)
仅使类数与len(ncm)
相同是不够的。您必须确保目标标签ID(y_train
,y_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
。