Python model.predict()、model.predict_classes()和model.predict_on_batch()似乎没有结果
我创建了一个模型,它利用深度学习来使用CNN对输入数据进行分类。虽然分类是多类的,实际上有5类。在训练中,模型看起来很好,也就是说,它没有过盈或过盈。然而,在保存和加载模型时,无论输入图像如何,我总是得到相同的输出。最终的预测数组包含所有类的输出为0 所以,我不确定模型是否没有预测任何东西,或者它总是产生相同的结果 下面是我在使用tensorboard找到最佳拟合模型后创建的模型Python model.predict()、model.predict_classes()和model.predict_on_batch()似乎没有结果,python,tensorflow,keras,deep-learning,cnn,Python,Tensorflow,Keras,Deep Learning,Cnn,我创建了一个模型,它利用深度学习来使用CNN对输入数据进行分类。虽然分类是多类的,实际上有5类。在训练中,模型看起来很好,也就是说,它没有过盈或过盈。然而,在保存和加载模型时,无论输入图像如何,我总是得到相同的输出。最终的预测数组包含所有类的输出为0 所以,我不确定模型是否没有预测任何东西,或者它总是产生相同的结果 下面是我在使用tensorboard找到最佳拟合模型后创建的模型 import tensorflow as tf from tensorflow.keras.models impor
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard
import pickle
import time
X=pickle.load(open("X.pickle","rb"))
y=pickle.load(open("y.pickle","rb"))
X=X/255.0
dense_layers=[0]
layer_sizes=[64]
conv_layers=[3]
for dense_layer in dense_layers:
for layer_size in layer_sizes:
for conv_layer in conv_layers:
NAME="{}-conv-{}-nodes-{}-dense-{}".format(conv_layer,layer_size,dense_layer,int(time.time()))
print(NAME)
tensorboard=TensorBoard(log_dir='logs\{}'.format(NAME))
model = Sequential()
model.add(Conv2D(layer_size, (3,3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
for l in range(conv_layer-1):
model.add(Conv2D(layer_size, (3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
for l in range(dense_layer):
model.add(Dense(layer_size))
model.add(Activation('relu'))
model.add(Dense(5))
model.add(Activation('sigmoid'))
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit(X,y,batch_size=32,epochs=10,validation_split=0.3,callbacks=[tensorboard])
model.save('0x64x3-CNN-latest.model')
加载模型片段如下所示:
import cv2
import tensorflow as tf
CATEGORIES= ["fifty","hundred","ten","thousand","twenty"]
def prepare(filepath):
IMG_SIZE=100
img_array=cv2.imread(filepath)
new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
return new_array.reshape(-1,IMG_SIZE,IMG_SIZE,3)
model=tf.keras.models.load_model("0x64x3-CNN-latest.model")
prediction=model.predict([prepare('30.jpg')])
print(prediction)
输出总是[[0.0.0.0.0.]
在转换为类别时,结果总是50
我的数据集包含近2200幅图像,平均每个类包含350-500幅图像
有人能帮忙吗?我知道,当你训练时,你会使你的图像正常化:
X = X/255.0
但当您进行测试时,即在预测时间内,您只需读取图像并调整大小,而不进行规格化。尝试:
def prepare(filepath):
IMG_SIZE=100
img_array=cv2.imread(filepath)
img_array = img_array/255.0
new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
return new_array.reshape(-1,IMG_SIZE,IMG_SIZE,3)
另外,您的prepare
函数将以4个维度(包括批处理维度)返回图像,因此当您调用predict
时,您不必以列表的形式提供输入。而不是:
prediction=model.predict([prepare('30.jpg')])
你应该做:
prediction=model.predict(prepare('30.jpg'))
希望有帮助。请展示您用于保存模型的代码。另外,请包含model.summary()输出。由于tensorflow 2.x有了保存模型的新方法,请将tensorflow vension包含到中。我已添加了用于保存模型的代码@FelipeBorges。提前感谢。感谢您的宝贵建议@furciferHey Bashir。谢谢你们的指导,但在测试过程中,非规范化是不可能的,对吗。。?我尝试过标准化,但结果是指数值。不过,预测通过尖端的参数是有用的。谢谢,不客气。我不明白你所说的非规范化和指数值是什么意思。使用我写的prepare函数,你能分享你的预测结果吗?当然可以。我得到了更新的prepare函数的以下输出。[2.9802322e-07 0.0000000 E+00 1.2387794e-01 2.9504299e-06 9.5416647e-07]]。谢谢。这似乎和预期的一样。这些是每个类别的概率。调用
prediction=np.argmax(prediction,-1)
将给出实际的类别。它以最高的概率为您提供索引,从而为您提供类别。非常感谢巴希尔。现在一切都好了。非常感谢你们及时的指导。