keras分类之二分类实例(Cat and dog)


Posted in Python onJuly 09, 2020

1. 数据准备

在文件夹下分别建立训练目录train,验证目录validation,测试目录test,每个目录下建立dogs和cats两个目录,在dogs和cats目录下分别放入拍摄的狗和猫的图片,图片的大小可以不一样。

2. 数据读取

# 存储数据集的目录
base_dir = 'E:/python learn/dog_and_cat/data/'
 
# 训练、验证数据集的目录
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir, 'test')
 
# 猫训练图片所在目录
train_cats_dir = os.path.join(train_dir, 'cats')
 
# 狗训练图片所在目录
train_dogs_dir = os.path.join(train_dir, 'dogs')
 
# 猫验证图片所在目录
validation_cats_dir = os.path.join(validation_dir, 'cats')
 
# 狗验证数据集所在目录
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
 
print('total training cat images:', len(os.listdir(train_cats_dir))) 
print('total training dog images:', len(os.listdir(train_dogs_dir))) 
print('total validation cat images:', len(os.listdir(validation_cats_dir))) 
print('total validation dog images:', len(os.listdir(validation_dogs_dir)))

3. 模型建立

# 搭建模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu',
         input_shape=(150, 150, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
 
print(model.summary())
 
model.compile(loss='binary_crossentropy',
       optimizer=RMSprop(lr=1e-4),
       metrics=['acc'])

4. 模型训练

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
 
train_generator = train_datagen.flow_from_directory(
  train_dir, # target directory
  target_size=(150, 150), # resize图片
  batch_size=20,
  class_mode='binary'
)
 
validation_generator = test_datagen.flow_from_directory(
  validation_dir,
  target_size=(150, 150),
  batch_size=20,
  class_mode='binary'
)
 
for data_batch, labels_batch in train_generator:
  print('data batch shape:', data_batch.shape)
  print('labels batch shape:', labels_batch.shape)
  break
 
hist = model.fit_generator(
  train_generator,
  steps_per_epoch=100,
  epochs=10,
  validation_data=validation_generator,
  validation_steps=50
)
 
model.save('cats_and_dogs_small_1.h5')

5. 模型评估

acc = hist.history['acc']
val_acc = hist.history['val_acc']
loss = hist.history['loss']
val_loss = hist.history['val_loss']
 
epochs = range(len(acc))
 
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
 
plt.legend()
plt.figure()
 
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.legend()
plt.show()

6. 预测

imagename = 'E:/python learn/dog_and_cat/data/validation/dogs/dog.2026.jpg'
test_image = image.load_img(imagename, target_size = (150, 150))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result = model.predict(test_image)
 
if result[0][0] == 1:
  prediction ='dog'
else:
  prediction ='cat'
  
print(prediction)

代码在spyder下运行正常,一般情况下,可以将文件分为两个部分,一部分为Train.py,包含深度学习模型建立、训练和模型的存储,另一部分Predict.py,包含模型的读取,评价和预测

补充知识:keras 猫狗大战自搭网络以及vgg16应用

导入模块

import os
import numpy as np
import tensorflow as tf
import random
import seaborn as sns
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, Activation, Flatten, Input,BatchNormalization
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.optimizers import RMSprop, Adam, SGD
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator
from keras.applications.vgg16 import VGG16, preprocess_input
 
from sklearn.model_selection import train_test_split

加载数据集

def read_and_process_image(data_dir,width=64, height=64, channels=3, preprocess=False):
  train_images= [data_dir + i for i in os.listdir(data_dir)]
  
  random.shuffle(train_images)
  
  def read_image(file_path, preprocess):
    img = image.load_img(file_path, target_size=(height, width))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    # if preprocess:
      # x = preprocess_input(x)
    return x
  
  def prep_data(images, proprocess):
    count = len(images)
    data = np.ndarray((count, height, width, channels), dtype = np.float32)
    
    for i, image_file in enumerate(images):
      image = read_image(image_file, preprocess)
      data[i] = image
    
    return data
  
  def read_labels(file_path):
    labels = []
    for i in file_path:
      label = 1 if 'dog' in i else 0
      labels.append(label)
    
    return labels
  
  X = prep_data(train_images, preprocess)
  labels = read_labels(train_images)
  
  assert X.shape[0] == len(labels)
  print("Train shape: {}".format(X.shape))
  return X, labels

读取数据集

# 读取图片
WIDTH = 150
HEIGHT = 150
CHANNELS = 3
X, y = read_and_process_image('D:\\Python_Project\\train\\',width=WIDTH, height=HEIGHT, channels=CHANNELS)

查看数据集信息

# 统计y
sns.countplot(y)
 
# 显示图片
def show_cats_and_dogs(X, idx):
  plt.figure(figsize=(10,5), frameon=True)
  img = X[idx,:,:,::-1]
  img = img/255
  plt.imshow(img)
  plt.show()
 
 
for idx in range(0,3):
  show_cats_and_dogs(X, idx)
 
train_X = X[0:17500,:,:,:]
train_y = y[0:17500]
test_X = X[17500:25000,:,:,:]
test_y = y[17500:25000]
train_X.shape
test_X.shape

自定义神经网络层数

input_layer = Input((WIDTH, HEIGHT, CHANNELS))
# 第一层
z = input_layer
z = Conv2D(64, (3,3))(z)
z = BatchNormalization()(z)
z = Activation('relu')(z)
z = MaxPooling2D(pool_size = (2,2))(z)
 
z = Conv2D(64, (3,3))(z)
z = BatchNormalization()(z)
z = Activation('relu')(z)
z = MaxPooling2D(pool_size = (2,2))(z)
 
z = Conv2D(128, (3,3))(z)
z = BatchNormalization()(z)
z = Activation('relu')(z)
z = MaxPooling2D(pool_size = (2,2))(z)
 
z = Conv2D(128, (3,3))(z)
z = BatchNormalization()(z)
z = Activation('relu')(z)
z = MaxPooling2D(pool_size = (2,2))(z)
 
z = Flatten()(z)
z = Dense(64)(z)
z = BatchNormalization()(z)
z = Activation('relu')(z)
z = Dropout(0.5)(z)
z = Dense(1)(z)
z = Activation('sigmoid')(z)
 
model = Model(input_layer, z)
 
model.compile(
  optimizer = keras.optimizers.RMSprop(),
  loss = keras.losses.binary_crossentropy,
  metrics = [keras.metrics.binary_accuracy]
)
 
model.summary()

训练模型

history = model.fit(train_X,train_y, validation_data=(test_X, test_y),epochs=10,batch_size=128,verbose=True)
score = model.evaluate(test_X, test_y, verbose=0)
print("Large CNN Error: %.2f%%" %(100-score[1]*100))

复用vgg16模型

def vgg16_model(input_shape= (HEIGHT,WIDTH,CHANNELS)):
  vgg16 = VGG16(include_top=False, weights='imagenet',input_shape=input_shape)
  
  for layer in vgg16.layers:
    layer.trainable = False
  last = vgg16.output
  # 后面加入自己的模型
  x = Flatten()(last)
  x = Dense(256, activation='relu')(x)
  x = Dropout(0.5)(x)
  x = Dense(256, activation='relu')(x)
  x = Dropout(0.5)(x)
  x = Dense(1, activation='sigmoid')(x)
  
  model = Model(inputs=vgg16.input, outputs=x)
  
  return model

编译模型

model_vgg16 = vgg16_model()
model_vgg16.summary()
model_vgg16.compile(loss='binary_crossentropy',optimizer = Adam(0.0001), metrics = ['accuracy'])

训练模型

# 训练模型
history = model_vgg16.fit(train_X,train_y, validation_data=(test_X, test_y),epochs=5,batch_size=128,verbose=True)
score = model_vgg16.evaluate(test_X, test_y, verbose=0)
print("Large CNN Error: %.2f%%" %(100-score[1]*100))

以上这篇keras分类之二分类实例(Cat and dog)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用C++封装MySQL的API的教程
May 06 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
开源Web应用框架Django图文教程
Mar 09 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
python 模拟银行转账功能过程详解
Aug 06 Python
pandas 选取行和列数据的方法详解
Aug 08 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 #Python
Python2.x与3​​.x版本有哪些区别
Jul 09 #Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 #Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 #Python
python求解汉诺塔游戏
Jul 09 #Python
Django中Aggregation聚合的基本使用方法
Jul 09 #Python
Python  word实现读取及导出代码解析
Jul 09 #Python
You might like
社区(php&&mysql)五
2006/10/09 PHP
php Ajax乱码
2008/04/09 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
PHP实现事件机制的方法
2015/07/10 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
js 学习笔记(三)
2009/12/29 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python统计cpu利用率的方法
2015/06/02 Python
改进Django中的表单的简单方法
2015/07/17 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
制定岗位职责的原则
2013/11/08 职场文书
我爱我家教学反思
2014/05/01 职场文书
群众路线教育实践活动的心得体会
2014/09/03 职场文书
公司员工安全协议书
2014/11/21 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
Redis安装启动及常见数据类型
2021/04/14 Redis
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫