Tensorflow 2.0 图像分类:安装、加载数据、构建和训练模型

已发表: 2020-04-21

图像分类是模式识别的一个范畴。 它根据相邻像素之间的关系对图像进行分类。 换句话说,它使用上下文信息来组织图像,并且在不同的技术中非常流行。 这是深度学习中的一个突出主题,如果你正在学习它,你一定会喜欢这篇文章。

在这里,我们将执行 TensorFlow 图像分类。 我们将建立一个模型,对其进行训练,然后提高其分类仙人掌图像的准确性。 TensorFlow 是一个开源机器学习平台,是谷歌的产品。

让我们开始吧。

目录

安装 TensorFlow 2.0

首先,您需要在 Google Colab 上安装 TensorFlow。 你可以通过 pip 安装它:

!pip install tensorflow-gpu==2.0.0-alpha0

然后我们将验证安装:

将张量流导入为 tf

打印(tf.__版本)

# 输出:2.0.0-alpha0

资源

学习:最受初学者欢迎的 5 个 TensorFlow 项目

加载数据

验证后,我们可以使用 tf.data.dataset 加载数据。 我们将构建一个分类器来确定图像是否包含仙人掌。 仙人掌必须是柱状的。我们可以为此使用仙人掌航空照片数据集。 现在,我们将加载文件路径及其标签:

train_csv = pd.read_csv('data/train.csv')

# 在 train/ 中添加相对路径的图像文件名

文件名 = ['train/' + fname for fname in train_csv['id'].tolist()]

标签 = train_csv['has_cactus'].tolist()

train_filenames, val_filenames, train_labels, val_labels =

train_test_split(文件名,

标签,

火车尺寸=0.9,

随机状态=42)

一旦我们有了标签和文件名,我们就可以创建 tf.data.Dataset 对象了:

train_data = tf.data.Dataset.from_tensor_slices(

(tf.constant(train_filenames), tf.constant(train_labels))

)

val_data = tf.data.Dataset.from_tensor_slices(

(tf.constant(val_filenames), tf.constant(val_labels))

)

资源

目前,我们的数据集没有实际的图像。 它只有他们的文件名。 我们需要一个函数来加载必要的图像并对其进行处理,以便我们可以对它们执行 TensorFlow 图像识别。

IMAGE_SIZE = 96 # 用于 MobileNetV2 的最小图像尺寸

BATCH_SIZE = 32

# 加载和预处理每个图像的函数

def _parse_fn(文件名,标签):

img = tf.io.read_file(img)

img = tf.image.decode_jpeg(img)

img = (tf.cast(img, tf.float32)/127.5) – 1

img = tf.image.resize(img, (IMAGE_SIZE, IMAGE_SIZE))

返回img,标签

# 对 train 和 val 数据集中的每个示例运行 _parse_fn

# 同时洗牌和创建批次

train_data = (train_data.map(_parse_fn)

.shuffle(buffer_size=10000)

.batch(BATCH_SIZE)

)

val_data = (val_data.map(_parse_fn)

.shuffle(buffer_size=10000)

.batch(BATCH_SIZE)

)

资源

建立模型

在这个 TensorFlow 图像分类示例中,我们将创建一个迁移学习模型。 这些模型速度很快,因为它们可以使用之前经过训练的现有图像分类模型。 他们只需要重新训练其网络的上层,因为该层指定了所需图像的类别。

我们将使用 TensorFlow 2.0 的 Keras API 来创建我们的图像分类模型。 出于迁移学习的目的,我们将使用 MobileNetV2 作为属性检测器。 它是 MobileNet 的第二个版本,是 Google 的产品。 它的重量比 Inception 和 ResNet 等其他模型更轻,并且可以在移动设备上运行。 我们将把这个模型加载到 ImageNet 上,冻结权重,添加一个分类头并在没有顶层的情况下运行它。

IMG_SHAPE = (IMAGE_SIZE, IMAGE_SIZE, 3)

# 使用 MobileNetV2 预训练模型

base_model = tf.keras.applications.MobileNetV2(

input_shape=IMG_SHAPE,

包括顶部=假,

权重='imagenet'

)

# 冻结预训练的模型权重

base_model.trainable = 假

# 可训练的分类头

maxpool_layer = tf.keras.layers.GlobalMaxPooling2D()

prediction_layer = tf.keras.layers.Dense(1, activation='sigmoid')

# 带有特征检测器的层分类头

模型 = tf.keras.Sequential([

base_model,

最大池层,

预测层

])

学习率 = 0.0001

# 编译模型

model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate),

损失='binary_crossentropy',

指标=['准确性']

)

资源

如果你要训练 tf.keras 模型,你应该使用 TensorFlow 优化器。 tf.keras.optimizers 和 tf.train API 中的优化器一起在 TensorFlow 2.0 的 tf.keras.optimizers 中。 在 TensorFlow 2.0 中,许多 tf.keras 的原始优化器都得到了升级和替换,以获得更好的性能。 它们使我们能够在不影响性能的情况下应用优化器并节省时间。

阅读:面向初学者的 TensorFlow 对象检测教程

学习世界顶尖大学的数据科学课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

训练模型

在我们建立模型之后,我们可以教它。 TensorFlow 2.0 的 tf.keras API 支持 tf.data API,因此您必须为此目的使用 tf.data.Dataset 对象。 它可以有效地执行训练,我们不必对性能做出任何妥协。

num_epochs = 30

steps_per_epoch = round(num_train)//BATCH_SIZE

val_steps = 20

model.fit(train_data.repeat(),

epochs=num_epochs,

steps_per_epoch = steps_per_epoch,

验证数据=val_data.repeat(),

验证步骤=验证步骤)

资源

在 30 个 epoch 之后,模型的准确率大幅提高,但我们可以进一步提高。 还记得,我们提到在迁移学习期间冻结权重吗? 好吧,现在我们已经训练了分类头,我们可以解冻这些层并进一步微调我们的数据集:

# 解冻MobileNetV2的所有层

base_model.trainable = True

# 重新冻结层直到我们想要微调的层

对于 base_model.layers[:100] 中的层:

layer.trainable = 假

# 使用较低的学习率

lr_finetune = learning_rate / 10

# 重新编译模型

model.compile(loss='binary_crossentropy',

优化器 = tf.keras.optimizers.Adam(lr=lr_finetune),

指标=['准确性'])

# 增加训练时间以进行微调

Fine_tune_epochs = 30

total_epochs = num_epochs + fine_tune_epochs

# 微调模型

# 注意:将 initial_epoch 设置为在 epoch 30 之后开始训练,因为我们

# 之前训练了 30 个 epoch。

model.fit(train_data.repeat(),

steps_per_epoch = steps_per_epoch,

epochs=total_epochs,

initial_epoch = num_epochs,

验证数据=val_data.repeat(),

验证步骤=验证步骤)

资源

30 epochs 后,模型的准确性进一步提高。 随着更多的时期,我们看到模型的准确性有了更多的提高。 现在,我们有了一个合适的 TensorFlow 图像识别模型,可以高精度地识别图像中的柱状仙人掌。

另请阅读:面向初学者的 TensorFlow 项目创意

了解有关 TensorFlow 图像分类的更多信息

TensorFlow 的功能强大的 API 及其功能使其成为任何程序员都可以使用的强大技术。 它的高级 API 也消除了它的一般复杂性,使其更易于使用。

您是否有兴趣了解有关 TensorFlow、图像分类和相关主题的更多信息? 然后我们建议您查看 IIIT-B 和 upGrad 的机器学习和人工智能 PG 文凭,专为工作专业人士设计,提供 450 多个小时的严格培训、30 多个案例研究和作业、IIIT-B 校友身份、5 多个实用与顶级公司的实践顶峰项目和工作协助。

机器学习课程 | 在线学习,IIIT 班加罗尔‎

机器学习和人工智能的 PG 文凭与升级和 IIIT 班加罗尔。
现在申请