繁体   English   中英

测试准确度是0%,而训练准确度是99%(神经网络/ Keras)

[英]Testing accuracy is 0% while training accuracy is 99% (Neural network / Keras)

我在训练卷积神经网络时遇到问题。 我目前正在使用tensorflow库。 看来,当我进行训练时,通过逐个检查其预测来测试它的准确性似乎是99.92%,而我得到的准确度是0%。 我一直想弄清楚为什么会这样。

在这里,我在此处的链接中提供了测试和训练数据集,以及火车之后的.h5文件: https ://drive.google.com/drive/folders/1H77JZIK91PohC2q1u1wp90_fVWbvEiSL?usp=sharing

这是训练代码

import tensorflow as tf 
from keras.preprocessing.image import ImageDataGenerator

#To prevent overfitting -> training on the same images
#DATA PREPROCESSING
#TRAIN 
train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True ) 
training_set = train_datagen.flow_from_directory(
   'dataset_with_features/train',
   target_size=(64,64),
   batch_size=32,
   class_mode='categorical' )

#TEST test_datagen = ImageDataGenerator(rescale=1./255) 
test_set = test_datagen.flow_from_directory(
   'dataset_with_features/test',
    target_size=(64,64),
    batch_size=32,
    class_mode='categorical' )

#BUILDING THE CONVOLUTIONAL NEURAL NETWORK 
cnn = tf.keras.models.Sequential() 
#Sequence of layers
#CONVOLUTION 1
cnn.add(tf.keras.layers.Conv2D(filters=128,
    kernel_size=3,
    activation='relu',
    input_shape=[64,64,3]))
#POOLING 1 
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))
#CONVOLUTION 2 
cnn.add(tf.keras.layers.Conv2D(filters=64,kernel_size=3,activation='relu'))
#POOLING 2 
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))
#CONVOLUTION 3 
cnn.add(tf.keras.layers.Conv2D(filters=32,kernel_size=3,activation='relu'))
#POOLING 3 
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))

#FLATTENING 
cnn.add(tf.keras.layers.Flatten())
#FULL CONNECTION 
cnn.add(tf.keras.layers.Dense(units=256,activation='relu')) 
cnn.add(tf.keras.layers.Dense(units=128,activation='relu')) 
cnn.add(tf.keras.layers.Dense(8,activation='softmax'))

#TRAINING THE CONVOLUTIONAL NEURAL NETWORK
#Compiling the CNN
cnn.compile(loss='categorical_crossentropy',
    optimizer='rmsprop',
    metrics['accuracy'])
#Training the CNN on the Training set and evaluating it on the Test set 
cnn.fit(x=training_set,validation_data=test_set,epochs=15)

#SAVING THE MODEL 
cnn.save('C:\PythonPrograms\Deep Learning Models\preprocessed_features_model.h5')

这是测试代码

#Load model 
from keras.models import load_model 
model = load_model('C:/PythonPrograms/Deep Learning Models/preprocessed_features_model.h5')

#Predict function 
import os 
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
from keras.preprocessing import image

def predict_class(class_no):
    directory = 'dataset_with_features/test/'
    class_no = str(class_no)+'/'
    path = os.path.join(directory,class_no)
    predict_results = []
    print("Class Number: {}".format(class_no[:len(class_no)-1]))
    for filename in os.listdir(path):
        test_image = image.load_img(
            os.path.join(path,filename),
            target_size=(64,64)
            )
        test_image = image.img_to_array(test_image)
        test_image = np.expand_dims(test_image,axis=0)
        result = model.predict(test_image)
        result = result.reshape(8)
        predict_results.append(result)
        print(result)
    return predict_results

def get_accuracy(predict_results,class_no):
    right = 0
    wrong = 0
    for result in predict_results:
        if result[class_no] == 1:
            right+=1
        else:
            wrong+=1
    accuracy = right/(right+wrong)
    return accuracy

results = [] 
accuracy_list = [] 
for i in range(8):
    result = predict_class(i)
    results.append(result)
    accuracy = get_accuracy(results[i],i)
    accuracy_list.append(accuracy)
    print("The accuracy for class {} is: ".format(i),accuracy)

ave_accuracy = sum(accuracy_list)/len(accuracy_list) 
print("Total accuracy: ",ave_accuracy)

据我了解,这可能是过拟合的原因。 但是没有意义的是,精度差异如何那么遥远? 从99.9%变为实际一致的0%。 就像在测试模型时完全避免正确的预测一样。 任何帮助,将不胜感激!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM