Классификатор в tenowflow, возвращающий ошибку от размера меток - PullRequest
1 голос
/ 27 апреля 2019

У меня есть база данных, состоящая из двух столбцов, и я хочу использовать первый для получения второго. Первый содержит около 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 Ответ

2 голосов
/ 27 апреля 2019

Недостаточно сделать количество классов таким же, как len(ncm).Вы должны убедиться, что идентификаторы целевых меток (y_train, y_test) содержат только целые числа от 0 до 150 (поскольку число ваших классов равно 151).

Возможно, вы захотите сделать что-то похожее на вашу функцию - используйте преобразователь категориальной функции, чтобы отобразить любые идентификаторы меток в целые числа от 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)

Обратите внимание, что после того, как ваш классификатор изучен, чтобы декодировать идентификаторы классов в строки классов (обратное отображение), вы можете использовать tf.contrib.lookup.index_to_string_table_from_tensor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...