Python 3.x 基于keras的多类别图像分类

Python 3.x 基于keras的多类别图像分类,python-3.x,opencv,keras,deep-learning,Python 3.x,Opencv,Keras,Deep Learning,你好,我正在尝试使用Keras和CNN构建一个图像分类器 我已经训练了一个二元分类模型,它运行得非常好 我运用同样的知识构建了一个使用多个类别的图像分类(失败得很惨) 我有5个类,我在jpeg dir中创建了5个文件夹,directoy结构如下 C:\Users\jpeg 1.训练 2.测试 在train文件夹中,我有5个子文件夹,每个文件夹对应一个类 C:\Users\jpeg\train 1.验证文档 2.证书和报告 3.文件 4.标题 5.沟通 我在每个文件夹中放置了适当的图像 在测试文件

你好,我正在尝试使用Keras和CNN构建一个图像分类器

我已经训练了一个二元分类模型,它运行得非常好

我运用同样的知识构建了一个使用多个类别的图像分类(失败得很惨) 我有5个类,我在jpeg dir中创建了5个文件夹,directoy结构如下

C:\Users\jpeg

1.训练

2.测试

在train文件夹中,我有5个子文件夹,每个文件夹对应一个类

C:\Users\jpeg\train

1.验证文档
2.证书和报告
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

当我测试来自授权文档、标题等的图像时,o/p相同

我没有看到我的代码中有任何错误,因为这段代码用于二进制分类。请告知

另外,我想找到与我得到的输出相关联的标签

请告知


谢谢。

您可以做很多事情来排除故障。样本数量真的很重要;你应该知道这一点。好的,如果我认为我有足够的样本,我会保存来自生成器的图像以检查它们是否正常(flow_from_directory-save_to_dir参数)


此外,在培训期间,您可以使用回调检查tensorboard(如果您使用的是tensorflow),查看您的学习情况有多差/好。看一看。请注意,最重要的是val_acc。

您可以做很多事情来排除故障。样本数量真的很重要;你应该知道这一点。好的,如果我认为我有足够的样本,我会保存来自生成器的图像以检查它们是否正常(flow_from_directory-save_to_dir参数)


此外,在培训期间,您可以使用回调检查tensorboard(如果您使用的是tensorflow),查看您的学习情况有多差/好。看一看。请注意,最重要的是val_acc。

是的,感谢您的输入,但是model.predict_类应该使用类标签(有些地方提到,对于超过2个类,它返回一个onehot编码值),但我只得到一个数组[2],我想知道它预测的标签值。是的,感谢您的输入,但是model.predict\u类应该使用类标签(有些地方提到,对于2个以上的类,它会返回一个onehot编码值),但我只得到一个数组[2],我想知道它预测的是什么标签值。