使用 TensorFlow 进行图像分类:开发数据管道(第1部分)

介绍

在本文中,我们将讨论使用 Tensorflow 进行二进制图像分类,我们将使用 TensorFlow 数据集(TensorFlow 社区提供给我们的数据管道)。

本文分为两个部分作为一个完整的指南,每个部分都足以让你理解其中提到的概念,遵循这两个部分并没有压力。

第1部分讨论数据管道和模型训练

第2部分将在第 1 部分之后进行选择,并在流数据上使用正则化和数据增强来克服过度拟合。

目录

  • 数据管道

  • 提取、转换、加载 (ETL)

  • Tensorflow 数据集

  • Horses-or-Human 数据集

数据管道

这个术语仅意味着在原始输入数据和我们从中得到的输出数据之间包含了一系列步骤/操作。如果我打算在使用数据之前对其进行一些预处理,则可以在应用预处理后使用数据管道来获取数据。

更明确地说,将数据管道视为一种自动化机制,以避免手动固定的预处理步骤,并让数据通过数据管道中定义的步骤自动转换。

提取、转换、加载 (ETL)

尽管涉及更多复杂性,但这个高级词汇组合已经告诉我们数据管道的功能。作为初学者,了解就足够了。

提取意味着从数据源中检索数据。

转换意味着应用特定数据管道中涉及的所有步骤,并将该数据转换为你需要的数据。

加载意味着从转换中获取输出数据并将该数据用于模型以开始训练或推理。

TensorFlow 数据集

这是 TensorFlow 社区为我们提供的数据管道的名称,我们可以在我们的 TensorFlow 代码中使用它,并制作更强大和生产就绪的机器学习或深度学习模型。

Horses-or-Human 数据集

这是我们将在代码中使用的数据集。该数据集由 Laurence Moroney 创建,包含分布在两个类(马和人类)之间的 300×300 图像。在此处了解有关数据的更多信息:http://www.laurencemoroney.com/horses-or-humans-dataset/

让我们编码

你需要首先使用以下命令将 tensorflow 数据集安装为一个包:

!pip install tensorflow-datasets

然后导入所有需要的库

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow_datasets as tfds

提取阶段

如上所述,这里我们将从 tensorflow 数据集服务器中提取数据并查看有关它的一些信息。

train_dataset,info = tfds.load('horses_or_humans', with_info = True, split='train', as_supervised=True)
val_dataset,val_info = tfds.load("horses_or_humans", with_info=True, split='test', as_supervised=True)

' info ' 和 ' val_info ' 都以下面提到的格式给出相同的信息,因为它们都指向同一个数据集,train_dataset 和 val_dataset 中的图像数量在“split”键下分别提取为 train 和 test。

注意: train_dataset 和 val_dataset 是tf.data.Dataset对象

print(info)

通过 TensorFlow Datasets 将已经拆分的数据放入训练集和测试集就是这么简单。

转换阶段

现在让我们进入转换阶段,在此我们应用预处理步骤来更改结果数据。在我们的例子中,我们只对训练数据进行打乱和批处理,只对验证数据进行批处理。

train_dataset = train_dataset.shuffle(100).batch(32)
val_dataset = val_dataset.batch(32)

在这里,我应用了函数链接来在一行中获得最终输出(shuffle() 之后的batch())。shuffle(BUFFER_SIZE)是一个对数据进行打乱的函数,其中 BUFFER_SIZE 表示可用于打乱的空间,更多的空间可以进行更好的打乱,反之亦然。

batch(batch_size)是一个函数,将数据子集分成大小为->batch_size 的批次;对于单个训练步骤,并通过小批量梯度下降改进学习。

model = tf.keras.models.Sequential([
                                   tf.keras.layers.Conv2D(filters=8, kernel_size = 3, input_shape = [300,300,3], activation='relu'),
                                   tf.keras.layers.MaxPooling2D(),
                                   tf.keras.layers.Conv2D(filters = 16, kernel_size = 3, activation = 'relu'),
                                   tf.keras.layers.MaxPooling2D(),
                                    tf.keras.layers.Conv2D(filters = 32, kernel_size = 3, activation = 'relu'),
                                   tf.keras.layers.MaxPooling2D(),
                                   tf.keras.layers.Flatten(),
                                   tf.keras.layers.Dense(units=64, activation = 'relu'),
                                   tf.keras.layers.Dense(units = 2, activation='softmax')
])
model.summary()

转换后的最后一步是使用数据加载阶段。让我们像在任何其他模型中一样加载数据,并在 train_dataset 上简单地训练我们的卷积神经网络。

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_dataset, epochs=8, validation_data=val_dataset)

在这里,我保持较小的训练,因为它已经给出了100% 的训练准确度82% 的验证准确度,这有过度拟合的痕迹。让我们检查这个想法。

损失图

plt.figure(figsize=(8, 4))
plt.plot(range(8), history.history['loss'], 'r', label='training loss')
plt.plot(range(8), history.history['val_loss'], 'b', label='validation Loss')
plt.legend()
plt.xlabel('Number of Epochs')
plt.ylabel("Loss")
plt.show()


精度图

plt.figure(figsize=(8, 4))
plt.plot(range(8), history.history['accuracy'], 'r', label='training accuracy')
plt.plot(range(8), history.history['val_accuracy'], 'b', label='validation accuracy')
plt.legend()
plt.xlabel('Number of Epochs')
plt.ylabel("Accuracy")
plt.show()

两个图中训练和验证数据线之间的差距表示过度拟合,因此验证了我们的疑问。

过拟合可以通过各种方法去除。 (一些著名的是数据增强,使用正则化等)。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

Guess you like

Origin blog.csdn.net/woshicver/article/details/119814333