
搜索关注我的公众号 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),具体是区分猫和狗的图片。以下是代码的主要部分及其解释:
-
导入必要的库:
tensorflow.keras:用于构建和训练模型。pathlib:用于处理文件路径。
-
设置数据目录:
- 使用
pathlib.Path来定义数据集的根目录new_base_dir。
- 使用
-
加载数据集:
- 使用
image_dataset_from_directory函数从指定的目录加载训练集、验证集和测试集。这些目录应该分别包含猫和狗的图片,并且已经按照train、validation、test进行了划分。 - 图片大小被统一调整为180x180像素,批量大小设置为32。
- 使用
-
数据增强:
- 创建一个数据增强序列,包括水平翻转、随机旋转(角度很小,0.1弧度约等于5.73度)和随机缩放(缩放比例在0.8到1.2之间)。
- 注意:
layers.RandomZoom(0.2)在TensorFlow的最新版本中可能已经被弃用或更改,通常使用layers.RandomZoom(height_factor=0.2, width_factor=0.2)或类似的参数来替代。
-
构建模型:
- 使用Keras的函数式API构建模型。
- 输入层接受180x180x3(高度、宽度、颜色通道)的图片。
- 数据增强层应用于输入。
- 接着是归一化层,将像素值从0-255缩放到0-1。
- 然后是多个卷积层和最大池化层的堆叠,用于提取特征。
- 最后是全连接层(Dense),使用Dropout减少过拟合,输出层使用sigmoid激活函数进行二分类。
-
编译模型:
- 使用二元交叉熵损失函数(
binary_crossentropy),因为这是一个二分类问题。 - 优化器选择RMSprop。
- 评估指标选择准确率(
accuracy)。
- 使用二元交叉熵损失函数(
-
设置回调函数:
- 使用
ModelCheckpoint回调来保存验证损失最小的模型。
- 使用
-
训练模型:
- 使用
fit方法训练模型,指定训练数据、训练轮数(epochs)、验证数据和回调函数。
- 使用
四、步骤详解
4.1 数据处理
train_dataset = image_dataset_from_directory(
new_base_dir.absolute() / "train",
image_size

最低0.47元/天 解锁文章
4318

被折叠的 条评论
为什么被折叠?



