1

概括

在已正确生成模型后,我无法将输入数据的正确尺寸提供给预测。

我收到以下错误:

ValueError: Error when checking : expected lstm_13_input to have shape (None, 40, 39) but got array with shape (1, 39, 39)

背景

  • 使用 Anaconda 作为我的虚拟环境
  • Keras 版本 2.0.6
  • TensorFlow 版本 1.1.0

我正在创建一个非常接近本教程的示例。

代码

以下是相关的代码片段:

from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout
from keras.layers import LSTM,TimeDistributed,SimpleRNN
from keras.utils.data_utils import get_file
import numpy as np
from time import sleep
import random
import sys

...

X = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences),maxlen, len(chars)), dtype=np.bool) # y is also a sequence , or  a seq of 1 hot vectors
for i, sentence in enumerate(sentences):
    for t, char in enumerate(sentence):
        X[i, t, char_indices[char]] = 1

for i, sentence in enumerate(next_chars):
    for t, char in enumerate(sentence):
        y[i, t, char_indices[char]] = 1

...

model = Sequential()
model.add(LSTM(512, return_sequences=True, input_shape=(maxlen, len(chars))))  # original one
model.add(LSTM(512, return_sequences=True)) #- original
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(len(chars))))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

...

history=model.fit(X, y, batch_size=128, nb_epoch=1,verbose=0)

...

seed_string="brutus:\nbeing so moved, he will not spare"
x=np.zeros((1, len(seed_string), len(chars)))
for t, char in enumerate(seed_string):
    x[0, t, char_indices[char]] = 1.
preds = model.predict(x, verbose=0)[0]

错误

在最后一行,它出错了,出现以下错误:

ValueError: Error when checking : expected lstm_13_input to have shape (None, 40, 39) but got array with shape (1, 39, 39)

努力解决

我玩过它的维度seed_stringx生成的维度,但无论我如何尝试调整它们,我都有某种不匹配,总是由于None(我认为)的这个要求。需要明确的是,我从种子字符串中添加或删除了字符,因此它是40字符。但是,当我将其设置为 时40,错误显示我实际上拥有41,当我将其设置为时39,它显示我拥有39,如上所示。还有其他事情——我不明白——在这里发生。

我查看了Reshape's 的代码和一个如何使用它的示例,但由于 Keras'Reshape是用于模型层的,我什至不明白如何使用它来重塑预测的输入,而 Numpy 没有办法重塑创建一个None维度(至少据我所知不是)。

4

1 回答 1

1

seed_string你需要匹配的长度maxlen。您可以处理字符串比maxlenwith短或长的两种情况pad_sequences。在您的情况下,您的字符串太长。

from keras.preprocessing.sequence import pad_sequences

seed_string = "brutus:\nbeing so moved, he will not spare"

x = np.zeros((1, len(seed_string), len(chars)))

for t, char in enumerate(seed_string):
    x[0, t, char_indices[char]] = 1.

x = pad_sequences(x, maxlen=maxlen)

preds = model.predict(x, verbose=0)[0]
于 2017-07-31T06:12:40.920 回答