Я обучил несколько языковых моделей уровня персонажа с использованием керас.Когда я впервые подгоняю модель, я могу использовать ее, но когда я сохраняю модель, затем пытаюсь использовать ее позже, я получаю ошибку значения:
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)