【问题标题】:CNN - Training Accuracy is 1.0 and Validation Accuracy is 1.0. Prediction returning 0.0CNN - 训练准确度为 1.0,验证准确度为 1.0。预测返回 0.0
【发布时间】:2018-12-01 22:31:03
【问题描述】:

我正在尝试构建一个包含 206 个图像的训练集和单个类的 19 个图像的测试集的 CNN。

我构建了一个包含 2 个卷积层和一个全连接的模型。我在全连接中添加了 dropout 以避免过度拟合。

在第一个 epoch 中,损失从 0.02 开始,准确度为 0.88。验证准确度为 1.00。对于其他 49 个 epoch,训练和验证准确度保持在 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 个类。只有一个班级是错误的吗?如何处理单类相关的训练或预测?
  • 您的训练和测试数据集只有一个类。我不明白你说的一节课是什么意思?并解释错误和正确的图像。
  • 我不知道有必要有“错误”和“正确”的图像。
  • 那么模型就不可能分为两类。您的预测应基于训练和测试数据类。如果您在训练和测试数据集中有两个类,则尝试为其中一个(第一个)类分配 0,为其他(第二个)分配 1。然后在预测类别时,如果模型预测的数字小于 0.5,则预测第一类,如果模型预测的数字大于或等于 0.5,则模型预测第二类。

标签: python keras deep-learning predict convolutional-neural-network


【解决方案1】:

您的训练和测试数据按 1/255 因子重新缩放。但是在预测时,您不会重新缩放图像。 尝试按如下方式重新缩放图像。

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

编辑:

如果训练和测试数据集只有一个类,那么模型就不可能将输入分为两个类。您的预测应该基于训练和测试数据类(您的预测数据集应该来自类似于训练和测试数据集分布的分布)。如果您在训练和测试数据集中有两个类,则尝试为其中一个(第一个)类分配 0,为其他(第二个)分配 1。然后在预测类别时,如果模型预测的数字小于 0.5,则预测第一类,如果模型预测的数字大于或等于 0.5,则模型预测第二类

【讨论】:

  • 谢谢。现在结果不返回 0.0。但在 1.09171e-34 和 2.1486e-37 的范围内。两幅图像的预测仍为“否”
猜你喜欢
  • 2020-11-06
  • 2021-07-22
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2020-10-16
  • 2020-03-29
  • 2020-11-02
相关资源
最近更新 更多