用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_data,train_labels,test_data和test_labels变量中。最后,代码打印出数据集的形状信息。
这是一个简单且常用的下载并转换CIFAR-10数据集的函数,可以帮助您在使用CIFAR-10数据集时快速获取和处理数据。
