горячее кодирование массива с плавающей запятой с использованием всего лишь кераса - PullRequest
0 голосов
/ 21 февраля 2019

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

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

[[0.], [0.76666665], [0.5], [0.23333333], [1.]]

Я хочу в одно касание кодировать эти классы, используя функцию keras.utils.to_categorical(y, num_classes=5, dtype='float32').

Тем не менее, он возвращает следующее:

array(
    [
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.]
    ], 
dtype=float32)

В качестве входных данных он принимает только целые числа, поэтому он отображает все значения < 1. в 0.Я мог бы обойти это путем умножения всех значений на константу, чтобы все они были целыми числами, и я думаю, что есть также способ решить эту проблему в рамках scikit learn, но это звучит как огромный обходной путь для решения проблемы, решение которой должно быть тривиальнымвнутри только керас, что заставляет меня поверить, что я упускаю что-то очевидное.

Я надеюсь, что кто-то сможет указать на простую альтернативу, используя только Керас.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Другой вариант - использовать OneHotEncoder из sklearn:

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(categories='auto')

input = [[0.], [0.76666665], [0.5], [0.23333333], [1.]]
output = encoder.fit_transform(input)

print(input)
print(output.toarray())

Выходы:

[[0.0], [0.76666665], [0.5], [0.23333333], [1.0]]
[[ 1.  0.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  1.]]
0 голосов
/ 21 февраля 2019

Из-за непрерывного характера значений с плавающей запятой, не рекомендуется пытаться и один горячий кодировать их.Вместо этого вы должны попробовать что-то вроде этого:

a = {}
classes = []

for item, i in zip(your_array, range(len(your_array))):
    a[str(i)] = item
    classes.append(str(i))

encoded_classes = to_categorical(classes)

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

РЕДАКТИРОВАТЬ: Обновлено после комментария от nuric .

your_array = [[0.], [0.76666665], [0.5], [0.23333333], [1.]]

class_values = {}
classes = []

for i, item in enumerate(your_array):
    class_values[str(i)] = item
    classes.append(i)

encoded_classes = to_categorical(classes)
...