欢迎访问宙启技术站
智能推送

用Python编写的datasets.download_and_convert_cifar10函数:下载并转换CIFAR-10数据集

发布时间:2023-12-19 04:26:23

下面是一个用Python编写的datasets.download_and_convert_cifar10函数,用于下载并转换CIFAR-10数据集。该函数将下载CIFAR-10的源数据,并将其转换为可以在机器学习模型中使用的格式。

import os
import tarfile
import urllib.request
import pickle
import numpy as np

def download_and_convert_cifar10(data_dir):
    # 定义数据集的URL和存储位置
    cifar10_url = 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz'
    cifar10_file = os.path.join(data_dir, 'cifar-10-python.tar.gz')
    cifar10_extracted_dir = os.path.join(data_dir, 'cifar-10-batches-py')
    cifar10_train_data = []
    cifar10_train_labels = []

    # 如果数据目录不存在,则创建
    if not os.path.exists(data_dir):
        os.makedirs(data_dir)

    # 下载CIFAR-10数据集
    if not os.path.exists(cifar10_file):
        urllib.request.urlretrieve(cifar10_url, cifar10_file)
    
    # 解压缩CIFAR-10数据集
    if not os.path.exists(cifar10_extracted_dir):
        with tarfile.open(cifar10_file, 'r:gz') as tar:
            tar.extractall(path=data_dir)

    # 读取训练集数据和标签
    for i in range(1, 6):
        file_name = os.path.join(cifar10_extracted_dir, 'data_batch_' + str(i))
        with open(file_name, 'rb') as f:
            data_dict = pickle.load(f, encoding='bytes')
            cifar10_train_data.append(data_dict[b'data'])
            cifar10_train_labels += data_dict[b'labels']

    # 读取测试集数据和标签
    file_name = os.path.join(cifar10_extracted_dir, 'test_batch')
    with open(file_name, 'rb') as f:
        data_dict = pickle.load(f, encoding='bytes')
        cifar10_test_data = data_dict[b'data']
        cifar10_test_labels = data_dict[b'labels']

    # 进行数据预处理
    cifar10_train_data = np.concatenate(cifar10_train_data, axis=0)
    cifar10_train_data = cifar10_train_data.reshape((-1, 3, 32, 32)).transpose((0, 2, 3, 1))
    cifar10_train_labels = np.array(cifar10_train_labels)
    cifar10_test_data = cifar10_test_data.reshape((-1, 3, 32, 32)).transpose((0, 2, 3, 1))
    cifar10_test_labels = np.array(cifar10_test_labels)

    # 返回训练集和测试集数据及其标签
    return cifar10_train_data, cifar10_train_labels, cifar10_test_data, cifar10_test_labels

使用例子:

data_dir = 'cifar10_data'
train_data, train_labels, test_data, test_labels = download_and_convert_cifar10(data_dir)

print('训练集数据 shape:', train_data.shape)
print('训练集标签 shape:', train_labels.shape)
print('测试集数据 shape:', test_data.shape)
print('测试集标签 shape:', test_labels.shape)

该函数首先定义了CIFAR-10数据集的URL和存储位置。然后它检查数据目录是否存在,如果不存在则创建。接下来,它会下载CIFAR-10数据集并将其解压缩到指定的数据目录中。

然后,函数会读取CIFAR-10数据集的训练集和测试集文件,并将其存储为numpy数组。数据预处理部分将数据重塑为适合机器学习模型的形式。最后,函数返回训练集和测试集的数据及其标签。

在上述的使用例子中,函数将下载并转换CIFAR-10数据集,并将训练集和测试集的数据和标签存储在train_datatrain_labelstest_datatest_labels变量中。最后,代码打印出数据集的形状信息。

这是一个简单且常用的下载并转换CIFAR-10数据集的函数,可以帮助您在使用CIFAR-10数据集时快速获取和处理数据。