我正在尝试使用一个训练集206张图像和一个测试集19张图像的类来构建CNN。
我建立了一个包含2个卷积层和一个完整连接的模型。我已将辍学添加到完整连接中,以避免过拟合。
在第一个时期,损耗从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'
答案 0 :(得分:1)
您的训练和测试数据将按比例缩放1/255。但是在预测时,您不会重新缩放图像。 尝试按如下所示重新缩放图像。
test_image *= (1/255.0)
result = classifier.predict(test_image)
编辑:
如果训练和测试数据集具有单个类别,则该模型将无法将输入分为两个类别。您的预测应基于训练和测试数据类(您的预测数据集应来自类似于训练和测试数据集分布的分布)。如果训练和测试数据集中有两个类,则尝试为(第一个)类分配0,为其他(第二个)分配1。然后,当预测类别时,如果模型预测的数量小于0.5,则表示在预测第一类;如果模型预测数量大于或等于0.5,则模型在预测第二类。