python-3.x - CNN 低准确率猫狗数据集
问题描述
我有一个火车文件夹,其中包含猫文件夹(里面有 5000 张照片)和狗文件夹(里面有 4000 张照片)。另外,我有一个测试文件夹,其中包含猫文件夹(2500 张图片)和狗文件夹(2000 张图片)。我编写了以下代码来应用 CNN 图像分类
代码:
from keras.models import Sequential
from keras.layers import Conv2D,Activation,MaxPooling2D,Dense,Flatten,Dropout
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from IPython.display import display
import matplotlib.pyplot as plt
from PIL import Image
from sklearn.metrics import classification_report, confusion_matrix
classifier = Sequential()
classifier.add(Conv2D(32,(3,3),input_shape=(64,64,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Conv2D(32,(3,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Conv2D(64,(3,3)))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size =(2,2)))
classifier.add(Flatten())
classifier.add(Dense(64))
classifier.add(Activation('relu'))
classifier.add(Dropout(0.5))
classifier.add(Dense(1))
classifier.add(Activation('sigmoid'))
classifier.summary()
classifier.compile(optimizer ='rmsprop',
loss ='binary_crossentropy',
metrics =['accuracy'])
train_datagen = ImageDataGenerator(rescale =1./255,
shear_range =0.2,
zoom_range = 0.2,
horizontal_flip =True)
test_datagen = ImageDataGenerator(rescale = 1./255)
batchsize=500
training_set = train_datagen.flow_from_directory('/home/osboxes/Downloads/dogs-vs-cats/train/',
target_size=(64,64),
batch_size= batchsize,
class_mode='binary')
test_set = test_datagen.flow_from_directory('/home/osboxes/Downloads/dogs-vs-cats/test/',
target_size = (64,64),
batch_size = batchsize,
shuffle=False,
class_mode ='binary')
history=classifier.fit_generator(training_set,
steps_per_epoch =9000/batchsize,
epochs = 3,
validation_data =test_set,
validation_steps = 4500/batchsize)
Y_pred = classifier.predict_generator(test_set, 4500 / batchsize)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(test_set.classes, y_pred))
print('Classification Report')
target_names = ['cats', 'dogs']
print(classification_report(test_set.classes, y_pred, target_names=target_names))
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
结果混淆矩阵为:
混淆矩阵
[[2500 0]
[2000 0]]
我的问题是:
1- 为什么所有的狗实例都被归类为猫
2-猫和狗训练文件夹之间可以有不同的样本数吗?还是测试文件夹?或者它们必须完全相同?
3-如果我需要添加例如马图片,如何添加多类分类器?
解决方案
1-因为你说classifier.add(Dense(1))
这意味着你只有一门课。既然你有两个,你必须把classifier.add(Dense(2))
你的损失改成loss ='categorical_crossentropy'
2-是的,每个班级的图像数量之间有一点差异是可以的(但应该不会有太大差异)
3-按照我说的改变损失并放classifier.add(Dense(3))
最好使用Adam 优化器并BatchNormalization()
在每个Activation()
函数之前使用。
推荐阅读
- php - 我想将所有子文件夹页面重定向到子域我该怎么做?
- cypress - 赛普拉斯配置插值
- mininet - 将 mininet 连接到不同计算机中的 Open vSwitch
- python - TypeError:structure_similarity() 采用 2 个位置参数,但给出了 8 个
- python - 仅将当前页面对象发送到模板(django)
- ios - AFNetworking for iOS 下一次更新 Objective-C
- visual-studio - 我在 APP (XAML) (Visual Studio) 中看不到文本块或文本框
- c++ - 当我从我的头文件和实现文件调用我的函数到我的主文件时,我没有得到任何输出
- azure-devops - Azure DevOps 排序发布阶段
- java - 拖放到每个标签 javafx