Как загрузить категориальные данные из массива в столбец «Индикатор» или «Внедрение»? - PullRequest
0 голосов
/ 25 июня 2018

Используя Tensorflow 1.8.0, мы сталкиваемся с проблемой всякий раз, когда пытаемся построить категориальный столбец.Вот полный пример, демонстрирующий проблему.Он работает как есть (используя только числовые столбцы).Раскомментирование определения столбца индикатора и данных генерирует трассировку стека, заканчивающуюся tensorflow.python.framework.errors_impl.InternalError: Unable to get element as bytes.

import tensorflow as tf
import numpy as np

def feature_numeric(key):
  return tf.feature_column.numeric_column(key=key, default_value=0)

def feature_indicator(key, vocabulary):
  return tf.feature_column.indicator_column(
    tf.feature_column.categorical_column_with_vocabulary_list(
      key=key, vocabulary_list=vocabulary ))


labels = ['Label1','Label2','Label3']

model = tf.estimator.DNNClassifier(
  feature_columns=[
    feature_numeric("number"),
    # feature_indicator("indicator", ["A","B","C"]),
  ],
  hidden_units=[64, 16, 8],
  model_dir='./models',
  n_classes=len(labels),
  label_vocabulary=labels)

def train(inputs, training):
  model.train(
    input_fn=tf.estimator.inputs.numpy_input_fn(
        x=inputs,
        y=training,
        shuffle=True
      ), steps=1)

inputs = {
  "number": np.array([1,2,3,4,5]),
  # "indicator": np.array([
  #     ["A"],
  #     ["B"],
  #     ["C"],
  #     ["A", "A"],
  #     ["A", "B", "C"],
  #   ]),
}

training = np.array(['Label1','Label2','Label3','Label2','Label1'])

train(inputs, training)

. Попытки использовать тариф для встраивания не лучше.Используя только числовые входы, мы можем успешно масштабировать до тысяч входных узлов, и фактически мы временно расширили наши категориальные функции в препроцессоре для имитации индикаторов.

Документация для categorical_column_*() и indicator_column() заполненав ссылках на функции, которые мы почти уверены, что мы не используем (входные данные прото, что бы bytes_list не было), но, возможно, мы ошибаемся в этом?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Проблема здесь связана с неровной формой входного массива «индикатора» (некоторые элементы имеют длину 1, один - длину 2, один - длину 3).Если вы добавите в свои входные списки какую-нибудь строку без словаря (например, я использовал «Z», поскольку ваш словарь - «A», «B», «C»), вы получите ожидаемые результаты:

inputs = {
  "number": np.array([1,2,3,4,5]),
  "indicator": np.array([
    ["A", "Z", "Z"],
    ["B", "Z", "Z"],
    ["C", "Z", "Z"],
    ["A", "A", "Z"],
    ["A", "B", "C"]
  ])
}

Вы можете убедиться, что это работает, напечатав полученный тензор:

dense = tf.feature_column.input_layer(
  inputs,
  [
    feature_numeric("number"),
    feature_indicator("indicator", ["A","B","C"]),
  ])

with tf.train.MonitoredTrainingSession() as sess:
  print(dense)
  print(sess.run(dense))
0 голосов
/ 28 июня 2018

Из того, что я могу сказать, сложность в том, что вы пытаетесь создать индикаторный столбец из массива массивов.

Я свернул ваш индикаторный массив до

"indicator": np.array([
  "A",
  "B",
  "C",
  "AA",
  "ABC",
])

..и вещь убежала.

Более того, я не могу найти ни одного примера, где словарный массив представляет собой что-либо, кроме плоского массива строк.

...