Keras二进制分类:相同的预测输出类

时间:2017-11-20 07:47:18

标签: tensorflow machine-learning deep-learning keras conv-neural-network

我正在使用Keras序列模型进行图像分类。我的问题是找到图像的任何部分中存在的特定水印。我正在使用9000张图像的数据集。 Keras后端是Tensorflow。

Keras==2.0.4  
tensorflow==1.2.1

在训练时,我的准确率为86%,val_acc为91%。但是所有预测结果都归类为一个类别。

用于培训的计划如下:

import h5py
import numpy as np
import cv2
import keras
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 Activation, Dropout
from keras.preprocessing.image import ImageDataGenerator
from PIL import ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True

classifier = Sequential()
classifier.add(Convolution2D(32, 3, 3, input_shape = (150, 150, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Convolution2D(64, 3, 3))
classifier.add(Activation('relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Flatten())
classifier.add(Dense(output_dim = 64, activation = 'relu'))
classifier.add(Dropout(0.5))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))
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)
                                   #rotation_range=15,
                                   #zca_whitening=True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('train',
                                                 target_size = (150, 150),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('test',
                                            target_size = (150, 150),
                                            batch_size = 32,
                                            class_mode = 'binary')

callbacks = [
  keras.callbacks.EarlyStopping(
    monitor='val_loss', patience=10, verbose=0)
  ]

hist = classifier.fit_generator(training_set,
                         samples_per_epoch = 9000,
                         nb_epoch = 10,
                         validation_data = test_set,
                         nb_val_samples = 3000,
                         callbacks=callbacks)
                         # )

train目录有2个子目录:watermarknonwatermark。我做错了吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你的班级不平衡吗? 86%& 91%的准确率似乎很高但如果所有的预测结果都归类为一个类别,那么可能一个类别比另一个大得多。

没有问题,您可以拥有不平衡的类别但是要知道您的模型正在学习,您需要的准确度远高于91%。

我也同意Gupta上面的评论,即你的网络很浅,使用预训练网络对你有足够的帮助。

修改

变化

classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))

classifier.add(Dense(output_dim = 2, activation = 'softmax'))

loss = 'binary_crossentropy'loss = 'categorical_crossentropy'