Image classification from scratch
介绍
此示例显示了如何从磁盘上的JPEG图像文件开始从头开始图像分类,而无需利用预先训练的权重或预先构建的Keras应用程序模型。我们在Kaggle Cats vs Dogs二进制分类数据集中展示了工作流程。
我们使用该image_dataset_from_directory实用程序生成数据集,并使用Keras图像预处理层进行图像标准化和数据增强。
设置
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
加载数据:“猫与狗”数据集
原始数据下载
首先,让我们下载原始数据的786M ZIP归档文件:
curl是在linux上的命令行工具,用在http很好用
!curl -O https://download.microsoft.com/download/3/E/1/3E1C3F21-ECDB-4869-8368-6DEBA77B919F/kagglecatsanddogs_3367a.zip
!unzip -q kagglecatsanddogs_3367a.zip
!ls
现在我们有一个PetImages包含两个子文件夹的文件夹,Cat和Dog。每个子文件夹包含每个类别的图像文件。
!ls PetImages
Cat Dog
筛选出损坏的图像
当使用大量真实世界的图像数据时,损坏的图像是经常发生的情况。让我们过滤掉标题中不包含字符串“ JFIF”的错误编码的图像。
import os
num_skipped = 0
for folder_name in ("Cat", "Dog"):
folder_path = os.path.join("PetImages", folder_name)
for fname in os.listdir(folder_path):
fpath = os.path.join(folder_path, fname)
try:
fobj = open(fpath, "rb")
is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)
finally:
fobj.close()
if not is_jfif:
num_skipped += 1
# Delete corrupted image
os.remove(fpath)
print("Deleted %d images" % num_skipped)
Deleted 1590 images
产生一个 Dataset
image_size = (180, 180)
batch_size = 32
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
"PetImages",
validation_split=0.2,
subset="training",
seed=1337,
image_size=image_size,
batch_size=batch_size,
)
val_ds