Ошибка значения - ошибка при проверке цели - LSTM - PullRequest
0 голосов
/ 03 мая 2020

О наборе данных

Следующий набор данных Reuters содержит 11228 текстов, соответствующих новостям, классифицированным в 46 категориях. Тексты написаны в том смысле, что каждое слово соответствует целому числу. Я указываю, что мы хотим работать с 2000 словами.

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

num_words = 2000
(reuters_train_x, reuters_train_y), (reuters_test_x, reuters_test_y) = tf.keras.datasets.reuters.load_data(num_words=num_words)

n_labels = np.unique(reuters_train_y).shape[0]
print("labels: {}".format(n_labels))

# This is the first new
print(reuters_train_x[0])

Реализация LSTM

Мне нужно реализовать сеть с одним LSTM с 10 блоками. Входные данные требуют внедрения с 10 измерениями перед входом в ячейку LSTM. Наконец, необходимо добавить плотный слой, чтобы отрегулировать количество выходов с количеством категорий.

from keras.models import Sequential
from keras.layers import LSTM, Dense, Embedding
from from tensorflow.keras.utils import to_categorical

reuters_train_y = to_categorical(reuters_train_y, 46)
reuters_test_y = to_categorical(reuters_test_y, 46)

model = Sequential()
model.add(Embedding(input_dim = num_words, 10))
model.add(LSTM(10))
model.add(Dense(46,activation='softmax'))

Обучение

model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
history = model.fit(reuters_train_x,reuters_train_y,epochs=20,validation_data=(reuters_test_x,reuters_test_y))

Полученное сообщение об ошибке:

ValueError: Error when checking target: expected dense_2 to have shape (46,) but got array with shape (1,)

1 Ответ

1 голос
/ 03 мая 2020

Вам нужно горячо закодировать ваши y метки.

from tensorflow.keras.utils import to_categorical

reuters_train_y = to_categorical(reuters_train_y, 46)

reuters_test_y = to_categorical(reuters_test_y, 46)

Еще одна ошибка, которую я вижу в функции fit, вы передаете validation_data=(reuters_test_x,reuters_train_y), но она должна быть validation_data=(reuters_test_x,reuters_test_y)

Ваш x - это numpy массив списков различной длины. Вам нужно дополнить последовательности, чтобы получить массив фиксированной формы numpy.

reuters_train_x = tf.keras.preprocessing.sequence.pad_sequences(
    reuters_train_x, maxlen=50
)

reuters_test_x = tf.keras.preprocessing.sequence.pad_sequences(
    reuters_test_x, maxlen=50
)
...