基于CIFAR10(小批量图片)数据集训练简单的深度卷积神经网络
本例比较扩大数据(样本)集的两种方法:ImageGenerator 和 AugmentLayer
代码注释
'''Train a simple deep CNN on the CIFAR10 small images dataset.
基于CIFAR10(小批量图片)数据集训练简单的深度卷积神经网络
本例使用的是AugmentLayer方法
本例比较增加数据集的两种方法:ImageGenerator 和 AugmentLayer
ImageGenerator:图像生成器(增加样本数量)
AugmentLayer:增强(扩展、增加,增加样本数量)层
Using Tensorflow internal augmentation APIs by replacing ImageGenerator with
an embedded AugmentLayer using LambdaLayer, which is faster on GPU.
使用Tensorflow内部增强API,它通过使用嵌入的使用Lambda层的增强层替换ImageGenerator,Lambda层在GPU上更快
# Benchmark of `ImageGenerator` vs `AugmentLayer` both using augmentation 2D:
` ImageGenerator `基准 VS 'AugmentLayer' 都基于扩展2D `:
(backend = Tensorflow-GPU, Nvidia Tesla P100-SXM2)
(基于 = Tensorflow-GPU,, Nvidia Tesla P100-SXM2 (显卡))
Settings: horizontal_flip = True
设置:水平翻转 = True
----------------------------------------------------------------------------
Epoch | ImageGenerator | ImageGenerator | AugmentLayer | Augment Layer
Number | %Accuracy | Performance | %Accuracy | Performance
----------------------------------------------------------------------------
1 | 44.84 | 15ms/step | 45.54 | 358us/step
2 | 52.34 | 8ms/step | 50.55 | 285us/step
8 | 65.45 | 8ms/step | 65.59 | 281us/step
25 | 76.74 | 8ms/step | 76.17 | 280us/step
100 | 78.81 | 8ms/step | 78.70 | 285us/step
---------------------------------------------------------------------------
Settings: rotation = 30.0
设置:旋转 = 30.0
----------------------------------------------------------------------------
Epoch | ImageGenerator | ImageGenerator | AugmentLayer | Augment Layer
Number | %Accuracy | Performance | %Accuracy | Performance
----------------------------------------------------------------------------
1 | 43.46 | 15ms/step | 42.21 | 334us/step
2 | 48.95 | 11ms/step | 48.06 | 282us/step
8 | 63.59 | 11ms/step | 61.35 | 290us/step
25 | 72.25 | 12ms/step | 71.08 | 287us/step
100 | 76.35 | 11ms/step | 74.62 | 286us/step
---------------------------------------------------------------------------
(Corner process and rotation precision by `ImageGenerator` and `AugmentLayer`
are slightly different.)
(“ImageGenerator”和“AugmentLayer”的拐角处理和旋转精度略有不同。)
'''
from __future__ import print_function
import keras
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, Lambda, MaxPooling2D
from keras import backend as K
import os
if K.backend() != 'tensorflow':
raise RuntimeError('This example can only run with the '
'TensorFlow backend, '
'because it requires TF-native augmentation APIs')
import tensorflow as tf
def augment_2d(inputs, rotation=0, horizontal_flip=False, vertical_flip=False):
"""Apply additive augmentation on 2D data.
在二维数据上应用添加增强
# Arguments
参数
rotation: A float, the degree range for rotation (0 <= rotation < 180),
旋转:浮点数,旋转角度范围(0 <= rotation < 180),
e.g. 3 for random image rotation between (-3.0, 3.0).
例如,随机图像旋转3,范围是(-3.0, 3.0).
horizontal_flip: A boolean, whether to allow random horizontal flip,
水平翻转:布尔型,是否允许随机水平翻转
e.g. true for 50% possibility to flip image horizontally.
例如:翻转水平翻转图像50%的可能
vertical_flip: A boolean, whether to allow random vertical flip,
垂直翻转:布尔型,是否允许随机垂直翻转
e.g. true for 50% possibility to flip image vertically.
例如:翻转垂直翻转图像50%的可能
# Returns
返回
input data after augmentation, whose shape is the same as its original.
增强后的输入数据,其形状(对于二维图像指宽高)与原始数据(宽高)相同
"""
if inputs.dtype != tf.float32:
inputs = tf.image.convert_image_dtype(inputs, dtype=tf.float32)
with tf.name_scope('augmentation'):
shp = tf.shape(inputs)
batch_size, height, width = shp[0], shp[1], shp[2]
width = tf.cast(width, tf.float32)
height = tf.cast(height, tf.float32)
transforms = []
identity = tf.constant([1, 0, 0, 0, 1, 0, 0, 0], dtype=tf.float32)
if rotation > 0:
angle_rad = rotation * 3.141592653589793 / 180.0
angles = tf.random_uniform([batch_size], -angle_rad, angle_rad)
f = tf.contrib.image.angles_to_projective_transforms(angles,
height, width)
transforms.append(f)
if horizontal_flip:
coin = tf.less(tf.random_uniform([batch_size], 0, 1.0), 0.5)
shape = [-1., 0., width, 0., 1., 0., 0., 0.]
flip_transform = tf.convert_to_tensor(shape, dtype=tf.float32)
flip = tf.tile(tf.expand_dims(flip_transform, 0), [batch_size, 1])
noflip = tf.tile(tf.expand_dims(identity, 0), [batch_size, 1])
transforms.append(tf.where(coin, flip, noflip))
if vertical_flip:
coin = tf.less(tf.random_uniform([batch_size], 0, 1.0), 0.5)
shape = [1., 0., 0., 0., -1., height, 0., 0.]
flip_transform = tf.convert_to_tensor(shape, dtype=tf.float32)
flip = tf.tile(tf.expand_dims(flip_transform, 0), [batch_size, 1])
noflip = tf.tile(tf.expand_dims(identity, 0), [batch_size, 1])
transforms.append(tf.where(coin, flip, noflip))
if transforms:
f = tf.contrib.image.compose_transforms(*transforms)
inputs = tf.contrib.image.transform(inputs, f, interpolation='BILINEAR')
return inputs
batch_size = 32
num_classes = 10
epochs = 100
num_predictions = 20
save_dir = '/tmp/saved_models'
model_name = 'keras_cifar10_trained_model.h5'
# The data, shuffled and split between train and test sets:
# 筛选(数据顺序打乱)、划分训练集和测试集
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# Convert class vectors to binary class matrices.
# 类别向量转为多分类(num_classes = 10)矩阵
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Lambda(augment_2d,
input_shape=x_train.shape[1:],
arguments={'rotation': 8.0, 'horizontal_flip': True}))
model.add(Conv2D(32, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
# initiate RMSprop optimizer
# 均方根反向传播(RMSprop,root mean square prop)优化
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
# Let's train the model using RMSprop
# 使用均方根反向传播(RMSprop)训练模型
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test),
shuffle=True)
# Save model and weights
# 保存模型和权重(数据)
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)
# Score trained model.
# 评估训练的模型
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])
代码执行
Keras详细介绍
中文:http://keras-cn.readthedocs.io/en/latest/
实例下载
https://github.com/keras-team/keras
https://github.com/keras-team/keras/tree/master/examples
完整项目下载
方便没积分童鞋,请加企鹅452205574,共享文件夹。
包括:代码、数据集合(图片)、已生成model、安装库文件等。