Лямбда-слой в Keras с keras.backend.one_hot дает TypeError - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь тренировать уровень персонажа CNN, используя Keras.Я беру в качестве ввода одно слово.Я уже преобразовал слова в списки индексов, но когда я пытаюсь вставить их в one_hot, я получаю TypeError.

>>> X_train[0]
array([31, 14, 23, 29, 27, 18, 12, 30, 21, 10, 27,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0], dtype=uint8)
>>> X_train.shape
(2226641, 98)

Но когда я пытаюсь создать свою модель следующим образом:

k_model = Sequential()
k_model.add(Lambda(K.one_hot, arguments={'num_classes': 100}, input_shape=(98,), output_shape=(98,100)))
k_model.add(Conv1D(filters=16, kernel_size=5, strides=1, padding='valid'))

Я получаю TypeError: Value passed to parameter 'indices' has DataType float32 not in list of allowed values: uint8, int32, int64.

Очевидно, что он не доходит до точки, где X_train даже читается, так где же он получает значение с плавающей запятой?

Я хотел бы иметь форму экземпляра (98, 100), где 100количество классов.

Я не могу поместить весь набор данных в память.

1 Ответ

0 голосов
/ 21 мая 2018

Я бы предложил более чистое решение, которое позволило бы достичь того же результата, как:

k_model.add(Embedding(num_classes, num_classes,
                      embeddings_initializer='identity',
                      trainable=False,
                      name='onehot'))

По сути, вы встраиваете вещи, поэтому было бы более разумно использовать одно с фиксированными весами.Это также дает вам гибкость, позволяющую встраивать обучение в будущем.

...