对于使用CNN和Keras Tf python的猫狗分类数据集,精度不够高

对于使用CNN和Keras Tf python的猫狗分类数据集,精度不够高,python,keras,conv-neural-network,Python,Keras,Conv Neural Network,伙计们,我正试图用CNN对狗和猫的数据集进行分类。我正在深入学习初学者顺便说一句 数据集链接可以从中获得。我还使用MLP对上述数据集进行了分类,训练准确率为70%,测试准确率为62%。所以我决定用CNN来提高分数 但不幸的是,我仍然得到了非常相似的结果。这是我的密码: from sklearn.cross_validation import train_test_split from sklearn.preprocessing import LabelEncoder from keras.lay

伙计们,我正试图用CNN对狗和猫的数据集进行分类。我正在深入学习初学者顺便说一句

数据集链接可以从中获得。我还使用MLP对上述数据集进行了分类,训练准确率为70%,测试准确率为62%。所以我决定用CNN来提高分数

但不幸的是,我仍然得到了非常相似的结果。这是我的密码:

from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelEncoder
from keras.layers import Dense, Activation, Flatten, Dropout
from keras.layers.convolutional import Convolution2D
from keras.layers.convolutional import MaxPooling2D
from keras.models import Sequential
from keras.utils import np_utils
from keras.optimizers import SGD
from keras.datasets import mnist
from keras import backend as K
from imutils import paths
import numpy as np
import argparse
import cPickle
import h5py
import sys
import cv2
import os

K.set_image_dim_ordering('th')

def image_to_feature_vector(image, size=(28, 28)):
    return cv2.resize(image, size)

print("[INFO] pre-processing images...")
imagePaths = list(paths.list_images(raw_input('path to dataset: ')))

data   = []
labels = []

for (i, imagePath) in enumerate(imagePaths):
    image = cv2.imread(imagePath)
    label = imagePath.split(os.path.sep)[-1].split(".")[0]
    features = image_to_feature_vector(image)
    data.append(features)
    labels.append(label)

    if i > 0 and i % 1000 == 0:
        print("[INFO] processed {}/{}".format(i, len(imagePaths)))

le     = LabelEncoder()
labels = le.fit_transform(labels)
labels = np_utils.to_categorical(labels, 2)
data   = np.array(data) / 255.0

print("[INFO] constructing training/testing split...")
(X_train, X_test, y_train, y_test) = train_test_split(data, labels, test_size=0.25, random_state=42)

X_train = X_train.reshape(X_train.shape[0], 3, 28, 28).astype('float32')
X_test  = X_test.reshape(X_test.shape[0], 3, 28, 28).astype('float32')
num_classes = y_test.shape[1]

def basic_model():
    model = Sequential()
    model.add(Convolution2D(32, 3, 3, border_mode='valid', init='uniform', bias=True, input_shape=(3, 28, 28), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(num_classes, activation='softmax'))

    sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
    return model

model = basic_model()

model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_epoch=25, batch_size=50, shuffle=True, verbose=1)

print('[INFO] Evaluating the model on test data...')
scores = model.evaluate(X_test, y_test, batch_size=100, verbose=1)
print("\nAccuracy: %.4f%%\n\n"%(scores[1]*100))
我使用的CNN模式非常基本,但我认为足够体面。我按照各种教程进行学习。我甚至使用了这种架构,但得到了类似的结果(65%的测试准确率):

对于Optimizer,我还尝试了使用默认参数的
adam
,对于
模型。complie
损失函数,我也尝试了
分类交叉熵
,但没有(或非常轻微)改善

你能告诉我哪里出了问题,或者我能做些什么来提高效率吗?(如果可能,在几个时期内)

(我是深度学习和keras编程的初学者…)

编辑:所以我设法达到了70.224%的测试准确率和74.27%的训练准确率。CNN架构是
CONV=>CONV=>POOL=>DROPOUT=>flant=>densed*3


(几乎没有过度拟合,因为培训acc:74%,测试是:70%基本上,你的人际网络不够深入。这就是为什么你的培训和验证准确性都很低。你可以尝试从两个方面深化你的人际网络

  • 为每个卷积层使用更多的过滤器。(30、5、5)或(15、3、3)是不够的。将第一个卷积层更改为(64、3、3)。在最大池化后,网络应提供“更深”的功能。因此,第二个不应是15,而是类似(64、3、3)甚至(128、3、3)的功能

  • 添加更多的卷积层。5或6层对于这个问题可能是好的

  • 总的来说,你的问题不仅仅是编程。更多的是关于CNN网络架构。你可以阅读更多关于这个主题的研究论文,以便更好地理解。对于这个具体问题,Keras提供了一个非常好的教程,介绍如何通过非常小的猫和狗图像集提高性能:

    使用(128,3,3)或(64,3,3)可以解决精度问题。您使用了多少个纪元?如果您使用20个以上的纪元就太好了

    试试这个:

    model.add(Convolution2D(32, 3, 3, 3, border_mode='full'))
    model.add(Activation('relu'))
    model.add(Convolution2D(32, 32, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(poolsize=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Convolution2D(64, 32, 3, 3, border_mode='full'))
    model.add(Activation('relu'))
    model.add(Convolution2D(64, 64, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(poolsize=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())
    model.add(Dense(64*8*8, 512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    
    model.add(Dense(512, 2))
    model.add(Activation('softmax'))
    

    首先,试着减去图像的意思:你有多少训练数据?我有25000(每只猫和狗12500个)训练集和12500(每只狗6250个)测试集
    model.add(Convolution2D(32, 3, 3, 3, border_mode='full'))
    model.add(Activation('relu'))
    model.add(Convolution2D(32, 32, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(poolsize=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Convolution2D(64, 32, 3, 3, border_mode='full'))
    model.add(Activation('relu'))
    model.add(Convolution2D(64, 64, 3, 3))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(poolsize=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())
    model.add(Dense(64*8*8, 512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    
    model.add(Dense(512, 2))
    model.add(Activation('softmax'))