【问题标题】:The model.predict(),model.predict_classes() and model.predict_on_batch() seems to produce no resultmodel.predict(),model.predict_classes() 和 model.predict_on_batch() 似乎没有产生任何结果
【发布时间】:2020-03-30 04:14:37
【问题描述】:

我创建了一个模型,该模型利用深度学习使用 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')

加载模型sn-p如下,

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.]]

转换为类别时,结果总是五十个。

我的数据集包含近 2200 张图片,每个类别平均有 350-500 张图片。

有人可以帮忙解决这个问题吗?

【问题讨论】:

  • 请出示您用来保存模型的代码。
  • 另外,包括 model.summary() 输出。
  • 包括你的 tensorflow 版本,因为 tensorflow 2.x 有新的方法来保存模型。
  • 我已经添加了用于保存模型的代码@FelipeBorges。提前致谢。
  • 感谢您的宝贵建议@furcifer

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

我看到当你训练时,你会标准化你的图像:

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'))

希望对你有帮助。

【讨论】:

  • 嘿巴希尔。感谢您的指导,但是在测试过程中,无法进行非规范化对..?我尝试标准化,但它导致指数值。不过,预测参数传递技巧很有用。谢谢。
  • 不客气。我不明白你所说的非规范化和指数值是什么意思。使用我写的prepare函数,你能分享一下你的预测结果吗?
  • 当然巴希尔。我得到了更新后的准备功能的以下输出。 [[2.9802322e-07 0.0000000e+00 1.2387794e-01 2.9504299e-06 9.5416647e-07]]。谢谢。
  • 这似乎符合预期。这些是每个类别的概率。打电话给prediction = np.argmax(prediction, -1) 会给你实际的类别。它为您提供概率最高的索引,从而为您提供类别。
  • 非常感谢巴希尔。现在效果很好。非常感谢您及时的指导。
猜你喜欢
  • 2017-05-22
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多