keras分类之二分类实例(Cat and dog)
时间:2022-07-27
本文章向大家介绍keras分类之二分类实例(Cat and dog),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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_Projecttrain',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)就是小编分享给大家的全部内容了,希望能给大家一个参考。
- 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码
- 深入浅出MongoDB复制
- Selenium2+python自动化34-获取输入框联想词
- 分解质因子(个人模版)
- 高斯混合聚类(GMM)及代码实现
- 预处理素数(个人模版)
- Cnm%(个人模版)
- Selenium2+python自动化33-文件上传(send_keys)
- hive的partition的作用和使用方法
- 线段树,最大值查询位子(个人模版)
- set使用实例1+lower_bound(val)(个人模版)
- Selenium2+python自动化29-js处理多窗口
- 谷歌「机弦」有何玄机?
- 01字典树贪心查询+建立+删除(个人模版)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 机器学习笔记之梯度下降算法原理讲解
- 使用OpenCV在Python中进行图像处理
- R语言对布丰投针(蒲丰投针)实验进行模拟和动态可视化生成GIF动画
- Shiny-R语言轻松开发交互式web应用
- SPSS中的等级线性模型Multilevel linear models研究整容手术数据
- Python花式表白
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- WordPress运行内存不足的解决方式
- ggplot2 |legend参数设置,图形精雕细琢
- miRBase物种名缩写
- Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据
- 在R语言中使用航空公司复杂网络对疫情进行建模
- R语言用关联规则和聚类模型挖掘处方数据探索药物配伍中的规律
- ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
- ggalluvial|炫酷桑基图(Sankey),你也可以秀