ValueError: логиты и метки должны иметь одинаковую форму ((None, 1) vs (None, 10000)) при попытке классифицировать обзоры IMDB
Я пытаюсь классифицировать обзоры фильмов IMDB с помощью двоичной классификации с помощью Keras. Вот код, который я использовал.
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(16,activation="relu",input_shape=(10000,)))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))
model.compile(optimizer="rmsprop",loss="binary_crossentropy", metrics=["acc"])
history = model.fit(partial_x_train,partial_y_train, epochs=20, batch_size=512, validation_data = (x_val, y_val))
Формы каждого входного тензора следующие.
print(partial_x_train.shape) --> (15000, 10000)
print(partial_y_train.shape)--> (15000, 10000)
print(x_val.shape) --> (10000, 10000)
print(y_val.shape) --> (10000, 10000)
Но при выполнении вышеуказанной программы я получаю следующую ошибку.
ValueError: in user code:
ValueError: logits and labels must have the same shape ((None, 1) vs (None, 10000))
Я просмотрел множество ТАК вопросов, но не мог понять, что я сделал не так. Может ли кто-нибудь помочь мне избежать этой ошибки и скомпилировать модель?
1 ответ
Как указано
ValueError
, вы пытаетесь вычислить потерю формы
((None, 1)
против
(None, 10000))
. Было бы ясно, разместили ли вы обучающий набор IMDB или ссылаетесь на него. Попробуйте использовать встроенный набор данных IMDB из
keras
.
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
max_features = 20000 # Only consider the top 20k words
maxlen = 200 # Only consider the first 200 words of each movie review
(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(
num_words=max_features
)
print(len(x_train), "Training sequences")
print(len(x_val), "Validation sequences")
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_val = keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen)
x_train.shape, y_train.shape
# ((25000, 200), (25000,))
По вашей модели
model = models.Sequential()
model.add(layers.Dense(16,activation="relu",input_shape=(maxlen,)))
model.add(layers.Dense(16,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))
model.compile(optimizer="rmsprop",loss="binary_crossentropy", metrics=["acc"])
model.fit(x_train, y_train, batch_size=32, epochs=2, validation_data=(x_val, y_val))
Epoch 1/2
782/782 [==============================] - 5s 4ms/step - loss: 164.2350 - acc: 0.5018 - val_loss: 1.0527 - val_acc: 0.5000
Epoch 2/2
782/782 [==============================] - 3s 4ms/step - loss: 1.0677 - acc: 0.4978 - val_loss: 0.7446 - val_acc: 0.5000