如何提高CNN的准确性?

时间:2019-06-25 18:41:04

标签: python-3.x tensorflow keras deep-learning conv-neural-network

我是CNN的新手,但是对ML和神经网络有基本了解。

我想创建自己的可在Cats and Dogs数据集上使用的CNN。我对数据进行了预处理,并建立了我的网络,但是当我用数据拟合模型时,我的准确率就不能超过55%,这意味着该模型什么也没学。

有人可以在这里解释我在做什么错吗?

已经尝试了不同的学习率,甚至辍学,但徒劳

数据处理部分:

train_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\training_set'

test_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\test_set'

def label_image(img):
    label = img.split('.')[-3]
    if label == 'cat':
        return [1,0]
    if label == 'dog':
        return [0,1]

training=[]

for item1 in os.listdir(train_directory):
    path1 = os.path.join(train_directory, item1)
    for item in tqdm.tqdm(os.listdir(path1)):
        lab = label_image(item)
        img_path = os.path.join(path1, item)
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (50,50))
        training.append([np.array(img), lab])

testing=[]

for item1 in os.listdir(test_directory):
    path1 = os.path.join(test_directory, item1)
    for item in tqdm.tqdm(os.listdir(path1)):
        lab = label_image(item)
        img_path = os.path.join(path1, item)
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (50,50))
        testing.append([np.array(img), lab])

test_x = np.array([i[0] for i in testing]).reshape(-1,50,50,1)
test_y = [i[1] for i in testing]

X = np.array([i[0] for i in training]).reshape(-1,50,50,1)
Y = [i[1] for i in training]

以及CNN模型和优化器部分:

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3),padding='SAME', input_shape=X[0].shape))

model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.4))

model.add(Conv2D(filters=128, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.35))

#model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
#model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(rate=0.3))

model.add(Dense(2))
model.add(Activation('softmax'))

opt = keras.optimizers.SGD(lr=0.0001, decay=0.0)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics['accuracy'])
print(model.summary())

model.fit(X, np.array(Y), validation_data=(test_x, np.array(test_y)), epochs=30, verbose=2)

上述模型在运行时给出的准确度不超过50%。尝试了CNN构建的不同变体,不同的优化程序,但徒劳无功。

有什么我没看到的东西吗?

1 个答案:

答案 0 :(得分:0)

我终于可以工作了。

在调整并尝试了许多不同的学习率和优化器以及其他参数之后,我发现具有默认学习率的Adadelta最适合此操作。

谢谢大家为我提供帮助。

干杯。