簡體   English   中英

model.predict(),model.predict_classes() 和 model.predict_on_batch() 似乎沒有產生任何結果

[英]The model.predict(),model.predict_classes() and model.predict_on_batch() seems to produce no result

我創建了一個模型,該模型利用深度學習使用 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.]] [[0. 0. 0. 0. 0.]] .

轉換為類別時,結果總是五十。

我的數據集包含近 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'))

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM