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 多个实用与顶级公司的实践顶峰项目和工作协助。