深度学习示例3-卷积神经网络(猫狗大战)_数据增强

在这里插入图片描述

搜索关注我的公众号 AI 学者

一、数据获取

  • 数据获取地址:

cats_vs_dogs_small.zip
链接: https://pan.baidu.com/s/1n3pACSk3FWCNKotqWVss6Q 提取码: sij9

  • 数据训练存放目录
- cats_vs_dogs_small
  - test
 	- cat
 	  - 1500~2499jpg
 	- dog
 	  - 1500~2499jpg
  - train
    - cat
      - 0~999jpg
    - dog
      - 0~999jpg
  - validation
    - cat
      - 1000~1499jpg
    - dog
      - 1000~1499jpg

二、代码示例

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.utils import image_dataset_from_directory
import pathlib

new_base_dir = pathlib.Path("./cats_vs_dogs_small")

train_dataset = image_dataset_from_directory(
    new_base_dir.absolute() / "train",
    image_size=(180, 180),
    batch_size=32)
validation_dataset = image_dataset_from_directory(
    new_base_dir.absolute() / "validation",
    image_size=(180, 180),
    batch_size=32)
test_dataset = image_dataset_from_directory(
    new_base_dir.absolute() / "test",
    image_size=(180, 180),
    batch_size=32)

# 数据增强方式
data_augmentation = keras.Sequential(
    [
        layers.RandomFlip("horizontal"),
        layers.RandomRotation(0.1),
        layers.RandomZoom(0.2),
    ]
)

inputs = keras.Input(shape=(180, 180, 3))
# 数据增强
x = data_augmentation(inputs)
x = layers.Rescaling(1./255)(x)
x = layers.Conv2D(filters=32, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=256, kernel_size=3, activation="relu")(x)
x = layers.MaxPooling2D(pool_size=2)(x)
x = layers.Conv2D(filters=256, kernel_size=3, activation="relu")(x)
x = layers.Flatten()(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(loss="binary_crossentropy",
optimizer="rmsprop",
metrics=["accuracy"])

callbacks = [
    keras.callbacks.ModelCheckpoint(
        filepath="convnet_from_scratch_with_augmentation.keras",
        save_best_only=True,
        monitor="val_loss"
    )
]

history = model.fit(
    train_dataset,
    epochs=64,
    validation_data=validation_dataset,
    callbacks=callbacks
)

三、代码解释

这段代码是使用TensorFlow和Keras库来构建和训练一个用于图像分类的卷积神经网络(CNN),具体是区分猫和狗的图片。以下是代码的主要部分及其解释:

  1. 导入必要的库

    • tensorflow.keras:用于构建和训练模型。
    • pathlib:用于处理文件路径。
  2. 设置数据目录

    • 使用pathlib.Path来定义数据集的根目录new_base_dir
  3. 加载数据集

    • 使用image_dataset_from_directory函数从指定的目录加载训练集、验证集和测试集。这些目录应该分别包含猫和狗的图片,并且已经按照trainvalidationtest进行了划分。
    • 图片大小被统一调整为180x180像素,批量大小设置为32。
  4. 数据增强

    • 创建一个数据增强序列,包括水平翻转、随机旋转(角度很小,0.1弧度约等于5.73度)和随机缩放(缩放比例在0.8到1.2之间)。
    • 注意:layers.RandomZoom(0.2)在TensorFlow的最新版本中可能已经被弃用或更改,通常使用layers.RandomZoom(height_factor=0.2, width_factor=0.2)或类似的参数来替代。
  5. 构建模型

    • 使用Keras的函数式API构建模型。
    • 输入层接受180x180x3(高度、宽度、颜色通道)的图片。
    • 数据增强层应用于输入。
    • 接着是归一化层,将像素值从0-255缩放到0-1。
    • 然后是多个卷积层和最大池化层的堆叠,用于提取特征。
    • 最后是全连接层(Dense),使用Dropout减少过拟合,输出层使用sigmoid激活函数进行二分类。
  6. 编译模型

    • 使用二元交叉熵损失函数(binary_crossentropy),因为这是一个二分类问题。
    • 优化器选择RMSprop。
    • 评估指标选择准确率(accuracy)。
  7. 设置回调函数

    • 使用ModelCheckpoint回调来保存验证损失最小的模型。
  8. 训练模型

    • 使用fit方法训练模型,指定训练数据、训练轮数(epochs)、验证数据和回调函数。

四、步骤详解

4.1 数据处理

train_dataset = image_dataset_from_directory(
    new_base_dir.absolute() / "train",
    image_size
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

象话

打赏犹如太阳穴的枪口

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

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

打赏作者

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

抵扣说明:

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

余额充值