Python model.predict()、model.predict_classes()和model.predict_on_batch()似乎没有结果

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

我创建了一个模型,它利用深度学习来使用CNN对输入数据进行分类。虽然分类是多类的,实际上有5类。在训练中,模型看起来很好,也就是说,它没有过盈或过盈。然而,在保存和加载模型时,无论输入图像如何,我总是得到相同的输出。最终的预测数组包含所有类的输出为0

所以,我不确定模型是否没有预测任何东西,或者它总是产生相同的结果

下面是我在使用tensorboard找到最佳拟合模型后创建的模型

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)
将给出实际的类别。它以最高的概率为您提供索引,从而为您提供类别。非常感谢巴希尔。现在一切都好了。非常感谢你们及时的指导。