首页 文章

CNN - 培训准确度为1.0,验证准确度为1.0 . 预测返回0.0

提问于
浏览
0

我正在尝试 Build 一个CNN,其训练集为206个图像,并测试一组19个图像 .

我已经构建了一个包含2个卷积层和一个完整连接的模型 . 我已将dropout添加到完整连接以避免过度拟合 .

在第一个时期,损失从0.02开始,准确度为0.88 . 验证准确度为1.00 . 对于49个其他时期,训练和验证准确度保持在1.00 .

只是为了检查,我试图预测使用正确的图像和错误的图像 . 两次预测都返回0.0

我究竟做错了什么?

# Tanjavur Painting Detection

# Part 1 Building CNN
# Importing Keras packages
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout

# Initializing a CNN
classifier = Sequential()

# Adding Convolution Layer
classifier.add(Convolution2D(32, 3,input_shape = (64, 64, 3), activation = 'relu'))

# Pooling
classifier.add(MaxPooling2D(pool_size = 2))

# Additional Convolutional Layer
classifier.add(Convolution2D(32, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = 2))

# Flattening
classifier.add(Flatten())

# Full Connection
classifier.add(Dense(256, activation = 'relu'))
classifier.add(Dropout(.4))
classifier.add(Dense(1, activation = 'sigmoid'))

# Compile CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Part 2 - Fitting Image set to CNN

# IMAGE Preprocessing & then Fitting
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory('Tanjore_Paintings/Tanjavur_Train',
                                            target_size=(64, 64),
                                            batch_size=5,
                                            class_mode='binary')

test_set = test_datagen.flow_from_directory('Tanjore_Paintings/Tanjavur_Test',
                                            target_size=(64, 64),
                                            batch_size=5,
                                            class_mode='binary')
classifier.fit_generator(training_set,
                    steps_per_epoch = 206,
                    epochs = 50,
                    validation_data = test_set,
                    validation_steps = 19)

# Part 3 - Making predictions

import numpy as np
from keras.preprocessing import image
test_image = image.load_img('Tanjore_Paintings/Tanjore_Painting_Test_2.jpg', target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
    prediction = 'Yes'
else:
    prediction = 'No'

1 回答

  • 1

    您的训练和测试数据重新调整为1/255倍 . 但是在预测时你不会重新缩放图像 . 尝试按如下方式重新缩放图像 .

    test_image *= (1/255.0)
    result = classifier.predict(test_image)
    

    编辑:

    如果训练和测试数据集具有单个类,则模型无法将输入分类为两个类 . 您的预测应基于训练和测试数据类(您的预测数据集应来自与训练和测试数据集分布类似的分布) . 如果您在train和test数据集中有两个类,则尝试为(第一个)类中的一个分配0,为其他(第二个)分配1 . 然后在预测类时,如果模型预测数量小于0.5,则预测第一类,如果模型预测数量大于或等于0.5,则模型预测第二类

相关问题