您好,我正在尝试使用Keras和CNN构建图像分类器
我已经训练了一个用于二进制分类的模型,并且效果很好。
我运用相同的知识使用多个类别建立了图像分类(不幸失败了) 我有5个类,我在jpeg目录中创建了5个文件夹,directoy的结构如下
C:\ Users \ jpeg
1.train
2.test
火车内部文件夹中,我有5个子文件夹,每个文件夹对应一个班级
C:\ Users \ jpeg \ train
1.Auth_Docs
2.Certificates_Reports
3.文件
4.标题
5.沟通
我在每个文件夹中放置了适当的图像
在测试文件夹中也遵循完全相同的结构
源代码:
import matplotlib.pyplot as plt
import cv2
%matplotlib inline
from keras.preprocessing.image import ImageDataGenerator
image_gen.flow_from_directory('C://Users/Jpeg/train')
image_gen.flow_from_directory('C://Users/jpeg/test')
image_shape = (150,150,3)
from keras.models import Sequential
from keras.layers import Activation, Dropout, Flatten, Dense, Conv2D, MaxPooling2D
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=64, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(filters=64, kernel_size=(3,3),input_shape=(150,150,3), activation='relu',))
model.add(MaxPooling2D(pool_size=(2, 2)))
#
model.add(Flatten())
#hidden layer number of neurons
model.add(Dense(256, activation='relu'))
# Here we say randomly turn off 30% of neurons.
model.add(Dropout(0.3))
# Last layer(add number of layers based on number of categories)
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
#Training the model
batch_size = 16
train_image_gen = image_gen.flow_from_directory('C://Users/jpeg/train',
target_size=image_shape[:2],
batch_size=batch_size,
class_mode='categorical'
)
#Found 2434 images belonging to 5 classes.
test_image_gen = image_gen.flow_from_directory('C://Users/jpeg/test',
target_size=image_shape[:2],
batch_size=batch_size,
class_mode='categorical'
)
#Found 60 images belonging to 5 classes.
train_image_gen.class_indices
#o/p
{'Auth_Docs': 0,
'Certificates_Reports': 1,
'Document': 2,
'Title': 3,
'communication': 4}
#Fitting the model
from PIL import Image
Image.MAX_IMAGE_PIXELS = None
results = model.fit_generator(train_image_gen,epochs=50,
steps_per_epoch=100,
validation_data=test_image_gen,
validation_steps=12)
#saving the model
model.save('Document_Classification.h5')
#results.accuracy for my model gives around 80% of accuracy
现在是测试模型的问题
from keras.models import load_model
new_model = load_model('Document_Classification.h5')
import numpy as np
from keras.preprocessing import image
import os,sys
from PIL import Image
Image.MAX_IMAGE_PIXELS = None
for a,b,c in os.walk("C:/Users/jpeg/test/communication"):
for i in c:
doc_img = image.load_img(os.path.join(a,i), target_size=(150, 150))
doc_img = image.img_to_array(doc_img)
doc_img = np.expand_dims(doc_img, axis=0)
doc_img = doc_img/255
#print (a,i)
prediction_prob = new_model.predict_classes(doc_img)
print(prediction_prob )
我得到的唯一输出是
[2]
[2]
[2]
[2]
无论我用来测试o / p的哪个文件夹都是相同的,即在上面的示例中,我使用了通信文件夹图像,而o / p为2
当我测试来自Auth_Docs,标题等的图像时,o / p相同。
由于该代码适用于二进制分类,因此我没有看到任何错误。请指教
此外,我想查找与我得到的输出相关的标签。
请告知。
谢谢。
答案 0 :(得分:0)
您可以执行许多操作来进行故障排除。样本数量确实很重要;你应该知道这一点。好吧,如果我认为我有足够的样本,我会保存生成器中的图像以检查它们是否还行(flow_from_directory-save_to_dir参数)。
https://keras.io/preprocessing/image/
此外,在训练时,您可以使用回调检查tensorboard(如果使用tensorflow)以了解学习的好坏。看看this video。看到最重要的是val_acc。