Keras输入不兼容

我在使用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 …)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注