(2-1)数据集的基本处理

本文介绍了数据预处理在机器学习中的重要性,特别是在PyTorch和TensorFlow中如何通过ToTensor和Normalize等函数将原始数据转换为Tensor格式,并对图像数据进行标准化处理,以提升模型性能和可靠性。
摘要由CSDN通过智能技术生成

如果你是AI零基础,请关注本专栏,将带你一起飞。

数据预处理是机器学习和数据分析中的一个重要步骤,旨在准备原始数据,使其适合用于模型训练和分析。原始数据通常包含噪音、缺失值、不一致性等问题,数据预处理的目标是清理、转换和准备数据,以便提高模型的性能和可靠性。

2.2.1  转换为Tensor格式

在PyTorch程序中,可以使用模块torchvision.transforms中的预定义函数将数据集转换为Tensor格式。这些函数提供了一系列常用的数据预处理操作,例如将图像转换为Tensor、归一化、裁剪等。以下是一些常用的数据预处理函数:

  1. ToTensor():将PIL图像或NumPy数组转换为Tensor格式。该函数会将图像数据的像素值缩放到[0, 1]之间,并将通道顺序从HWC转换为CHW。
  2. Normalize(mean, std):对Tensor进行标准化处理。需要指定每个通道的均值和标准差。该函数将每个通道的像素值减去均值并除以标准差。
  3. Resize(size):调整图像的大小。可以指定输出图像的目标尺寸。
  4. CenterCrop(size):对图像进行中心裁剪,保留指定尺寸的区域。
  5. RandomCrop(size):对图像进行随机裁剪,保留指定尺寸的区域。
  6. RandomHorizontalFlip():随机水平翻转图像。
  7. RandomRotation(degrees):随机旋转图像,可以指定旋转的角度范围。
  8. RandomResizedCrop(size, scale, ratio):随机裁剪和缩放图像,可以指定裁剪的目标尺寸、缩放范围和长宽比范围。

上述预定义函数可以通过Compose函数组合在一起,按照指定的顺序依次应用于数据集。请看下面的例子,展示了将数据集转换为Tensor格式的过程。

实例2-3:将数据集转换为Tensor格式(源码路径:daima\2\zhuan.py

实例文件zhuan.py的具体实现代码如下所示。

import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10
# 定义转换操作列表
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])

# 创建CIFAR-10数据集实例并应用转换操作
dataset = CIFAR10(root='data/', train=True, download=True, transform=transform)
# 获取第一个样本
sample = dataset[0]
# 打印输出结果
print('图像Tensor大小:', sample[0].size())
print('标签:', sample[1])

在上述代码中,首先导入了transforms模块中的函数和Compose函数。然后,定义了一个转换操作列表,其中包括了将图像转换为Tensor格式和对Tensor进行标准化的操作。接下来,创建CIFAR-10数据集实例时,通过transform参数传入转换操作列表,从而将数据集转换为Tensor格式。最后,通过sample[0]来获取转换后的图像Tensor,并使用.size()方法查看其大小。同时,使用sample[1]来获取标签信息,并直接打印输出数据集信息。执行后会输出:

Files already downloaded and verified

图像Tensor大小: torch.Size([3, 32, 32])

标签: 6

通过这种方式,数据集中的每个样本将以Tensor格式进行表示,方便在PyTorch中进行进一步的处理和训练。

在 TensorFlow 中,将数据集转换为 Tensor 格式是一个常见的步骤,通常需要将原始数据进行适当的转换、标准化和处理,然后将其转换为张量形式以供模型使用。例如下面是一个典型的例子,展示了将数据集转换为 Tensor 格式的过程。

实例2-4:将数据集转换为Tensor格式(源码路径:daima\2\tzhuan.py

实例文件tzhuan.py的具体实现代码如下所示。

import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np

# 假设有一组原始数据 features 和 labels
features = np.random.rand(100, 2)  # 生成随机输入特征
labels = np.random.randint(0, 2, size=100)  # 随机生成标签

# 将原始数据划分为训练集和测试集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42)

# 将数据转换为张量
train_features_tensor = tf.convert_to_tensor(train_features, dtype=tf.float32)
train_labels_tensor = tf.convert_to_tensor(train_labels, dtype=tf.int64)
test_features_tensor = tf.convert_to_tensor(test_features, dtype=tf.float32)
test_labels_tensor = tf.convert_to_tensor(test_labels, dtype=tf.int64)

# 创建 TensorFlow 数据集对象
train_dataset = tf.data.Dataset.from_tensor_slices((train_features_tensor, train_labels_tensor))
test_dataset = tf.data.Dataset.from_tensor_slices((test_features_tensor, test_labels_tensor))

# 对数据集进行处理、批次化等操作
batch_size = 32
train_dataset = train_dataset.shuffle(buffer_size=len(train_features)).batch(batch_size)
test_dataset = test_dataset.batch(batch_size)

# 打印数据集信息
print("训练集样本数:", len(train_features))
print("测试集样本数:", len(test_features))

上述代码的实现流程如下:

  1. 导入了需要使用的库,TensorFlow 用于创建数据集和张量,train_test_split 用于将数据划分为训练集和测试集,numpy 用于生成示意数据。
  2. 使用 numpy 生成示意的输入特征和标签数据。features 是一个大小为 (100, 2) 的数组,每行表示一个输入样本的两个特征值,labels 是一个大小为 100 的数组,每个元素表示一个样本的标签。
  3. 使用 train_test_split 将数据划分为训练集和测试集。train_features 和 train_labels 是训练集的输入特征和标签,test_features 和 test_labels 是测试集的输入特征和标签。
  4. 使用 tf.convert_to_tensor 函数将 train_features、train_labels、test_features 和 test_labels 转换为 TensorFlow 张量。这将使得我们能够在 TensorFlow 中进行进一步的处理和操作。
  5. 使用 tf.data.Dataset.from_tensor_slices 函数,我们创建了训练集和测试集的 TensorFlow 数据集对象。每个数据集对象包含了一组输入特征和标签的对应关系。
  6. 使用 shuffle 函数对训练集进行随机重排,以确保数据的随机性。然后,我们使用 batch 函数将数据划分为大小为 batch_size 的批次。这些操作将为模型训练和测试提供适当的输入。
  7. 最后,打印输出训练集和测试集的样本数,以便了解数据集的规模。

执行后会输出:

训练集样本数: 80

测试集样本数: 20

2.2.2  标准化处理

在PyTorch程序中,可以使用transforms模块中的类Normalize来对数据集进行标准化处理。类Normalize将输入的张量按元素进行归一化,计算公式为:

output = (input - mean) / std

其中,mean是均值,std是标准差。对于图像数据,通常对每个颜色通道分别进行归一化处理。请看下面的例子,演示了使用类Normalize对数据集进行标准化处理的过程。

实例2-4:使用类Normalize对数据集进行标准化处理(源码路径:daima\2\biao.py

实例文件biao.py的具体实现代码如下所示。

import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10
# 定义转换操作列表,包括ToTensor和Normalize
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])

# 创建CIFAR-10数据集实例并应用转换操作
dataset = CIFAR10(root='data/', train=True, download=True, transform=transform)
# 获取第一个样本
sample = dataset[0]
# 打印转换后的图像张量
print('转换后的图像张量:', sample[0])

在上述代码中,定义了一个名为transform的转换操作列表,其中包括了ToTensor和Normalize操作。ToTensor操作将图像转换为张量格式,而Normalize操作对每个通道的像素值进行归一化处理,使其均值为0.5,标准差为0.5。然后,创建CIFAR-10数据集实例时应用了这个转换操作。最后,通过打印输出第一个样本的图像张量,可以观察到已经完成了标准化处理。执行后会输出:

Files already downloaded and verified

转换后的图像张量: tensor([[[-0.5373, -0.6627, -0.6078,  ...,  0.2392,  0.1922,  0.1608],

         [-0.8745, -1.0000, -0.8588,  ..., -0.0353, -0.0667, -0.0431],

         [-0.8039, -0.8745, -0.6157,  ..., -0.0745, -0.0588, -0.1451],

         ...,

         [ 0.6314,  0.5765,  0.5529,  ...,  0.2549, -0.5608, -0.5843],

         [ 0.4118,  0.3569,  0.4588,  ...,  0.4431, -0.2392, -0.3490],

         [ 0.3882,  0.3176,  0.4039,  ...,  0.6941,  0.1843, -0.0353]],



        [[-0.5137, -0.6392, -0.6235,  ...,  0.0353, -0.0196, -0.0275],

         [-0.8431, -1.0000, -0.9373,  ..., -0.3098, -0.3490, -0.3176],

         [-0.8118, -0.9451, -0.7882,  ..., -0.3412, -0.3412, -0.4275],

         ...,

         [ 0.3333,  0.2000,  0.2627,  ...,  0.0431, -0.7569, -0.7333],

         [ 0.0902, -0.0353,  0.1294,  ...,  0.1608, -0.5137, -0.5843],

         [ 0.1294,  0.0118,  0.1137,  ...,  0.4431, -0.0745, -0.2784]],



        [[-0.5059, -0.6471, -0.6627,  ..., -0.1529, -0.2000, -0.1922],

         [-0.8431, -1.0000, -1.0000,  ..., -0.5686, -0.6078, -0.5529],

         [-0.8353, -1.0000, -0.9373,  ..., -0.6078, -0.6078, -0.6706],

         ...,

         [-0.2471, -0.7333, -0.7961,  ..., -0.4510, -0.9451, -0.8431],

         [-0.2471, -0.6706, -0.7647,  ..., -0.2627, -0.7333, -0.7333],

         [-0.0902, -0.2627, -0.3176,  ...,  0.0980, -0.3412, -0.4353]]])

注意通过使用Normalize类,可以对数据集进行标准化处理,以便更好地用于模型训练。注意,在应用标准化处理时,需要根据数据集的特点设置正确的均值和标准差。

在 TensorFlow 程序中,进行数据集标准化处理是为了将输入特征进行缩放,使其具有零均值和单位方差。这有助于加速模型训练,并且有时可以提高模型的收敛速度和性能。下面的实例演示了使用 TensorFlow 对数据集进行标准化处理的过程。

实例2-4:使用 TensorFlow对数据集进行标准化处理(源码路径:daima\2\tbiao.py

实例文件tbiao.py的具体实现代码如下所示。

import tensorflow as tf
from sklearn.model_selection import train_test_split
import numpy as np
# 假设有一组原始数据 features 和 labels
features = np.random.rand(100, 2)  # 生成随机输入特征
labels = np.random.randint(0, 2, size=100)  # 随机生成标签

# 将原始数据划分为训练集和测试集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2, random_state=42)

# 标准化处理:计算均值和标准差
mean = np.mean(train_features, axis=0)
std = np.std(train_features, axis=0)

# 标准化处理:应用均值和标准差进行缩放
train_features_normalized = (train_features - mean) / std
test_features_normalized = (test_features - mean) / std

# 将标准化后的数据转换为 TensorFlow 张量
train_features_tensor = tf.convert_to_tensor(train_features_normalized, dtype=tf.float32)
test_features_tensor = tf.convert_to_tensor(test_features_normalized, dtype=tf.float32)

# 创建 TensorFlow 数据集对象

train_dataset = tf.data.Dataset.from_tensor_slices((train_features_tensor, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_features_tensor, test_labels))
# 对数据集进行处理、批次化等操作
batch_size = 32
train_dataset = train_dataset.shuffle(buffer_size=len(train_features)).batch(batch_size)
test_dataset = test_dataset.batch(batch_size)

在上述代码中,首先生成了示意的输入特征和标签数据。然后,计算训练集特征的均值和标准差,用于进行标准化处理。标准化处理通过减去均值并除以标准差来对特征进行缩放。最后,将标准化后的数据转换为 TensorFlow 张量,并创建了数据集对象。

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,可以用于图像和视频处理,包括数字识别。而印刷数字数据集是一个包含了大量印刷数字图片和标签的数据集,用于机器学习的训练和测试。 在OpenCV中,有几种方式可以处理印刷数字数据集。首先,可以使用OpenCV的图像处理功能来读取和操作印刷数字图片。通过使用OpenCV的函数,可以加载图像、调整大小、灰度化、二值化以及其他处理,以便进一步使用。 其次,可以使用OpenCV的机器学习模块或深度学习库来训练和测试模型。例如,可以使用OpenCV的K-最近邻算法(K-Nearest Neighbors)来对印刷数字进行分类。首先,需要将印刷数字图片和对应的标签加载到内存中,并对图片进行预处理。然后,可以使用KNN算法进行训练,生成模型。最后,可以使用测试集对模型进行评估和预测。 另外,OpenCV还提供了用于特征提取和匹配的功能,可以将特征提取出来,用于数字识别。例如,可以使用OpenCV的SIFT算法(尺度不变特征变换)来检测和描述印刷数字图片中的特征点,然后使用特征匹配算法找到相似的特征点,并进行数字识别。 总的来说,OpenCV对于印刷数字数据集处理提供了很多便捷的功能和方法,可以方便地进行数字识别和机器学习训练。它是一个非常强大的计算机视觉库,被广泛应用于图像处理和数字识别领域。 ### 回答2: OpenCV是一个用于计算机视觉和图像处理的开源库。印刷数字数据集是用于训练和测试数字识别模型的数据集。在这个数据集中,包含了大量的印刷数字图片,每张图片上都有一个数字。这些图片是以图像的形式存储,并且每个数字都有一个对应的标签。 OpenCV提供了许多功能和算法,可以用于处理和分析这些印刷数字数据集。首先,OpenCV可以加载和读取图像数据集,使其能够在计算机中进行处理。它还提供了丰富的图像处理函数,可以对图像进行预处理,如图像增强、缩放、旋转、裁剪等,以便提升数字识别模型的性能。 在数字识别任务中,OpenCV还可以用于特征提取和特征选择。特征是用于描述图像中的关键信息的数值或属性。通过提取合适的特征,可以有效地表征数字图像,并用于训练和测试模型。OpenCV提供了各种特征提取算法,如HOG(方向梯度直方图)、LBP(局部二值模式)等。 另外,OpenCV中还包含了机器学习算法和模型,如支持向量机(SVM)、人工神经网络等,可以用于训练和测试数字识别模型。通过使用这些算法和模型,可以根据印刷数字数据集训练一个能够准确识别数字的模型,并且可以对不同的数字进行分类。 总结来说,OpenCV提供了丰富的功能和算法,可以帮助处理和分析印刷数字数据集。它可以用于加载和读取图像数据集,进行图像处理和预处理,特征提取和选择,以及机器学习算法的训练和测试。通过应用OpenCV,可以有效地建立一个功能强大的印刷数字识别系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值