Кажется, что model.predict (), model.predict_classes () и model.predict_on_batch () не дают никакого результата - PullRequest
0 голосов
/ 30 марта 2020

Я создал модель, которая использует глубокое обучение для классификации входных данных с использованием CNN. Классификация мультиклассная, хотя на самом деле 5 классов На тренировках модель выглядит хорошо, то есть она не подходит или не подходит. Тем не менее, при сохранении и загрузке модели я всегда получаю один и тот же вывод независимо от входного изображения. Окончательный массив прогнозирования содержит выходные данные в виде 0 для всех классов.

Итак, я не уверен, что модель ничего не предсказывает или всегда дает один и тот же результат.

Модель созданный мной после использования тензорной доски, чтобы найти модель наилучшего соответствия ниже.

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

При преобразовании в категории всегда получается пятьдесят.

Мой набор данных содержит почти 2200 изображений, в среднем 350-500 изображений для каждого класса.

Может кто-нибудь помочь с этим ..?

1 Ответ

0 голосов
/ 30 марта 2020

Я вижу, что когда вы тренируетесь, вы нормализуете свои изображения:

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

Надеюсь, это поможет.

...