【深度学习图像识别课程】keras实现CNN系列:(5)应用数据增强进行CIFAR10分类

一、图像增强简介

如何保证图像的标度不变性(大小)、平移不变性(位置)、旋转不变性(角度)?

 

最大池化层:保证平移不变性

增强:训练集扩展,对训练图片进行随机旋转或者平移。保证平移不变性,旋转不变性;避免过拟合

keras文档:https://keras.io/preprocessing/image/

另外的参考:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

                   https://machinelearningmastery.com/image-augmentation-deep-learning-keras/

 

二、CIFAR10图像库增强实战

跟增强前的CNN相比,在第4个步骤“切分数据集之后加了:创建图像增强产生器,可视化增强图像。并且在训练模型时,使用跟增强匹配的model.fit_generator,其他均跟之前一致。

1 加载CIFAR10数据库

import keras
from keras.datasets import cifar10

(x_train, y_train),(x_test, y_test) = cifar10.load_data()
print(x_train.shape)
print(x_test.shape)

2 可视化前36幅图像

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

fig = plt.figure(figsize=(20,5))
for i in range(36):
    ax = fig.add_subplot(3, 12, i + 1, xticks=[], yticks=[])
    ax.imshow(np.squeeze(x_train[i]))

3 归一化

x_train = x_train.astype('float32')/255
x_test = x_test.astype('float32')/255

4 切分训练集、验证集、测试集

from keras.utils import np_utils
num_classes = len(np.unique(y_train))
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

(x_train, x_valid) = x_train[5000:], x_train[:5000]
(y_train, y_valid) = y_train[5000:], y_train[:5000]

print('x_train shape:', x_train.shape)

print(x_train.shape[0], 'train examples')
print(x_valid.shape[0], 'valid examples')
print(x_test.shape[0], 'test examples')

 

5 创建和配置图像增强产生器

from keras.preprocessing.image import ImageDataGenerator

datagen_train = ImageDataGenerator(
width_shift_range = 0.1,
height_shift_range = 0.1,
horizontal_flip = True)

datagen_train.fit(x_train)

 

 

keras.preprocessing.image.ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-06,
rotation_range=0.0,           随机旋转角度范围
width_shift_range=0.0,        宽度移动范围
height_shift_range=0.0,       高度移动范围
brightness_range=None,        亮度范围
shear_range=0.0,              剪切范围
zoom_range=0.0,               缩放方位
channel_shift_range=0.0,      通道转换范围
fill_mode='nearest',          填充模式(4种,constant, nearest, wrap, reflection)
cval=0.0,                     当填充模式为constant时,填充的值
horizontal_flip=False,        水平翻转
vertical_flip=False,          垂直翻转
rescale=None,                 数据缩放
preprocessing_function=None,  图像缩放、增强后使用
data_format=None,             图像集格式,(samples,height,width,channels)还是channels在samples后
validation_split=0.0)         数据集用来做验证集的比例

 

6 可视化原始和增强后的图像

 

import matplotlib.pyplot as plt

# take subset of training data
x_train_subset = x_train[:12]

# visualize subset of training data
fig = plt.figure(figsize=(20,2))
for i in range(0, len(x_train_subset)):
    ax = fig.add_subplot(1, 12, i+1)
    ax.imshow(x_train_subset[i])
fig.suptitle('Subset of Original Training Images', fontsize=20)
plt.show()

# visualize augmented images
fig = plt.figure(figsize=(20,2))
for x_batch in datagen_train.flow(x_train_subset, batch_size=12):
    for i in range(0, 12):
        ax = fig.add_subplot(1, 12, i+1)
        ax.imshow(x_batch[i])
    fig.suptitle('Augmented Images', fontsize=20)
    plt.show()
    break;

 

7 定义模型

 

 
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu', input_shape=(32,32,3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(num_classes, activation='softmax'))

model.summary()

模型跟增强前比,不变。

8 编译模型

model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

9 训练模型

from keras.callbacks import ModelCheckpoint

batch_size = 32
checkpoint = ModelCheckpoint(filepath='MLP.weights.best.hdf5', verbose=1, save_best_only=True)
model.fit_generator(datagen_train.flow(x_train, y_train, batch_size=32),
                    steps_per_epoch=x_train.shape[0] // batch_size,
                    epochs = 100,
                    verbose=2,
                    callbacks=[checkpoint],
                    validation_data=(x_valid, y_valid),
                    validation_steps=x_valid.shape[0] // batch_size)

参数说明:

flow(x, y=None, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png', subset=None)

  • x: 数据集
  • y: 标签
  • batch_size
  • shuffle
  • seed
  • save_to_dir: 可以设置为None或者字符串str。如果设置为str,则可以保存产生的增强图像。
  • save_prefix: 保存增强图像名的前缀。如果变量save_to_dir设置为路径,这里才有效。
  • save_format: 增强图像保存格式,可以为png或者jpeg,默认png。同样,.变量save_to_dir设置为路径,这里才有效。
  • subset: 子集("training" or "validation")。当ImageDataGenerator 中 validation_split 设置才有效。

fit_generator(self, generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=Nonevalidation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

  • generator:
  • steps_per_epoch = x_train.shape[0]/batch_size。确保模型在每个epoch中看 x_train.shape[0]个增强图片
  • epochs:
  • verbose: 0, 1, or 2
  • callbacks:
  • validation_data:
  • validation_steps:
  • class_weight:
  • max_queue_size:
  • workers:
  • use_multiprocessing:
  • shuffle:
  • initial_epoch: 初始epoch

 

10 加载在验证集上分类正确率最高的一组模型参数

model.load_weights('MLP.weights.best.hdf5')

11 测试集上计算分类正确率

score = model.evaluate(x_test, y_test, verbose=0)
print('\n', 'Test accuracy:', score[1])

我只训练了10个epoch,理论上这里的正确率应该是要比没有增强前的高。

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: CIFAR-10是一个包含10个别共60,000张32x32彩色图像的数据集,每个别有6,000张。这个数据集被广泛用于计算机视觉中的图像分类问题。 卷积神经网络(CNN)是常用于图像分类深度学习模型。下面是一个基本的CIFAR-10图像分类CNN模型的代码示例: ```python import tensorflow as tf from tensorflow.keras import datasets, layers, models # 加载数据集 (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() # 将像素值缩放到0到1之间 train_images, test_images = train_images / 255.0, test_images / 255.0 # 定义模型 model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10)) # 编译模型 model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) # 训练模型 history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) # 评估模型 test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print(test_acc) ``` 这个模型包含3个卷积层和2个全连接层。在训练过程中,我们使用了Adam优化器和交叉熵损失函数。在测试集上的准确率达到了大约70%。你可以尝试调整模型的结构和超参数来提高准确率。 ### 回答2: CIFAR-10图像分类是利用卷积神经网络(Convolutional Neural Network, CNN)对CIFAR-10数据集进行图像分类的任务。CIFAR-10数据集包含10个不同别的60000个32x32彩色图像,每个别有6000个图像。CNN是一种专门用于图像分类任务的深度学习模型。 首先,我们需要对CIFAR-10数据集进行预处理。预处理的步骤包括图像的加载、归一化处理和标签的转换。加载图像后,我们可以对图像进行归一化处理,将像素值缩放到0到1之间,以使模型更易训练。然后,我们需要将别标签转换为独热编码形式,使得模型可以正确识别别。 接下来,构建CNN模型。CNN模型由卷积层、池化层和全连接层组成。卷积层通过使用一组卷积核对输入图像进行特征提取,提取到的特征在后续的层中进行进一步处理。池化层用于对特征进行下采样,减少特征的维度。全连接层则用于将特征与进行映射,最终给出分类结果。 在训练CNN模型之前,我们需要将数据集分为训练集和测试集,通常采用70%的数据作为训练集,30%的数据作为测试集。接着,我们使用训练集对CNN模型进行训练,通过反向传播算法不断更新模型的参数,使其能够更好地适应训练集的特征。在训练过程中,一般会使用交叉熵作为损失函数,优化算法常用的是随机梯度下降法。 训练完成后,我们使用测试集对模型进行评估。通过将测试图像输入到训练好的模型中,可以得到模型对测试图像的分类结果。将模型的分类结果与测试集中的真实标签进行比对,可以计算出模型的准确率等评价指标。 总结起来,CIFAR-10图像分类CNN流程主要包括数据预处理、模型构建、训练和评估。通过对这些步骤的不断优化和调整,可以得到一个能够准确分类CIFAR-10图像的CNN模型。 ### 回答3: CIFAR-10是一个广泛使用的图像分类数据集,其中包含10个不同别的60000个32x32彩色图片,用于训练和测试机器学习模型。为了解决CIFAR-10图像分类问题,使用CNN(卷积神经网络)是一种常见且有效的方法。 CNN使用多个卷积层、池化层和全连接层来提取图像的特征并分类。其原理是通过学习和提取图像中的局部特征来实现分类。在CNN中,卷积层将使用一组滤波器对输入图像进行卷积运算,以捕捉不同的局部特征。池化层用于减小特征图的空间大小,减少参数数量,并提高模型的鲁棒性。最后,全连接层将对提取的特征进行分类,以确定图像属于哪个别。 对于CIFAR-10数据集,可以根据实际需求选择合适的CNN模型进行训练和分类。常见的CNN模型包括LeNet-5、AlexNet、VGG Net和ResNet等。从简单到复杂的顺序选择CNN模型,可以根据任务的复杂性和计算资源的可用性来确定。 在训练CNN模型时,通常使用随机梯度下降(SGD)等优化算法来最小化损失函数,使模型能够逐渐学习并提高分类性能。此外,数据增强技术如翻转、旋转和平移等也常用于增加训练数据的多样性,提高模型的泛化能力。 最后,在对测试集进行评估时,可使用准确率、精确率、召回率和F1得分等指标来衡量模型的性能。对于CIFAR-10数据集,训练一个高准确率的CNN模型可能需要相当长的时间和计算资源。 总之,CIFAR-10图像分类问题是一个挑战性的任务,但使用CNN模型可以有效地解决该问题。使用适当的CNN模型和训练技巧,可以实现较高的分类性能和泛化能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值