Преобразование тензоров в приемлемый для tensorflow вид
Задача: составить простенькую модель под сентимент-анализ. Пайплайн пройден, данные представлены в виде вложенных списков. Проблемы начинаются при попытке натренировать модель.
history = model.fit(X, Y, batch_size=32, epochs=50)
Поскольку keras не может делать из вложенных списков тензоры, преобразуем все в список с массивами numpy, а затем и внешний список конвертируем также.
for i in range(0, len(data)):
data[i] = numpy.asarray(data[i])
X = numpy.asarray(data)
На что получаем: ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
Указание типа приводит к аналогичной ошибке
X = numpy.asarray(data, dtype=numpy.ndarray)
Ладно, тогда пробуем через рваные тензоры
X = tensorflow.ragged.constant(data)
На что получаем
ValueError: Dimensions 32 and 35 are not compatible
Вопрос: В чем, собственно, проблема? Длина каждого вложенного массива не превышает 11, всего массивов 32. Откуда взялось число 35 непонятно совершенно. Самое большое слово длиной 41, других слов больше 30 просто нет.
Модель:
model = Sequential()
model.add(gensim_to_keras_embedding(word2vec_model))
model.add(LSTM(128, return_sequences=True))
model.add(LSTM(64))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer=Adam(0.001))
Summary описывает ее следующим образом:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, None, 300) 11849400
lstm (LSTM) (None, None, 128) 219648
lstm_1 (LSTM) (None, 64) 49408
dense (Dense) (None, 2) 130
=================================================================
Total params: 12,118,586
Trainable params: 269,186
Non-trainable params: 11,849,400
_________________________________________________________________
Буду благодарен за любую помощь.