Получено значение метки 200837, которое находится вне допустимого диапазона [0, 171) при обучении последовательной модели python керас - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь построить очень простую модель классификации нескольких классов. Я использую следующий код для создания, компиляции и обучения модели:

model = tf.keras.Sequential([
  tf.keras.layers.Dense(171, activation='softmax')
])

model.compile(
    optimizer = 'adam',
    loss='sparse_categorical_crossentropy', 
    metrics=['accuracy']
    )

history = model.fit(loc_array, label_array, epochs=500, verbose=False)
print('finished')

Я использую следующий код для создания loc_array и label_array

loc_array = df.iloc[:, 1:2]
label_array = df.iloc[:, 3]

loc_array представляет значения x и является 1 столбец и 1344 строки label_array - это значение y, равное 1 столбцу и 1344 строкам

В массиве меток есть 171 отдельный класс (как введено в плотный слой модели), однако эти значения принимают значение 6 di git целочисленные значения, например, первый класс - 100358.

Когда я запускаю шаг модели поезда, я получаю следующую ошибку:

InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-48-5fd9efae2d96> in <module>()
----> 1 history = model.fit(loc_array, label_array, epochs=500, verbose=False)
      2 print('finished')

8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:

InvalidArgumentError:  Received a label value of 200837 which is outside the valid range of [0, 171).  Label values: 121695 105012 126480 125374 122189 102036 110191 104270 129375 108730 105839 122189 105011 200837 128990 102128 129850 129731 105839 104020 129731 129375 122189 126603 105011 105030 126603 126603 126603 102490 126480 121695
     [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-48-5fd9efae2d96>:1) ]] [Op:__inference_train_function_1411]

Function call stack:
train_function

Кажется, что мне нужно преобразовать мои 6 ди git, 171 класс к значениям от 0 до 171? Если я это сделаю, код работает. Но есть ли способ запустить код без необходимости конвертировать эти значения, поскольку это приводит к необходимости преобразовывать значения от 0 до 171 обратно в фактические значения, когда я применяю модель.

1 Ответ

0 голосов
/ 29 апреля 2020

То, что вы моделируете, является проблемой классификации, поэтому вы устанавливаете для параметра loss для model.compile() значение 'sparse_categorical_entropy'. Определение этого показателя c показывает, что ваши данные действительно должны быть в форме классов в диапазоне [0, 171). Если вы хотите использовать целочисленные значения в качестве выходных данных, возможно, лучше смоделировать их как проблему регрессии и использовать loss='mean_squared_error'.

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