Keras model.predict 导致 ValueError

Keras model.predict causing a ValueError

我有一个我训练过的 Keras LSTM 模型,它应该可以预测下一个序列:

from tensorflow.keras.layers import LSTM, Dropout, Input, Dense, Flatten
from tensorflow.keras.models import Sequential
import tensorflow.keras.optimizers as o

model = Sequential(
    [
        Input(shape= (500,5)), #500 arrays like this one -> [0,0,0,0,0]
        LSTM(500, return_sequences=False),
    
        Dense(972, activation="softmax"), #the 972 unique words in the vocab
    ]
)

optimizer = o.Adam(learning_rate=0.01)
model.compile(loss="categorical_crossentropy", optimizer=optimizer)
model.fit(corpuswithids, np.asarray(ydata), batch_size=200, epochs=20)

到目前为止,这是我的预测函数:

def predict(text):
  #text = "this is a test"
  text = text.split(" ")
  ids = []
  for i in text:
     ids.append(texids[np.where(textfull == i)][0]) #Converts text to its id which is 
     #in this format [0,0,0,0,0]
  ids = np.asarray(ids)
  print(ids)
  #prints [[ 95.   0.   0.   5.   5.] 
  #[883.   0.   0.   4.   3.]
  #[ 44.   0.   0.   2.  88.]
  #[ 36.   0.   0.   3. 255.]]

  print(ids.shape)
  #prints (4, 5)
  model.predict(x = ids)
  return ids

这会导致以下错误:

    ValueError: Input 0 of layer sequential_13 is incompatible with the layer: expected 
    ndim=3, found ndim=2. Full shape received: (None, None)

我是否需要更改或填充 id 的长度,使其达到 500 长以匹配列车数据? 感谢您的帮助!

问题出在 LSTM 输入形状上,LSTM 需要输入形状为 [batch, timesteps, feature] 的 3D 张量。

我可以重现问题

import tensorflow as tf
input = tf.keras.layers.Input(500,5)
lstm = tf.keras.layers.LSTM(500, return_sequences=False)
output = lstm(input)
print(output.shape)

输出

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-0a52ed439ffd> in <module>()
      2 input = tf.keras.layers.Input(500,5)
      3 lstm = tf.keras.layers.LSTM(500, return_sequences=False)
----> 4 output = lstm(input)
      5 print(output.shape)

6 frames
/usr/local/lib/python3.7/dist-packages/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
    216                          'expected ndim=' + str(spec.ndim) + ', found ndim=' +
    217                          str(ndim) + '. Full shape received: ' +
--> 218                          str(tuple(shape)))
    219     if spec.max_ndim is not None:
    220       ndim = x.shape.rank

ValueError: Input 0 of layer lstm_13 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (5, 500)

工作示例代码

import tensorflow as tf
input = tf.keras.layers.Input(500,5)
inputs = tf.expand_dims(input, axis=0)
print(inputs)
lstm = tf.keras.layers.LSTM(4)
output = lstm(inputs)
print(output.shape)

输出

KerasTensor(type_spec=TensorSpec(shape=(1, 5, 500), dtype=tf.float32, name=None), name='tf.expand_dims_2/ExpandDims:0', description="created by layer 'tf.expand_dims_2'")
(1, 4)