我创建了一个识别数字的模型,并且精度为95%,但该模型总是可以预测任何图像的[0]



我创建了一个模型来识别来自图像的数字。图像具有深色背景和白色像素,代表数字(其黑色和白色图像(。我的精度为95%,但要预测的任何图像总是可以预测[0]:

DATADIR = "./abc"
catg = ['data_aug_0','data_aug_1','data_aug_2','data_aug_3','data_aug_4','data_aug_5','data_aug_6','data_aug_7','data_aug_8','data_aug_9']
training_data=[]
img_size = 32
img_size2 = 32
def create_training_data():
    for category in catg:
        path = os.path.join(DATADIR,category)
        class_num = catg.index(category)
        for img in os.listdir(path):
            try:#if some images are broken do this
                img_array = cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array,(img_size,img_size2))
                training_data.append([new_array,class_num])
            except Exception as e:
                pass
create_training_data()
print(len(training_data))
trainX = [] #features
trainy = [] #labels
for features , label in training_data:
    trainX.append(features)
    trainy.append(label)
trainX = np.array(trainX).reshape(-1,img_size,img_size2,1)
trainy = np.array(trainy)
trainy = to_categorical(trainy, num_classes=10)
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout , Activation , Flatten , Conv2D, MaxPooling2D
model = Sequential()
model.add(Conv2D(16,(5,5),input_shape = (32,32,1)))
model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size =(2,2),strides = 2))
model.add(Conv2D(32,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2),strides = 2))
model.add(Dropout(0.25))
model.add(Conv2D(64,(3,3)))
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size = (2,2),strides = 2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(units = 512))
model.add(Activation('relu'))
model.add(Dense(units = 256))
model.add(Activation('relu'))
model.add(Dense(units = 128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(units = 10))
model.add(Activation('softmax'))
adam = tf.keras.optimizers.Adam(lr = 0.001,beta_1=0.9,beta_2=0.999,epsilon = None,decay = 0.0,amsgrad = False)
model.compile(loss = "categorical_crossentropy", optimizer = adam, metrics = ['accuracy'])
history = model.fit(trainX,trainy,batch_size=16 ,epochs=10,validation_split = 0.1)
# Loss Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['loss'],'r',linewidth=3.0)
plt.plot(history.history['val_loss'],'b',linewidth=3.0)
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Loss',fontsize=16)
plt.title('Loss Curves',fontsize=16)
# Accuracy Curves
plt.figure(figsize=[8,6])
plt.plot(history.history['acc'],'r',linewidth=3.0)
plt.plot(history.history['val_acc'],'b',linewidth=3.0)
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.title('Accuracy Curves',fontsize=16)
#predicting a single image ' [0] == dog  and [1] == cat'
img1 = cv2.imread('./testing_prediction/2.png',0)
img1 = cv2.resize(img1,(50,50))
plt.imshow(img1,'gray')
plt.axis("off")
plt.show()
img = image.img_to_array(img1)
img = img/255
img = np.expand_dims(img, axis=0)
images = np.vstack([img])
classes = model.predict_classes(images, batch_size=10)
print(classes)

我总是得到0的预测,即使我试图预测已经训练的图像。对于示例,如果我尝试使用书面数字2的图像,它将预测为0。如果它的8,则预测为0

考虑以下几点:

  • 您将培训图像大小调整为32 x 32,同时将数据测试到50 x 50。两者都必须相同。
  • 您忘记了将培训图像数据归一化。但是,您正在标准化测试数据。

    img = img/255
    

您应该像培训数据一样预处理图像数据。

最新更新