学习记录(一)制作python版本的CIFAR10数据集

学习记录(一)

1. 制作自己的数据集

该数据集是通过使用网络爬虫以及对其他车辆数据集中的图片进行收集,制作的一个与cifar10数据集结构相同的车辆数据集。所有照片被分为10个不同的类别,它们分别是train,bus,minibus,fireengin,motorcycle,ambulance,sedan,jeep,bike和truck,共六万张,图片的规格为32×32×3。其中50000张图片被划分为训练集,剩下的10000张图片为测试集。

在这里插入图片描述

制作好的数据集的字典内的顺序为:[data、labels、batch_label、filenames]

参考文章:用自己的数据,制作python版本的cifar10数据集
     将自己的数据集转换为cifar数据集格式

在这里插入图片描述
在这里插入图片描述
查看第一个数据批(data_batch_1),得到:

  • data:data为uint8编码的numpy数组,为RGB的值。
  • labels:labels就是第几类,此处对应0-9共10类,labels为utf-8编码的列表。
  • batch_label:batch_label就是第几个batch,batch_label为utf-8编码的字符串。共有5个batch,而此处查看的为第一个batch。
  • filenames:filename就是图片的名字,filename为utf-8编码的字符串。此处有:

camion、tipper_truck、trailer_truck、dumper、trucking_rig、articulated_lorry、delivery_truck、aerial_ladder_truck、truck、moving_van、file_truck、dust_cart、lorry、garbage_truck、dump_truck、motortruck、fire_engine、transporter、ladder_truck、pantechnicon、semi、wrecker、tipper_lorry、tipper、laundry_truck、tandem_trailer、tow_truck、panel_truck、car_transporter、bookmobile、tractor_trailer等。

2. 生成GAN数据集
  • GAN的定义
    简单来说就是由两部分组成,生成器generator网络和判别器discriminator网络。一部分不断进化,使其对立部分也不断进化,实现共同进化的过程。
      需要注意的是,discriminator对于输入的真实图像都应是高分,那么如果训练时只给它真实图像的话,他就无法实现正确的判断,会将所有输入都判为高分。所以需要一些差的图像送给discriminator进行训练,并且这些差的图像不应是简单的加些噪声之类的能让它轻易分辨的。因此,训练它的方法是,除真实图像外先给它一些随机生成的差的例子,然后对discriminator解argmaxD(x)做generation生成出一些他觉得好的图像,然后将原本极差的图像换为这些图像再进行训练,如此往复,discriminator会不断产生更好的图像,将这些作为negative examples给其学习,达到训练的目的。
  • GAN的实现
  1. 导入keras库
import tensorflow.compat.v2 as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
  1. 生成器网络
    将一个向量(来自潜在空间,训练过程中对其随机采样)转换为一张候选图像。
    生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器。
latent_dim = 32
height = 32
width = 32
channels = 3
 
generator_input = tf.keras.Input(shape=(latent_dim,))

将输入转换为大小为16*16的128个通道的特征图

x = layers.Dense(128*16*16)(generator_input)
x = layers.LeakyReLU()(x)
x = layers.Reshape((16,16,128))(x)
 
x = layers.Conv2D(256,5,padding='same')(x)
x = layers.LeakyReLU()(x)

上采样为32*32

x = layers.Conv2DTranspose(256,4,strides=2,padding='same')(x)
x = layers.LeakyReLU()(x)
 
x = layers.Conv2D(256,5,padding='same')(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(256,5,padding='same')(x)
x = layers.LeakyReLU()(x)

生成一个大小为32*32的单通道特征图(即CIFAR10图像的形状)

x = layers.Conv2D(channels,7,activation='tanh',padding='same')(x)

将生成器模型实例化,它将形状为(latent_dim,)的输入映射到形状为(32,32,3)的图像

generator = tf.keras.models.Model(generator_input,x)
generator.summary()
  1. 判别器网络
    它接收一张候选图像(真实的或合成的)作为输入,并将其划分到这两个类别之一:“生成图像"或"来自训练集的真实图像”。
    设置GAN,将生成器和判别器连接在一起训练时,这个模型将让生成器向某个方向移动,从而提高它欺骗判别器的能力。这个模型将潜在空间的点转换为一个分类决策(即"真"或"假") 它训练的标签都是"真实图像"。因此,训练gan将会更新generator得到权重,使得discriminator在观测假图像时更有可能预测为"真"。
#GAN判别器网络
discriminator_input = layers.Input(shape=(height,width,channels))
x = layers.Conv2D(128,3)(discriminator_input)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x = layers.LeakyReLU()(x)
x = layers.Flatten()(x)

一个dropout层

x = layers.Dropout(0.4)(x)

分类层

x = layers.Dense(1,activation='sigmoid')(x)#分类层

将判别器模型实例化,它将形状为(32,32,3)的输入转换为一个二进制分类决策(真/假)

discriminator = tf.keras.models.Model(discriminator_input,x)
discriminator.summary()

discriminator_optimizer = tf.keras.optimizers.RMSprop(
    lr=0.0008,
    clipvalue = 1.0, #在优化器中使用梯度裁剪(限制梯度值的范围)
    decay = 1e-8,#为了稳定训练过程,使用学习率衰减
)
 
discriminator.compile(optimizer=discriminator_optimizer,
                     loss='binary_crossentropy')
  1. 对抗网络
discriminator.trainable = True #将判别器权重设置为不可训练(仅应用于gan模型)
 
gan_input = tf.keras.Input(shape=(latent_dim,))
gan_output = discriminator(generator(gan_input))
gan = tf.keras.models.Model(gan_input,gan_output)
gan_optimizer = tf.keras.optimizers.RMSprop(lr=0.0004,clipvalue=1.0,decay=1e-8)
gan.compile(optimizer=gan_optimizer,loss='binary_crossentropy')
  1. 实现GAN的训练
import os
from tf.keras.preprocessing import image
 
(x_train,y_train),(_,_) = keras.datasets.cifar10.load_data() #cifar数据集
x_train = x_train[y_train.flatten() == 6]#选择青蛙的图像
x_train = x_train.reshape((x_train.shape[0],) + (height,width,channels)).astype('float32')/255.

iterations = 1000
batch_size = 2
save_dir = 'frog_dir'
 
start = 0
 
for step in range(iterations):
    random_latent_vectors = np.random.normal(size=(batch_size,latent_dim))
    generated_images = generator.predict(random_latent_vectors)#点-->虚假图像
     
    stop = start + batch_size

混淆真实图像和虚假图像

    real_images = x_train[start:stop]
    combined_images = np.concatenate([generated_images,
                                      real_images])
    labels = np.concatenate([np.ones((batch_size,1)),
                             np.zeros((batch_size,1))])
    labels += 0.05 * np.random.random(labels.shape) #向标签中添加噪声

训练判别器

    d_loss = discriminator.train_on_batch(combined_images,labels)

在潜在空间中采样随机点

    random_latent_vectors = np.random.normal(size=(batch_size,latent_dim))

合并标签,全都是“真实图像”(这是在撒谎)

 misleading_targets = np.zeros((batch_size,1))

通过gan模型来训练生成器(此时冻结判别器模型)

    a_loss = gan.train_on_batch(random_latent_vectors,misleading_targets)
     
    start += batch_size
    if start > len(x_train) - batch_size:
        start = 0
    if step % 2 == 0:
        gan.save_weights('gan.h5')
         
        print('discriminator loss:',d_loss)
        print('adversarial loss:',a_loss)
         
        img = image.array_to_img(generated_images[0] * 255.,scale=False)
        img.save(os.path.join(save_dir,'generated_frog'+str(step)+'.png'))
         
        img = image.array_to_img(real_images[0]*255.,scale=False)
        img.save(os.path.join(save_dir,'real_frog'+str(step)+'.png'))
遇到的问题
  1. 用于生成GAN图像的源图像集为上一步生成的数据集,故在代码中将导入数据集修改为:
#cifar数据集
(x_train,y_train),(_,_) = tf.keras.datasets.cifar10.load_data() 

并且在路径:D:\anaconda3\envs\tensorflow_gpu\Lib\site-packages\keras\datasets中加入源图像集,修改名称为:cifar-10-batches-py。(如下图,由于在cifar10源码中文件索引名为cifar-10-batches-py)
在这里插入图片描述
参考文章:keras实现–>生成式深度学习之用GAN生成图像

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python可以使用以下步骤读取CIFAR-10数据集: 1. 下载CIFAR-10数据集并解压缩。 2. 使用Python的pickle模块读取数据集文件。 3. 将读取的数据集转换为NumPy数组。 4. 对数据集进行预处理,例如归一化和标准化。 以下是一个示例代码: ```python import pickle import numpy as np # 读取CIFAR-10数据集 def load_cifar10_data(path): with open(path, 'rb') as f: cifar10 = pickle.load(f, encoding='bytes') # 将数据集转换为NumPy数组 X = np.array(cifar10[b'data']) y = np.array(cifar10[b'labels']) return X, y # 对数据集进行预处理 def preprocess_cifar10_data(X): # 归一化 X = X / 255.0 # 标准化 mean = np.mean(X, axis=0) std = np.std(X, axis=0) X = (X - mean) / std return X # 加载训练集和测试集 X_train, y_train = load_cifar10_data('cifar-10-batches-py/data_batch_1') X_test, y_test = load_cifar10_data('cifar-10-batches-py/test_batch') # 对数据集进行预处理 X_train = preprocess_cifar10_data(X_train) X_test = preprocess_cifar10_data(X_test) ``` 希望这可以帮助到你! ### 回答2: CIFAR-10是一个包含10个类别共计60,000张32x32像素彩色图像的数据集,可用于图像分类的基准测试。使用Python读取CIFAR-10数据集需要进行以下步骤: 1. 下载CIFAR-10数据集,可以从网络上找到开源的下载接口,也可以使用Python自带的urllib库。下载后解压缩得到五个数据文件。 2. 使用Python的numpy库读取数据文件。数据文件中是二进制数据,需要借助Numpy库中的fromfile函数将其读入内存。在读取数据之前,需要明确数据的格式。 3. 解析数据文件,将其中的二进制数据转换成图像矩阵。CIFAR-10数据集文件中包含训练集数据文件和测试集数据文件,每个数据文件中数据的组织方式如下:每个样本数据由标签和图像数据组成,标签表明该图像属于哪一分类,图像数据则是一个3x32x32的矩阵,每个数据点是一个0-255的整数,代表颜色值。 4. 加载图像数据至内存中,并对其进行预处理。由于图像数据中每个像素的取值范围在0-255之间,为了避免出现数值范围问题,需要将其进行归一化处理,将其范围缩放到0-1之间。 5. 在数据集加载完毕后,我们对其进行划分,分为训练集和测试集两个部分,一般采用80%来作为训练集,20%的数据作为测试集。 6. 将处理好的数据输入到模型中进行训练。 总之,通过Python读取CIFAR-10数据集是一项比较复杂的工作,需要考虑到数据的格式、读取数据的方式、数据的预处理,以及数据的划分等因素。但是,通过Python语言提供的丰富库函数可以完成这样的任务,并且可以非常方便地对数据进行预处理和划分。 ### 回答3: CIFAR-10 是计算机视觉中广泛使用的一个数据集,包含 60,000 张 32x32 的彩色图像,共分为 10 个类别。这个数据集可以用于训练和测试图像分类模型。在 Python 中,我们可以使用 Tensorflow 或 PyTorch 库来读取 CIFAR-10 数据集。 使用 Tensorflow 读取 CIFAR-10 数据集: 1.导入 TensorFlow 库: ``` import tensorflow as tf ``` 2.定义数据集路径及一些超参数: ``` cifar10 = tf.keras.datasets.cifar10 (train_images, train_labels), (test_images, test_labels) = cifar10.load_data() class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'] ``` 3.读取数据集并预处理: ``` # 将像素值归一化到 [0, 1] 的范围内 train_images, test_images = train_images/255.0, test_images/255.0 ``` 4.可视化图像: ``` import matplotlib.pyplot as plt plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i][0]]) plt.show() ``` 使用 PyTorch 读取 CIFAR-10 数据集: 1.导入 PyTorch 库: ``` import torch import torchvision import torchvision.transforms as transforms ``` 2.定义数据集路径及一些超参数: ``` transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') ``` 3.读取数据集及预处理: ``` # 不需要特定的代码读取和归一化数据集 ``` 4.可视化图像: ``` import matplotlib.pyplot as plt import numpy as np # 从数据集中随机选择一些图片并可视化 dataiter = iter(trainloader) images, labels = dataiter.next() fig, axes = plt.subplots(1, len(images), figsize=(12,12)) for idx in np.arange(len(images)): ax = axes[idx] image = images[idx] label = labels[idx] ax.imshow(np.transpose(image, (1, 2, 0))) ax.set_title(classes[label]) ax.axis('off') ``` 无论是 Tensorflow 还是 PyTorch,读取 CIFAR-10 数据集的步骤大体相同,只是具体实现方式有所差异。掌握数据集读取方法是进行计算机视觉模型训练和实践的基础,也是开发实用系统的第一步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值