您的位置:首页 > 其它

[置顶] 如何用keras cnn 做kaggle猫狗大战图片识别

2017-05-17 19:29 302 查看

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=10, batch_size=100,
validation_data=(validation_data, validation_labels))


代码很简单,相信大家都能看懂,所以不多做解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: