五种卷积神经网络解决猫狗分类问题(一):V1 简单线性网络

版本描述epochs训练精度验证精度
V1.0简单线性卷积神经网络10099%75%
V2.0添加了数据增强和dropout层10083%83%
V3.0使用预训练-特征提取-分步式10099%90%
V4.0使用预训练-特征提取-合并式10090%90%
V5.0使用预训练-微调模型10099%94%

五种卷积神经网络解决猫狗分类问题(零):总概要
五种卷积神经网络解决猫狗分类问题(一):V1 简单线性网络
五种卷积神经网络解决猫狗分类问题(二):V2 简单线性网络上添加数据增强和dropout层
五种卷积神经网络解决猫狗分类问题(三):V3 预训练-特征提取-分步式
五种卷积神经网络解决猫狗分类问题(四):V4 预训练-特征提取-合并式
五种卷积神经网络解决猫狗分类问题(五):V5 预训练-微调模型

1. 介绍

使用keras搭建简单线性网络。在猫狗数据集上训练,最终得到99%的训练精度和75%验证集精度,显然我们是想要验证集精度,但是75%不尽人意,不过我们也先来看看该方法。

2. 网络结构

网络通过卷积层、最大池化层和密集层搭建,网络结构如下:
在这里插入图片描述

3. 数据集

数据集是kaggle上的数据集,配合使用了数据生成器
关于数据生成器主要使用了keras的ImageDataGenerator类,关于该生成器给出参考文章:
1. 程序员大本营某文章
2. 知乎某文章
3. CSDN某文章

也可以通过自行百度和解读下方给出的完整代码来理解

4. 代码

4.1 猫狗数据集:包含25000张图像(每类别有12500张),但是我们只用一部分图像:
猫:
    训练集:1000张(0~1000张)
    验证集:500张(1000~1500张)
    测试集:500张(1500~2000张)
狗
    训练集:1000张
    验证集:500张
    测试集:500张

文件夹结构:

--dogs-vs-cats_small
  --train
        --cats
        --dogs
  --validation
        --cats
        --dogs
  --test
        --cats
        --dogs
4.2 网络结构:通过Conv2D和MaxPooling2D则组合堆叠
from keras import layers
from keras import models

model=models.Sequential()

# block 1
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(150,150,3)))
model.add(layers.MaxPool2D((2,2)))

# block 2
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# block 3
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# block 4
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPool2D((2,2)))

# output
model.add(layers.Flatten())  #展开为向量
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))       
          
model.summary()
4.3 配置模型(优化器)
from keras import optimizers

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['accuracy'])
4.4 数据预处理
  • 读取图像
  • 将JPEG解码为RGB文件
  • 将RGB图像转为浮点数张量
  • 将像素缩放到0~1间(归一化)

当然Keras有一个图像处理辅工具的模块,位于keras.preprocessing.image,特别是包含了ImageDataGenerator类,可以创建python生成器,将硬盘上的图像自动转换为与处理好的张量批量

from keras.preprocessing.image import ImageDataGenerator

train_datagen=ImageDataGenerator(rescale=1./255)  # 将所有图像乘以1/255缩放,归一化
validation_datagen=ImageDataGenerator(rescale=1./255)

# 参数分别指目标目录、调整为多少尺寸、batch_size、标签类型(因为使用了binary_crossentropy损失,所以需要用二进制标签)
train_generator=train_datagen.flow_from_directory(train_dir,
                                                 target_size=(150,150),
                                                  batch_size=20,
                                                  class_mode="binary"
                                                 )
validation_generator=validation_datagen.flow_from_directory(validation_dir,
                                                 target_size=(150,150), 
                                                  batch_size=20,
                                                  class_mode="binary"
                                                 )

# 查看train_generator产生的数据和标签的性质
for data_batch,labels_batch in train_generator:
    print("data batch shape:",data_batch.shape)
    print("lables batch shape:",labels_batch.shape)
    break

print的输出:

Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
data batch shape: (20, 150, 150, 3)
lables batch shape: (20,)
4.5 开始训练

在这里传入的数据和标签不再是以前的直接传入,而是使用生成器传入。fit_generator文档
这里也介绍下其参数

fit_generator(generator,
steps_per_epoch=None, #一个epoch从generator产生的总步数,本例中一个generator是20张,故=2000/20=100,需要100次generator
epochs=1,
verbose=1, # 日志显示模式: 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
callbacks=None,
validation_data=None,
validation_steps=None, #同steps_per_epoch,仅当validation_data为生成器才可用
class_weight=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
shuffle=True, #是否在每轮迭代之前打乱 batch 的顺序
initial_epoch=0)

history=model.fit_generator(train_generator,
                           steps_per_epoch=100,
                           epochs=30,
                           validation_data=validation_generator,
                           validation_steps=50)
4.6 保存模型
model.save("cats_and_dogs_small_1.h5")
4.7 可视化
import matplotlib.pyplot as plt
acc=history.history['accuracy']
print("训练最佳精度:",max(acc))
val_acc=history.history['val_accuracy']
print("验证最佳精度:",max(val_acc))

loss=history.history['loss']
val_loss=history.history['val_loss']

epochs=range(1,len(acc)+1)

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.plot(epochs,loss,'bo',label='Training loss')
plt.plot(epochs,val_loss,'b',label='Validation loss')
plt.title('Training and validation loss')
plt.legend()  #创建图例

plt.show()

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值