python - 尽管在训练和测试中具有非常好的准确性,但 CNN 在随机图像上表现不佳
问题描述
enter code here
from tensorflow import keras
classifier = keras.Sequential()
classifier.add(keras.layers.Convolution2D(16,kernel_size=(3,3),input_shape = (64,64,3),activation =
'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2)))
classifier.add(keras.layers.Convolution2D(32,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2)))
#classifier.add(keras.layers.BatchNormalization())
classifier.add(keras.layers.Convolution2D(64,kernel_size=(3, 3),activation = 'relu'))
classifier.add(keras.layers.MaxPooling2D(pool_size = (2, 2)))
classifier.add(keras.layers.Dropout(0.2))
classifier.add(keras.layers.Flatten())
classifier.add(keras.layers.Dense(128, activation = 'relu'))
classifier.add(keras.layers.Dense( 1, activation = 'sigmoid'))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Part 2 - Fitting the CNN to the images
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(r'C:\Users\KIIT\Desktop\Deep Learning\dataset2\Training_set',
target_size = (64, 64),
batch_size = 8,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory(r'C:\Users\KIIT\Desktop\Deep Learning\dataset2\Test_set',
target_size = (64, 64),
batch_size = 8,
class_mode = 'binary')
classifier.fit_generator(training_set,
steps_per_epoch =2140,
epochs = 30,
validation_data = test_set,
validation_steps = 90)
import numpy as np
from keras_preprocessing import image
test_image=image.load_img(r'D:\IDM DOWNLOADS\Data Set A-Z DL\Convolutional_Neural_Networks\dataset\single_prediction\shifaface6.jpg',target_size=(64,64))
test_image=image.array_to_img(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='Shifa'
else:
prediction='Rishav'
经过训练和测试后,我在测试和训练集中都获得了接近 100% 的准确率,但是当我给出 Shifa 的图像时,它仍然将其归类为 Rishav,而 Rishav 的图像被归类为 Rishav。我的数据集包含每个类的 1070 张图像用于训练和 45 幅图像用于每个类别的测试。
解决方案
不要忘记通过将新图像除以 255 来重新缩放新图像的像素范围
推荐阅读
- ruby-on-rails - 如何将对控制器方法的访问限制为仅经过身份验证的用户?
- python - 如何使用参数从另一个 .ipynb 文件执行 .ipynb 文件?
- mysql - 'sql_require_primary_key' - 无法在不创建主键的情况下将我的数据帧发送到 mysql 服务器
- angular - 以角度将单个令牌解析为多个服务
- java - plugin.xml 导致 Intellij IDE 中的构建失败
- mysql - Mysql 最小求和。找出总分最低的学生姓名?
- javascript - 将 Firestore 时间戳发送到外部 API UTC 丢失
- python - 确定在 Python 多处理期间腌制的确切内容
- twitter-bootstrap - Bootstrap - 更改宽度不改变高度
- nsis - 如何从 Internet 下载文件并将其路径应用于 MUI_PAGE_LICENSE 宏?