首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >model.predict()、model.predict_classes()和model.predict_on_batch()似乎没有产生任何结果

model.predict()、model.predict_classes()和model.predict_on_batch()似乎没有产生任何结果
EN

Stack Overflow用户
提问于 2020-03-30 12:14:37
回答 1查看 3.7K关注 0票数 0

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

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

我使用tensorboard找到最佳拟合模型后创建的模型如下所示。

代码语言:javascript
复制
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')

加载模型片段如下所示:

代码语言:javascript
复制
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张图片。

有人能帮个忙吗..?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 17:25:27

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

代码语言:javascript
复制
X = X/255.0

但当你测试时,即在预测时间内,你只是读取图像并调整大小,而不是归一化。尝试:

代码语言:javascript
复制
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时,您不必以列表形式提供输入。而不是:

代码语言:javascript
复制
prediction=model.predict([prepare('30.jpg')])

您应该执行以下操作:

代码语言:javascript
复制
prediction=model.predict(prepare('30.jpg'))

希望能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60923982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档