Tensorflow深度学习之二十:CIFAR-10数据集介绍

一、CIFAR-10
CIFAR-10数据集由10类32x32的彩色图片组成,一共包含60000张图片,每一类包含6000图片。其中50000张图片作为训练集,10000张图片作为测试集。

CIFAR-10数据集被划分成了5个训练的batch和1个测试的batch,每个batch均包含10000张图片。测试集batch的图片是从每个类别中随机挑选的1000张图片组成的,训练集batch以随机的顺序包含剩下的50000张图片。不过一些训练集batch可能出现包含某一类图片比其他类的图片数量多的情况。训练集batch包含来自每一类的5000张图片,一共50000张训练图片。

下图显示的是数据集的类,以及每一类中随机挑选的10张图片:
这里写图片描述

二、CIFAR-10数据集解析
官方给出了多个CIFAR-10数据集的版本,以下是链接:

VersionSizemd5sum
CIFAR-10 python version163 MBc58f30108f718f92721af3b95e74349a
CIFAR-10 Matlab version175 MB70270af85842c9e89bb428ec9976c926
CIFAR-10 binary version (suitable for C programs)162 MBc32a1d4ab5d03f1284b67883e8d87530

此处我们下载python版本。

下载完成后,解压,得到如下目录结构的文件夹:
这里写图片描述
其中:

名称作用
batches.meta程序中不需要使用该文件
data_batch_1训练集的第一个batch,含有10000张图片
data_batch_2训练集的第二个batch,含有10000张图片
data_batch_3训练集的第三个batch,含有10000张图片
data_batch_4训练集的第四个batch,含有10000张图片
data_batch_5训练集的第五个batch,含有10000张图片
readme.html网页文件,程序中不需要使用该文件
test_batch测试集的batch,含有10000张图片

上述文件结构中,每一个batch文件包含一个python的字典(dict)结构,结构如下:

名称作用
b’data’是一个10000x3072的array,每一行的元素组成了一个32x32的3通道图片,共10000张
b’labels’一个长度为10000的list,对应包含data中每一张图片的label
b’batch_label’这一份batch的名称
b’filenames’一个长度为10000的list,对应包含data中每一张图片的名称

真正重要的两个关键字是data和labels,剩下的两个并不是十分重要。

参考官网给出的方法,获取每个batch文件中的字典信息:

import numpy as np
import pickle

def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

在字典结构中,每一张图片是以被展开的形式存储(即一张32x32的3通道图片被展开成了3072长度的list),每一个数据的格式为uint8,前1024个数据表示红色通道,接下来的1024个数据表示绿色通道,最后的1024个通道表示蓝色通道。

下面的函数的作用就是提取每一个通道的数据,进行重新排列,最后返回一张32x32的3通道的图片:

def GetPhoto(pixel):
    assert len(pixel) == 3072
    # 对list进行切片操作,然后reshape
    r = pixel[0:1024]; r = np.reshape(r, [32, 32, 1])
    g = pixel[1024:2048]; g = np.reshape(g, [32, 32, 1])
    b = pixel[2048:3072]; b = np.reshape(b, [32, 32, 1])

    photo = np.concatenate([r, g, b], -1)

    return photo

下面的函数的作用是提取训练集batch中的数据:

# 按照给出的关键字提取数据
def GetTrainDataByLabel(label):
    batch_label = []
    labels = []
    data = []
    filenames = []
    for i in range(1, 1+5):
        batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'batch_label'])
        labels += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'labels']
        data.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'data'])
        filenames += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'filenames']

    data = np.concatenate(data, 0)

    label = str.encode(label)
    if label == b'data':
        array = np.ndarray([len(data), 32, 32, 3], dtype=np.int32)
        for i in range(len(data)):
            array[i] = GetPhoto(data[i])
        return array
        pass
    elif label == b'labels':
        return labels
        pass
    elif label == b'batch_label':
        return batch_label
        pass
    elif label == b'filenames':
        return filenames
        pass
    else:
        raise NameError

下面的代码的作用是提取测试集中的数据:

def GetTestDataByLabel(label):
    batch_label = []
    filenames = []

    batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'batch_label'])
    labels = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'labels']
    data = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'data']
    filenames += unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'filenames']

    label = str.encode(label)
    if label == b'data':
        array = np.ndarray([len(data), 32, 32, 3], dtype=np.int32)
        for i in range(len(data)):
            array[i] = GetPhoto(data[i])
        return array
        pass
    elif label == b'labels':
        return labels
        pass
    elif label == b'batch_label':
        return batch_label
        pass
    elif label == b'filenames':
        return filenames
        pass
    else:
        raise NameError

将上述的代码放在同一个文件中。
完整cifar_data_load.py文件如下:

import numpy as np
import pickle


def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict


def GetPhoto(pixel):
    assert len(pixel) == 3072
    r = pixel[0:1024]; r = np.reshape(r, [32, 32, 1])
    g = pixel[1024:2048]; g = np.reshape(g, [32, 32, 1])
    b = pixel[2048:3072]; b = np.reshape(b, [32, 32, 1])

    photo = np.concatenate([r, g, b], -1)

    return photo


def GetTrainDataByLabel(label):
    batch_label = []
    labels = []
    data = []
    filenames = []
    for i in range(1, 1+5):
        batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'batch_label'])
        labels += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'labels']
        data.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'data'])
        filenames += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d"%i)[b'filenames']

    data = np.concatenate(data, 0)

    label = str.encode(label)
    if label == b'data':
        array = np.ndarray([len(data), 32, 32, 3], dtype=np.int32)
        for i in range(len(data)):
            array[i] = GetPhoto(data[i])
        return array
        pass
    elif label == b'labels':
        return labels
        pass
    elif label == b'batch_label':
        return batch_label
        pass
    elif label == b'filenames':
        return filenames
        pass
    else:
        raise NameError


def GetTestDataByLabel(label):
    batch_label = []
    filenames = []

    batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'batch_label'])
    labels = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'labels']
    data = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'data']
    filenames += unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'filenames']

    label = str.encode(label)
    if label == b'data':
        array = np.ndarray([len(data), 32, 32, 3], dtype=np.int32)
        for i in range(len(data)):
            array[i] = GetPhoto(data[i])
        return array
        pass
    elif label == b'labels':
        return labels
        pass
    elif label == b'batch_label':
        return batch_label
        pass
    elif label == b'filenames':
        return filenames
        pass
    else:
        raise NameError

==========================================

2017年12月19日更新

增加了指定使用哪些数据文件的参数filelist

import numpy as np
import pickle
import cv2

def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict


def GetPhoto(pixel):
    assert len(pixel) == 3072
    r = pixel[0:1024]; r = np.reshape(r, [32, 32, 1])
    g = pixel[1024:2048]; g = np.reshape(g, [32, 32, 1])
    b = pixel[2048:3072]; b = np.reshape(b, [32, 32, 1])

    photo = np.concatenate([r, g, b], -1)

    return photo


def getTrainDataByKeyword(keyword, size=(32, 32), normalized=False, filelist=[]):
    '''
    :param keyword:'data', 'labels', 'batch_label', 'filenames', 表示需要返回的项目
    :param size:当keyword 是data时,表示需要返回的图片的尺寸
    :param normalized:当keyword是data时,表示是否需要归一化
    :param filelist:一个list, 表示需要使用的文件对象,仅1, 2, 3, 4, 5是有效的,其他数字无效
    :return:需要返回的数据对象。'data'表示需要返回像素数据。'labels'表示需要返回标签数据。'batch_label'表示需要返回文件标签数据。'filenames'表示需要返回文件的文件名信息。
    '''

    keyword = str.encode(keyword)

    assert keyword in [b'data', b'labels', b'batch_label', b'filenames']
    assert type(filelist) is list and len(filelist) != 0
    assert type(normalized) is bool
    assert type(size) is tuple

    files = []
    for i in filelist:
        if 1 <= i <= 5 and i not in files:
            files.append(i)

    if len(files) == 0:
        raise ValueError("No valid input files!")

    if keyword == b'data':
        data = []
        for i in files:
            data.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d" % i)[b'data'])
        data = np.concatenate(data, 0)
        if normalized == False:
            array = np.ndarray([len(data), size[0], size[1], 3], dtype=np.float32)
            for i in range(len(data)):
                array[i] = cv2.resize(GetPhoto(data[i]), size)
            return array
        else:
            array = np.ndarray([len(data), size[0], size[1], 3], dtype=np.float32)
            for i in range(len(data)):
                array[i] = cv2.resize(GetPhoto(data[i]), size)/255
            return array
        pass
    if keyword == b'labels':
        labels = []
        for i in files:
            labels += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d" % i)[b'labels']
        return labels
        pass
    elif keyword == b'batch_label':
        batch_label = []
        for i in files:
            batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d" % i)[b'batch_label'])
        return batch_label
        pass
    elif keyword == b'filenames':
        filenames = []
        for i in files:
            filenames += unpickle("cifar-10-python/cifar-10-batches-py/data_batch_%d" % i)[b'filenames']
        return filenames
        pass
    pass


def getTestDataByKeyword(keyword, size=(32, 32), normalized=False):
    '''
    :param keyword:'data', 'labels', 'batch_label', 'filenames', 表示需要返回的项目
    :param size:当keyword 是data时,表示需要返回的图片的尺寸
    :param normalized:当keyword是data时,表示是否需要归一化
    :return:需要返回的数据对象。'data'表示需要返回像素数据。'labels'表示需要返回标签数据。'batch_label'表示需要返回文件标签数据。'filenames'表示需要返回文件的文件名信息。
    '''
    keyword = str.encode(keyword)

    assert keyword in [b'data', b'labels', b'batch_label', b'filenames']
    assert type(size) is tuple
    assert type(normalized) is bool

    batch_label = []
    filenames = []

    batch_label.append(unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'batch_label'])
    labels = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'labels']
    data = unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'data']
    filenames += unpickle("cifar-10-python/cifar-10-batches-py/test_batch")[b'filenames']

    label = str.encode(keyword)
    if label == b'data':
        if normalized == False:
            array = np.ndarray([len(data), size[0], size[1], 3], dtype=np.float32)
            for i in range(len(data)):
                array[i] = cv2.resize(GetPhoto(data[i]), size)
            return array
        else:
            array = np.ndarray([len(data), size[0], size[1], 3], dtype=np.float32)
            for i in range(len(data)):
                array[i] = cv2.resize(GetPhoto(data[i]), size) / 255
            return array
        pass
    elif label == b'labels':
        return labels
        pass
    elif label == b'batch_label':
        return batch_label
        pass
    elif label == b'filenames':
        return filenames
        pass
    else:
        raise NameError
    pass
  • 14
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用TensorFlow进行深度学习CIFAR-10数据集的模型训练和识别可以遵循以下步骤: 1. 导入必要的库和CIFAR-10数据集:首先,需要导入TensorFlow和其他必要的库(例如numpy、matplotlib等),并下载CIFAR-10数据集。可以使用TensorFlow内置的数据集API或手动下载数据集。 2. 数据预处理:在将数据提供给模型之前,需要对数据进行预处理,例如将像素值归一化、对标签进行独热编码等。 3. 构建模型:可以使用TensorFlow的高级API(例如Keras)来构建深度学习模型。通常,使用卷积神经网络(CNN)来处理图像数据。可以根据任务的要求设计适当的网络结构。 4. 模型编译和训练:在将数据提供给模型之前,需要对数据进行预处理,例如将像素值归一化、对标签进行独热编码等。使用适当的优化器和损失函数来编译模型,并使用训练集训练模型。 5. 模型评估:在训练模型后,可以使用测试集对模型进行评估。可以计算准确率、损失函数值等指标。 6. 模型应用:在模型训练和评估后,可以使用模型进行预测。提供新的输入数据,模型将返回预测结果。 总之,使用TensorFlow进行CIFAR-10数据集深度学习模型训练和识别需要对数据进行预处理、构建CNN模型、编译和训练模型、评估模型以及应用模型进行预测。 ### 回答2: 深度学习是一种以神经网络为基础的机器学习方法,而TensorFlow是一个由谷歌公司开发的支持深度学习的开源框架。在TensorFlow框架下,使用卷积神经网络(Convolutional Neural Network,CNN)对CIFAR-10数据集进行分类是一个非常经典的任务。 CIFAR-10数据集包含了10个不同的分类标签,包括飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车,每类数据有5000个训练样本和1000个测试样本。因此,模型的训练可以使用训练集进行,而测试过程则基于测试集进行。 在构建CNN模型时,可以使用序列化API(Sequential API)或函数式API(Functional API)进行设计和开发。对于序列化API,可以选择将不同的深度网络层(如卷积层、池化层、全连接层等)按照顺序叠加组合。而对于函数式API,则允许具有多个输入和输出的复杂模型。典型的CNN模型包括卷积层、池化层和全连接层。 在模型训练过程中,常用的优化器是随机梯度下降(Stochastic gradient descent,SGD)。还可以使用其他优化算法,如动量法(Momentum),Adagrad和Adam。同时,在训练过程中,需要考虑过拟合的问题,采取常用的对策如正则化、dropout等。 在模型训练完成后,测试模型将是一个核心的任务。可以通过计算模型的精确性(accuracy)和损失函数(loss)来验证模型的准确性。而常用的评估指标还包括ROC曲线、AUC值等。 总之,TensorFlow深度学习CIFAR-10数据集上的模型训练与识别任务是一个非常具有挑战性的任务。它需要深入理解神经网络的架构和特性,同时也需要熟悉常用的训练算法和评估指标。随着不断发展的人工智能技术和深度学习模型,TensorFlow在各个领域的应用前景非常广阔。 ### 回答3: TensorFlow是一个深度学习框架,广泛应用于研究和工业应用中。CIFAR10是一个广泛使用的图像分类数据集,由10个类别的60000张32x32像素图像组成。 TensorFlow提供了许多工具和API来训练和识别基于CIFAR10数据集的模型。 1. 准备数据 CIFAR10数据集可以从网上下载,通过使用Python编写脚本可以将其转换成可用于TensorFlow训练和识别的格式。例如,使用TensorFlow数据输入库,可以将图像预处理,并将其转换为模型输入的batch格式。 2. 定义模型 可以使用TensorFlow构建各种类型的神经网络来训练CIFAR10数据集,如卷积神经网络(CNN)和循环神经网络(RNN)。TensorFlow提供的各种API可以方便地定义网络的结构和层,从而创建一个高效的图像分类器。 3. 训练模型 要训练模型,需要使用TensorFlow的优化器来计算和调整网络权重和偏置,以最小化损失函数。在训练期间,还需要定义一些指标来监控模型的性能和进度。可以使用TensorFlow提供的训练API,创建训练循环,并针对单个或多个GPU进行分布式训练。 4. 评估和测试模型 为确保神经网络在完全独立于训练数据的环境中运行良好,需要对其进行评估和测试。可以使用TensorFlow提供的API,对模型的准确性和性能进行评估。评估模型时,可以使用验证数据集,在训练过程中监控模型的泛化性能,避免过拟合。 5. 部署模型 一旦模型经过训练并通过评估,就可以使用TensorFlow的模型导出和转换工具,将其部署到生产环境中。TensorFlow支持将模型导出为TensorFlow Lite格式,以在移动设备上运行,并提供了Java,C++和Python等多种语言的API,便于将模型嵌入到应用程序中。 总之,TensorFlow提供了几种方法来训练和识别CIFAR10数据集上的模型。可以结合使用TensorFlow的API,优化器和分布式训练工具,以提高模型效率和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值