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)
我有一个我训练过的 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)