我在使用Keras构建一个预测模型。但当我尝试获取预测结果时,得到一个ValueError,表示输入不兼容。以下是最小化代码,可重现问题:
import tensorflow as tffrom tensorflow.keras.callbacks import TensorBoardimport randomimport timeimport numpy as npimport pickle#Bring data:Name = "Predict-{}".format(int(time.time()))tensorboard = TensorBoard(log_dir='logs/{}'.format(Name))pickle_in = open("training_data.pickle","rb")training_data = pickle.load(pickle_in)random.shuffle(training_data)X=[]y=[]for file_data, categ in training_data : X.append(file_data) y.append(categ) X=np.array(X)y=np.array(y)model = tf.keras.models.Sequential()model.add(tf.keras.layers.Flatten())model.add(tf.keras.layers.Dense(172,activation=tf.nn.relu))model.add(tf.keras.layers.Dense(2,activation=tf.nn.softmax))model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])model.fit(X,y,epochs=10, batch_size=128,validation_split=0.25, callbacks=[tensorboard])#New input Xnew, with len(Xnew)=172Xnew = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]ynew = model.predict(Xnew)
这是我得到的错误:
ValueError: Input 0 of layer dense_107 is incompatible with the layer: expected axis -1 of input shape to have value 172 but received input with shape [None, 1]
模型摘要:
Model: "sequential_53"_________________________________________________________________Layer (type) Output Shape Param # =================================================================flatten_53 (Flatten) (None, 172) 0 _________________________________________________________________dense_109 (Dense) (None, 172) 29756 _________________________________________________________________dense_110 (Dense) (None, 2) 346 =================================================================Total params: 30,102Trainable params: 30,102Non-trainable params: 0_________________________________________________________________
我也不明白为什么形状是(None, 172)而不是172。
回答:
错误在于你提供给网络用于预测的对象。它期望一个形状为(batch, data)
的数组,你提供的是(,data)
的形状。
你可以告诉网络“这是一个批次”
Xnew = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0])ynew = model.predict(np.expand_dims(Xnew, axis=0))
expand_dims增加了一个维度(在这种情况下是在形状前面)
至于最后部分,你得到(None, 172)
,None意味着在摘要中我们不知道批次的数量(如果你想的话,你可以指定它),网络期望的是(X, 172),X可以是任何值(32, 64 …)