Ошибка подтверждения DNSClassifier TensorFlow: [Метки должны <= n_classes - 1] - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над TensorFlow (1.13.1) для обучения классификатора DNN, я новичок в TensorFlow и застрял на ошибке для ряда классов.

Примечание: Я много гуглил и нахожу два решения, например упомяну количество классов, и я применил эти решения, но не смог решить свою проблему, поэтому не помечайте это как дублированный, пожалуйста !

Вот что я пробовал до сих пор:

CSV_COLUMNS = 'ALL_COLUMNS'.split(',')
LABEL_COLUMN = 'class'
DEFAULTS = [[0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0], [0.0]]

input Функция:

def reade_dataset(file_name, mode, batch_size = 512):
  def _input_fn():
#     attributes = None
#     label = None
    def decode_csv(value_column):
      # TODO #1: Use tf.decode_csv to parse the provided line
      columns = tf.decode_csv(value_column, record_defaults=DEFAULTS)
      # TODO #2: Make a Python dict.  The keys are the column names, the values are from the parsed data
      features = dict(zip(CSV_COLUMNS, columns))
      # TODO #3: Return a tuple of features, label where features is a Python dict and label a float
      label = features.pop(LABEL_COLUMN)
      print(label)
      return features, label
    file_list = None
    file_list = tf.gfile.Glob(file_name)
    dataset = (tf.data.TextLineDataset(file_list).map(decode_csv))

    num_epochs = None
    if mode == tf.estimator.ModeKeys.TRAIN:
      num_epochs = None
      dataset = dataset.shuffle(buffer_size=10*batch_size)
    else:
      num_epochs = 1

    dataset = dataset.repeat(num_epochs).batch(batch_size)
    return dataset.make_one_shot_iterator().get_next()
  return _input_fn

У меня есть два класса как [2, 4]

train_and_evaluate:

def train_and_evaluate(output_dir):
  EVAL_INTERVAL = 300
  run_config = tf.estimator.RunConfig(save_checkpoints_secs=EVAL_INTERVAL, keep_checkpoint_max=3)
  estimator = tf.estimator.DNNClassifier(model_dir=output_dir,
                                         feature_columns=get_cols(),
                                         hidden_units=[1024, 512, 256],
                                         n_classes=2,
                                         config=run_config)
  train_spec = tf.estimator.TrainSpec(input_fn=reade_dataset('train.csv', tf.estimator.ModeKeys.TRAIN), max_steps=1000)
  exporter = tf.estimator.LatestExporter('exporter', _serving_input_fn)
  eval_spec = tf.estimator.EvalSpec(input_fn=reade_dataset('eval.csv', tf.estimator.ModeKeys.EVAL),
                                                          steps=None,
                                                          start_delay_secs=60,
                                                          throttle_secs=EVAL_INTERVAL,
                                                          exporters=exporter)
  tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

Вот ошибка, которую я получаю:

InvalidArgumentError: утверждение не выполнено: [Метки должны <= n_classes - 1] [Условие x <= y не содержало поэлементно: x (dnn / head / tags: 0) =] [[2] [4] [2] ...] [y (dnn / head / assert_range / Const: 0) =] [1] [[узел DNN / голова / assert_range / assert_less_equal / Утверждай / AssertGuard / Утверждай (определяется в /usr/local/lib/python3.6/dist-packages/tensorflow_estimator/python/estimator/canned/head.py:1561) ]] </p>

...