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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Python视频爬虫实现下载头条视频功能示例
May 07 Python
关于python写入文件自动换行的问题
Jun 23 Python
纯python进行矩阵的相乘运算的方法示例
Jul 17 Python
Python shutil模块用法实例分析
Oct 02 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
使用Django搭建网站实现商品分页功能
May 22 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
python操作kafka实践的示例代码
2019/06/19 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
学python安装的软件总结
2019/10/12 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
健康教育评估方案
2014/05/25 职场文书
庆元旦演讲稿
2014/09/15 职场文书
罚站检讨书
2015/01/29 职场文书
小学班主任个人总结
2015/03/03 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
送达通知书
2015/04/25 职场文书
校车安全管理责任书
2015/05/11 职场文书
画展观后感
2015/06/17 职场文书
Python - 10行代码集2000张美女图
2021/05/23 Python
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android