如何用keras cnn 做kaggle猫狗大战图片识别

本文介绍了一个简单的猫狗图像分类项目,使用Kaggle提供的数据集并选取2000张图片进行训练。通过数据预处理及构建卷积神经网络模型,实现了较高的分类准确率。

1、数据简介

这份数据集来源于Kaggle,原数据集有12500只猫和12500只狗,因单机cpu跑,这里我只选取了2000张图片,工具用的是基于tensorflow的keras。数据如下所示:
这里写图片描述

2、数据预处理

这部分代码如下:

import os  # 处理字符串路径
import glob  # 查找文件
from keras.models import Sequential  # 导入Sequential模型
from keras.layers.core import Flatten, Dense, Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD
import numpy as np
from pandas import Series, DataFrame
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.advanced_activations import PReLU
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
from six.moves import range
#加载数据
import os
from PIL import Image
import numpy as np
#读取文件夹train下的42000张图片,图片为彩色图,所以为3通道,
#如果是将彩色图作为输入,图像大小224*224
def load_data():
    sed = 1000
    data = np.empty((2000,224,224,3),dtype="float32")
    label = np.empty((2000,))
    imgs = os.listdir("d:/cat_dog/train/")
    num = len(imgs)
    times = 0
    time = 0
    for i in range(num):

        if imgs[i].split('.')[0] == 'cat':
            if times ==1000:
                continue
            img = Image.open("d:/cat_dog/train/" + imgs[i])

            arr = np.asarray(img, dtype="float32")
            arr.resize((224,224,3))
            data[i, :, :, :] = arr
            label[i] = 0
            times +=1


        else:

            img = Image.open("d:/cat_dog/train/" + imgs[i])

            arr = np.asarray(img, dtype="float32")
            arr.resize((224, 224, 3))
            data[1000+time, :, :, :] = arr
            label[1000+time] = 1
            time +=1
            if time == 1000:
                break

    return data,label
data,label = load_data()
print(data.shape)
train_data = data[:1800]
train_labels = label[:1800]
validation_data = data[1800:]
validation_labels = label[1800:]

3、使用cnn训练

本来想用vgg-16训练,无奈机子太渣,先上cnn,不过也能达到七八十正确率

model = Sequential()
#第一个卷积层,4个卷积核,每个卷积核大小5*5。
#激活函数用tanh
#你还可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))
model.add(Convolution2D(4, 5, 5,input_shape=(224, 224,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第二个卷积层,8个卷积核,每个卷积核大小3*3。
#激活函数用tanh
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(8, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#第三个卷积层,16个卷积核,每个卷积核大小3*3
#激活函数用tanh
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(16, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

#全连接层,先将前一层输出的二维特征图flatten为一维的。

model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
#sigmoid分类,输出是2类别
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.fit(train_data, train_labels,
         nb_epoch=50, batch_size=100,
         validation_data=(validation_data, validation_labels))

代码很简单,相信大家都能看懂,所以不多做解释。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值