Почему я получаю 'ValueError: Ошибка при проверке ввода: ...' только тогда, когда я загружаю свою модель keras, а не когда я ее сначала подгоняю? - PullRequest
0 голосов
/ 02 мая 2019

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

ValueError: Error when checking input: expected lstm_1_input to have shape (3, 54) but got array with shape (3, 52)

Почему я получаю эту ошибку только при загрузке модели, и как я могу использовать модели, которые я сохранил?

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

Для ясности, есть 52 символа, поэтому (3, 52) должно быть правильным.

Вот код, который я использую для построения модели:

model = Sequential()
model.add(LSTM(40, return_sequences=True, input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(LSTM(40, input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dense(vocab_size, activation='softmax'))
print(model.summary())
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=1000, verbose=2)

Вот как я его сохраняю:

model.save('n3_Tokeniser.h5')

Вот как язагрузить его:

model = load_model('n3_Tokeniser.h5')

Вот как я пытаюсь это назвать:

def generate_seq(model, mapping, seq_length, seed_text, n_chars):
    in_text = seed_text
    for _ in range(n_chars):
        encoded = [mapping[char] for char in in_text]
        encoded = pad_sequences([encoded], maxlen=seq_length, truncating='pre')
        encoded = to_categorical(encoded, num_classes=len(mapping))
        yhat = model.predict_classes(encoded, verbose=0)
        out_char = ''
        for char, index in mapping.items():
            if index == yhat:
                out_char = char
                break
        in_text += char
    return in_text

Вот полный ответ:

Traceback (most recent call last):
  File "/Users/ade/PycharmProjects/Wbp/LSTM.py", line 263, in <module>
    print(generate_seq(model, chardict, pre_characters, '$$$$$$$$$$', 20))
  File "/Users/ade/PycharmProjects/Wbp/LSTM.py", line 250, in generate_seq
    yhat = model.predict_classes(encoded, verbose=0)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/sequential.py", line 267, in predict_classes
    proba = self.predict(x, batch_size=batch_size, verbose=verbose)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training.py", line 1149, in predict
    x, _, _ = self._standardize_user_data(x)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
    exception_prefix='input')
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/keras/engine/training_utils.py", line 138, in standardize_input_data
    str(data_shape))
ValueError: Error when checking input: expected lstm_1_input to have shape (3, 54) but got array with shape (3, 52)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...