Keras CIFAR-10图像分类 GoogleNet 篇
文章目录
除了用pytorch可以进行图像分类之外,我们也可以利用tensorflow来进行图像分类,其中利用tensorflow的后端keras更是尤为简单,接下来我们就利用keras对CIFAR10数据集进行分类。
keras介绍
keras是python深度学习中常用的一个学习框架,它有着极其强大的功能,基本能用于常用的各个模型。
keras具有的特性
1、相同的代码可以在cpu和gpu上切换;
2、在模型定义上,可以用函数式API,也可以用Sequential类;
3、支持任意网络架构,如多输入多输出;
4、能够使用卷积网络、循环网络及其组合。
keras与后端引擎
Keras 是一个模型级的库,在开发中只用做高层次的操作,不处于张量计算,微积分计算等低级操作。但是keras最终处理数据时数据都是以张量形式呈现,不处理张量操作的keras是如何解决张量运算的呢?
keras依赖于专门处理张量的后端引擎,关于张量运算方面都是通过后端引擎完成的。这也就是为什么下载keras时需要下载TensorFlow 或者Theano的原因。而TensorFlow 、Theano、以及CNTK都属于处理数值张量的后端引擎。
keras设计原则
- 用户友好:Keras是为人类而不是天顶星人设计的API。用户的使用体验始终是我们考虑的首要和中心内容。Keras遵循减少认知困难的最佳实践:Keras提供一致而简洁的API, 能够极大减少一般应用下用户的工作量,同时,Keras提供清晰和具有实践意义的bug反馈。
- 模块性:模型可理解为一个层的序列或数据的运算图,完全可配置的模块可以用最少的代价自由组合在一起。具体而言,网络层、损失函数、优化器、初始化策略、激活函数、正则化方法都是独立的模块,你可以使用它们来构建自己的模型。
- 易扩展性:添加新模块超级容易,只需要仿照现有的模块编写新的类或函数即可。创建新模块的便利性使得Keras更适合于先进的研究工作。
- 与Python协作:Keras没有单独的模型配置文件类型(作为对比,caffe有),模型由python代码描述,使其更紧凑和更易debug,并提供了扩展的便利性。
安装keras
安装也是很简单的,我们直接安装keras即可,如果需要tensorflow,就还需要安装tensorflow
pip install keras
导入库
import keras
from keras.models import Sequential
from keras.datasets import cifar10
from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense, Activation
from keras.optimizers import adam_v2
from keras.utils.vis_utils import plot_model
from keras.utils.np_utils import to_categorical
from keras.callbacks import ModelCheckpoint
import matplotlib.pyplot as plt
import numpy as np
import os
import shutil
import matplotlib
matplotlib.style.use('ggplot')
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
控制GPU显存(可选)
这个是tensorflow来控制选择的GPU,因为存在多卡的时候可以指定GPU,其次还可以控制GPU的显存
这段语句就是动态显存,动态分配显存
config.gpu_options.allow_growth = True
这段语句就是说明,我们使用的最大显存不能超过50%
config.gpu_options.per_process_gpu_memory_fraction = 0.5
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 忽略低级别的警告
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
# The GPU id to use, usually either "0" or "1"
os.environ["CUDA_VISIBLE_DEVICES"]="0"
config = tf.compat.v1.ConfigProto()
# config = tf.ConfigProto()
# config.gpu_options.per_process_gpu_memory_fraction = 0.5
config.gpu_options.allow_growth = True
session = tf.compat.v1.Session(config=config)
加载 CIFAR-10 数据集
CIFAR-10 是由 Hinton 的学生 Alex Krizhevsky 和 Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含 10 个类别的 RGB 彩色图 片:飞机( arplane )、汽车( automobile )、鸟类( bird )、猫( cat )、鹿( deer )、狗( dog )、蛙类( frog )、马( horse )、船( ship )和卡车( truck )。图片的尺寸为 32×32 ,数据集中一共有 50000 张训练圄片和 10000 张测试图片。
与 MNIST 数据集中目比, CIFAR-10 具有以下不同点:
- CIFAR-10 是 3 通道的彩色 RGB 图像,而 MNIST 是灰度图像。
- CIFAR-10 的图片尺寸为 32×32, 而 MNIST 的图片尺寸为 28×28,比 MNIST 稍大。
- 相比于手写字符, CIFAR-10 含有的是现实世界中真实的物体,不仅噪声很大,而且物体的比例、 特征都不尽相同,这为识别带来很大困难。
num_classes = 10 # 有多少个类别
(x_train, y_train), (x_val, y_val) = cifar10.load_data()
print("训练集的维度大小:",x_train.shape)
print("验证集的维度大小:",x_val.shape)
训练集的维度大小: (50000, 32, 32, 3)
验证集的维度大小: (10000, 32, 32, 3)
可视化数据
class_names = ['airplane','automobile','bird','cat','deer',
'dog','frog','horse','ship','truck']
fig = plt.figure(figsize=(20,5))
for i in range(num_classes):
ax = fig.add_subplot(2, 5, 1 + i, xticks=[], yticks=[])
idx = np.where(y_train[:]==i)[0] # 取得类别样本
features_idx = x_train[idx,::] # 取得图片
img_num = np.random.randint(features_idx.shape[0]) # 随机挑选图片
im = features_idx[img_num,::]
ax.set_title(class_names[i])
plt.imshow(im)
plt.show()
数据预处理
x_train = x_train.astype('float32')/255
x_val = x_val.astype('float32')/255
# 将向量转化为二分类矩阵,也就是one-hot编码
y_train = to_categorical(y_train, num_classes)
y_val = to_categorical(y_val, num_classes)
output_dir = './output' # 输出目录
if os.path.exists(output_dir) is False:
os.mkdir(output_dir)
# shutil.rmtree(output_dir)
# print('%s文件夹已存在,但是没关系,我们删掉了' % output_dir)
# os.mkdir(output_dir)
print('%s已创建' % output_dir)
print('%s文件夹已存在' % output_dir)
model_name = 'googleNet'
./output已创建
./output文件夹已存在
GooLeNet网络
GoogLeNet在2014年由Google团队提出(与VGG网络同年,注意GoogLeNet中的L大写是为了致敬LeNet),斩获当年ImageNet竞赛中Classification Task (分类任务) 第一名。原论文名称是《Going deeper with convolutions》,下面是网络结构图。
说说该网络中的亮点:
(1)引入了Inception结构(融合不同尺度的特征信息)
(2)使用1x1的卷积核进行降维以及映射处理 (虽然VGG网络中也有,但该论文介绍的更详细)
(3)添加两个辅助分类器帮助训练
(4)丢弃全连接层,使用平均池化层(大大减少模型参数,除去两个辅助分类器,网络大小只有vgg的1/20)
接着我们来分析一下Inception结构:
Inception v1网络是一个精心设计的22层卷积网络,并提出了具有良好局部特征结构Inception模块,即对特征并行地执行多个大小不同的卷积运算与池化,最后再拼接到一起。由于1×1、3×3和5×5的卷积运算对应不同的特征图区域,因此这样做的好处是可以得到更好的图像表征信息。为了让四个分支的输出能够在深度方向进行拼接,必须保证四个分支输出的特征矩阵高度和宽度都相同)。
Inception模块如图3.13所示,使用了三个不同大小的卷积核进行卷积运算,同时还有一个最大值池化,然后将这4部分级联起来(通道拼接),送入下一层。
分支1是卷积核大小为1x1的卷积层,stride=1,
分支2是卷积核大小为3x3的卷积层,stride=1,padding=1(保证输出特征矩阵的高和宽和输入特征矩阵相等),
分支3是卷积核大小为5x5的卷积层,stride=1,padding=2(保证输出特征矩阵的高和宽和输入特征矩阵相等),
分支4是池化核大小为3x3的最大池化下采样,stride=1,padding=1(保证输出特征矩阵的高和宽和输入特征矩阵相等)。
在上述模块的基础上,为进一步降低网络参数量,Inception又增加了多个1×1的卷积模块。如图3.14所示,这种1×1的模块可以先将特征图降维,再送给3×3和5×5大小的卷积核,由于通道数的降低,参数量也有了较大的减少。
Inception v1网络一共有9个上述堆叠的模块,共有22层,在最后的Inception模块处使用了全局平均池化。
为了避免深层网络训练时带来的梯度消失问题,作者还引入了两个辅助的分类器,在第3个与第6个Inception模块输出后执行Softmax并计算损失,在训练时和最后的损失一并回传。
接着下来在看看辅助分类器结构,网络中的两个辅助分类器结构是一模一样的,如下图所示:
辅助分类器:
第一层是一个平均池化下采样层,池化核大小为5x5,stride=3
第二层是卷积层,卷积核大小为1x1,stride=1,卷积核个数是128
第三层是全连接层,节点个数是1024
第四层是全连接层,节点个数是1000(对应分类的类别个数)
Inception v1的参数量是AlexNet的1/12,VGGNet的1/3,适合处理大规模数据,尤其是对于计算资源有限的平台。
Inception v2
在Inception v1网络的基础上,随后又出现了多个Inception版本。Inception v2进一步通过卷积分解与正则化实现更高效的计算,增加了BN层,同时利用两个级联的3×3卷积取代Inception v1版本中的5×5卷积,如图3.15所示,这种方式既减少了卷积参数量,也增加了网络的非线性能力。
此外除了这两个版本,这几年还分别出了Inception v3和Inception v4。
Inception v3在Inception v2的基础上,使用了RMSProp优化器,在辅助的分类器部分增加了7×7的卷积,并且使用了标签平滑技术。
Inception v4则是将Inception的思想与残差网络进行了结合,显著提升了训练速度与模型准确率,这里对于模块细节不再展开讲述。至于残差网络这一里程碑式的结构,正是由下一节的网络ResNet引出的。
这里演示只展示一个Inception v1的网络结构有兴趣的话也可以尝试其他网络结构
from keras.models import Model
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.layers import BatchNormalization
from keras.layers import Activation
from keras.layers import Input
from keras.layers import AveragePooling2D
from keras import regularizers
from keras.layers import concatenate
input_shape = (32,32,3)
首先可以构建一个conv2d -> bn -> relu的神经网络
def conv2d_bn_relu(x, filters, kernel_size, name, weight_decay=.0, strides=(1, 1), use_bn=True):
conv_name = name + "-conv"
x = Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding='same',
use_bias=False,
kernel_regularizer=regularizers.l2(weight_decay),
name=conv_name)(x)
if use_bn:
bn_name = name + "-bn"
x = BatchNormalization(scale=False, axis=3, name=bn_name)(x)
relu_name = name + "-relu"
x = Activation('relu', name=relu_name)(x)
return x
def inception_block_v1(x, filters_num_array, name, weight_decay=.0, use_bn=True):
"""
:param x: model
:param filters_num_array: filters num is 4 branch format (1x1, (1x1, 3x3), (1x1, 5x5), (pool, 1x1))
:return: block added model x
"""
(br0_filters, br1_filters, br2_filters, br3_filters) = filters_num_array
# br0
br0 = conv2d_bn_relu(x,
filters=br0_filters, kernel_size=(1, 1), weight_decay=weight_decay,
name=name + '-br0-1x1', use_bn=use_bn)
# br1
br1 = conv2d_bn_relu(x,
filters=br1_filters[0], kernel_size=(1, 1), weight_decay=weight_decay,
name=name + '-br1-1x1', use_bn=use_bn)
br1 = conv2d_bn_relu(br1,
filters=br1_filters[1], kernel_size=(3, 3), weight_decay=weight_decay,
name=name + '-br1-3x3', use_bn=use_bn)
# br2
br2 = conv2d_bn_relu(x,
filters=br2_filters[0], kernel_size=(1, 1), weight_decay=weight_decay,
name=name + '-br2-1x1', use_bn=use_bn)
br2 = conv2d_bn_relu(br2, filters=br2_filters[1], kernel_size=(5, 5), name=name + '-br2-5x5', use_bn=use_bn)
# br3
br3 = MaxPool2D(pool_size=(3, 3), strides=(1, 1), padding='same', name=name + '-br3-pool')(x)
br3 = conv2d_bn_relu(br3, filters=br3_filters, kernel_size=(1, 1), weight_decay=weight_decay, name=name + '-br3-1x1')
x = concatenate([br0, br1, br2, br3], axis=3, name=name)
return x
def aux_classifier_v1(x, num_classes, name):
aux_classifier = AveragePooling2D(pool_size=(5, 5), strides=(3, 3), name=name + '-averagePool')(x)
aux_classifier = conv2d_bn_relu(aux_classifier, filters=128, kernel_size=(1, 1), name=name+'-1x1conv')
aux_classifier = Flatten(name=name + '-flatten')(aux_classifier)
aux_classifier = Dense(1024)(aux_classifier)
aux_classifier = Dropout(0.3, name=name + '-dropout')(aux_classifier)
aux_classifier = Dense(num_classes, activation='softmax', name=name + '-predictions')(aux_classifier)
return aux_classifier
def InceptionV1(input_shape, classes, weight_decay=.0, use_bn=True):
input = Input(shape=input_shape)
x = input
x = conv2d_bn_relu(x,
filters=64, kernel_size=(7, 7), name='1a',
weight_decay=weight_decay, strides=(2, 2), use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='1-pool')(x)
x = conv2d_bn_relu(x,
filters=64, kernel_size=(1, 1), weight_decay=weight_decay,
name='2a', use_bn=use_bn)
x = conv2d_bn_relu(x, filters=192, kernel_size=(3, 3), weight_decay=weight_decay,
name='2b', use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='2-pool')(x)
# inception3a
x = inception_block_v1(x, (64, (96, 128), (16, 32), 32),
weight_decay=weight_decay,
name='inception3a', use_bn=use_bn)
# inception3b
x = inception_block_v1(x, (128, (128, 192), (32, 96), 64),
weight_decay=weight_decay,
name='inception3b', use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='3pool')(x)
# inception4a
x = inception_block_v1(x, (192, (96, 208), (16, 48), 64),
weight_decay=weight_decay,
name='inception4a', use_bn=use_bn)
# inception4b
x = inception_block_v1(x, (160, (112, 224), (24, 64), 64),
weight_decay=weight_decay,
name='inception4b', use_bn=True)
# inception4c
x = inception_block_v1(x, (128, (128, 256), (24, 64), 64),
weight_decay=weight_decay,
name='inception4c', use_bn=use_bn)
# inception4d
x = inception_block_v1(x, (112, (144, 288), (32, 64), 64),
weight_decay=weight_decay,
name='inception4d', use_bn=use_bn)
# inception4e
x = inception_block_v1(x, (256, (160, 320), (32, 128), 128),
weight_decay=weight_decay,
name='inception4e', use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='4pool')(x)
# inception5a
x = inception_block_v1(x, (256, (160, 320), (32, 128), 128),
weight_decay=weight_decay,
name='inception5a', use_bn=use_bn)
# inception5b
x = inception_block_v1(x, (384, (192, 384), (48, 128), 128),
weight_decay=weight_decay,
name='inception5b', use_bn=use_bn)
# average pool
x = AveragePooling2D(pool_size=(7, 7), strides=(1, 1), padding='valid', name='avg7x7')(x)
x = Dropout(0.4)(x)
x = Flatten(name='flatten')(x)
x = Dense(classes, activation='softmax', name='predictions')(x)
model = Model(input, x, name='inception_v1')
return model
def InceptionV1ForCIFAR10(input_shape=(32,32,3), classes=10, weight_decay=.0, use_bn=True):
input = Input(shape=input_shape)
x = input
# x = conv2d_bn_relu(x,
# filters=64, kernel_size=(7, 7), name='1a',
# weight_decay=weight_decay, strides=(2, 2), use_bn=use_bn)
# x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='1-pool')(x)
x = conv2d_bn_relu(x,
filters=64, kernel_size=(1, 1), weight_decay=weight_decay,
name='2a', use_bn=use_bn)
x = conv2d_bn_relu(x, filters=192, kernel_size=(3, 3), weight_decay=weight_decay,
name='2b', use_bn=use_bn)
# x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='2-pool')(x)
# inception3a
x = inception_block_v1(x, (64, (96, 128), (16, 32), 32),
weight_decay=weight_decay,
name='inception3a', use_bn=use_bn)
# inception3b
x = inception_block_v1(x, (128, (128, 192), (32, 96), 64),
weight_decay=weight_decay,
name='inception3b', use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='3pool')(x)
# inception4a
x = inception_block_v1(x, (192, (96, 208), (16, 48), 64),
weight_decay=weight_decay,
name='inception4a', use_bn=use_bn)
# inception4b
x = inception_block_v1(x, (160, (112, 224), (24, 64), 64),
weight_decay=weight_decay,
name='inception4b', use_bn=True)
# inception4c
x = inception_block_v1(x, (128, (128, 256), (24, 64), 64),
weight_decay=weight_decay,
name='inception4c', use_bn=use_bn)
# inception4d
x = inception_block_v1(x, (112, (144, 288), (32, 64), 64),
weight_decay=weight_decay,
name='inception4d', use_bn=use_bn)
# inception4e
x = inception_block_v1(x, (256, (160, 320), (32, 128), 128),
weight_decay=weight_decay,
name='inception4e', use_bn=use_bn)
x = MaxPool2D(pool_size=(3, 3), strides=(2, 2), padding='same', name='4pool')(x)
# inception5a
x = inception_block_v1(x, (256, (160, 320), (32, 128), 128),
weight_decay=weight_decay,
name='inception5a', use_bn=use_bn)
# inception5b
x = inception_block_v1(x, (384, (192, 384), (48, 128), 128),
weight_decay=weight_decay,
name='inception5b', use_bn=use_bn)
# average pool
x = AveragePooling2D(pool_size=(8, 8), strides=(1, 1), padding='valid', name='avg8x8')(x)
# x = Dropout(0.4)(x)
x = Flatten(name='flatten')(x)
x = Dense(classes, activation='softmax', name='predictions')(x)
model = Model(input, x, name='inception_v1')
return model
model = InceptionV1ForCIFAR10()
model.summary()
Model: "inception_v1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 32, 32, 3)] 0 []
2a-conv (Conv2D) (None, 32, 32, 64) 192 ['input_1[0][0]']
2a-bn (BatchNormalization) (None, 32, 32, 64) 192 ['2a-conv[0][0]']
2a-relu (Activation) (None, 32, 32, 64) 0 ['2a-bn[0][0]']
2b-conv (Conv2D) (None, 32, 32, 192) 110592 ['2a-relu[0][0]']
2b-bn (BatchNormalization) (None, 32, 32, 192) 576 ['2b-conv[0][0]']
2b-relu (Activation) (None, 32, 32, 192) 0 ['2b-bn[0][0]']
inception3a-br1-1x1-conv (Conv (None, 32, 32, 96) 18432 ['2b-relu[0][0]']
2D)
inception3a-br2-1x1-conv (Conv (None, 32, 32, 16) 3072 ['2b-relu[0][0]']
2D)
inception3a-br1-1x1-bn (BatchN (None, 32, 32, 96) 288 ['inception3a-br1-1x1-conv[0][0]'
ormalization) ]
inception3a-br2-1x1-bn (BatchN (None, 32, 32, 16) 48 ['inception3a-br2-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-1x1-relu (Acti (None, 32, 32, 96) 0 ['inception3a-br1-1x1-bn[0][0]']
vation)
inception3a-br2-1x1-relu (Acti (None, 32, 32, 16) 0 ['inception3a-br2-1x1-bn[0][0]']
vation)
inception3a-br3-pool (MaxPooli (None, 32, 32, 192) 0 ['2b-relu[0][0]']
ng2D)
inception3a-br0-1x1-conv (Conv (None, 32, 32, 64) 12288 ['2b-relu[0][0]']
2D)
inception3a-br1-3x3-conv (Conv (None, 32, 32, 128) 110592 ['inception3a-br1-1x1-relu[0][0]'
2D) ]
inception3a-br2-5x5-conv (Conv (None, 32, 32, 32) 12800 ['inception3a-br2-1x1-relu[0][0]'
2D) ]
inception3a-br3-1x1-conv (Conv (None, 32, 32, 32) 6144 ['inception3a-br3-pool[0][0]']
2D)
inception3a-br0-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3a-br0-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-3x3-bn (BatchN (None, 32, 32, 128) 384 ['inception3a-br1-3x3-conv[0][0]'
ormalization) ]
inception3a-br2-5x5-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br2-5x5-conv[0][0]'
ormalization) ]
inception3a-br3-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br3-1x1-conv[0][0]'
ormalization) ]
inception3a-br0-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3a-br0-1x1-bn[0][0]']
vation)
inception3a-br1-3x3-relu (Acti (None, 32, 32, 128) 0 ['inception3a-br1-3x3-bn[0][0]']
vation)
inception3a-br2-5x5-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br2-5x5-bn[0][0]']
vation)
inception3a-br3-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br3-1x1-bn[0][0]']
vation)
inception3a (Concatenate) (None, 32, 32, 256) 0 ['inception3a-br0-1x1-relu[0][0]'
, 'inception3a-br1-3x3-relu[0][0]
',
'inception3a-br2-5x5-relu[0][0]'
, 'inception3a-br3-1x1-relu[0][0]
']
inception3b-br1-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br2-1x1-conv (Conv (None, 32, 32, 32) 8192 ['inception3a[0][0]']
2D)
inception3b-br1-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br1-1x1-conv[0][0]'
ormalization) ]
inception3b-br2-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3b-br2-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br1-1x1-bn[0][0]']
vation)
inception3b-br2-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3b-br2-1x1-bn[0][0]']
vation)
inception3b-br3-pool (MaxPooli (None, 32, 32, 256) 0 ['inception3a[0][0]']
ng2D)
inception3b-br0-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br1-3x3-conv (Conv (None, 32, 32, 192) 221184 ['inception3b-br1-1x1-relu[0][0]'
2D) ]
inception3b-br2-5x5-conv (Conv (None, 32, 32, 96) 76800 ['inception3b-br2-1x1-relu[0][0]'
2D) ]
inception3b-br3-1x1-conv (Conv (None, 32, 32, 64) 16384 ['inception3b-br3-pool[0][0]']
2D)
inception3b-br0-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br0-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-3x3-bn (BatchN (None, 32, 32, 192) 576 ['inception3b-br1-3x3-conv[0][0]'
ormalization) ]
inception3b-br2-5x5-bn (BatchN (None, 32, 32, 96) 288 ['inception3b-br2-5x5-conv[0][0]'
ormalization) ]
inception3b-br3-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3b-br3-1x1-conv[0][0]'
ormalization) ]
inception3b-br0-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br0-1x1-bn[0][0]']
vation)
inception3b-br1-3x3-relu (Acti (None, 32, 32, 192) 0 ['inception3b-br1-3x3-bn[0][0]']
vation)
inception3b-br2-5x5-relu (Acti (None, 32, 32, 96) 0 ['inception3b-br2-5x5-bn[0][0]']
vation)
inception3b-br3-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3b-br3-1x1-bn[0][0]']
vation)
inception3b (Concatenate) (None, 32, 32, 480) 0 ['inception3b-br0-1x1-relu[0][0]'
, 'inception3b-br1-3x3-relu[0][0]
',
'inception3b-br2-5x5-relu[0][0]'
, 'inception3b-br3-1x1-relu[0][0]
']
3pool (MaxPooling2D) (None, 16, 16, 480) 0 ['inception3b[0][0]']
inception4a-br1-1x1-conv (Conv (None, 16, 16, 96) 46080 ['3pool[0][0]']
2D)
inception4a-br2-1x1-conv (Conv (None, 16, 16, 16) 7680 ['3pool[0][0]']
2D)
inception4a-br1-1x1-bn (BatchN (None, 16, 16, 96) 288 ['inception4a-br1-1x1-conv[0][0]'
ormalization) ]
inception4a-br2-1x1-bn (BatchN (None, 16, 16, 16) 48 ['inception4a-br2-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-1x1-relu (Acti (None, 16, 16, 96) 0 ['inception4a-br1-1x1-bn[0][0]']
vation)
inception4a-br2-1x1-relu (Acti (None, 16, 16, 16) 0 ['inception4a-br2-1x1-bn[0][0]']
vation)
inception4a-br3-pool (MaxPooli (None, 16, 16, 480) 0 ['3pool[0][0]']
ng2D)
inception4a-br0-1x1-conv (Conv (None, 16, 16, 192) 92160 ['3pool[0][0]']
2D)
inception4a-br1-3x3-conv (Conv (None, 16, 16, 208) 179712 ['inception4a-br1-1x1-relu[0][0]'
2D) ]
inception4a-br2-5x5-conv (Conv (None, 16, 16, 48) 19200 ['inception4a-br2-1x1-relu[0][0]'
2D) ]
inception4a-br3-1x1-conv (Conv (None, 16, 16, 64) 30720 ['inception4a-br3-pool[0][0]']
2D)
inception4a-br0-1x1-bn (BatchN (None, 16, 16, 192) 576 ['inception4a-br0-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-3x3-bn (BatchN (None, 16, 16, 208) 624 ['inception4a-br1-3x3-conv[0][0]'
ormalization) ]
inception4a-br2-5x5-bn (BatchN (None, 16, 16, 48) 144 ['inception4a-br2-5x5-conv[0][0]'
ormalization) ]
inception4a-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4a-br3-1x1-conv[0][0]'
ormalization) ]
inception4a-br0-1x1-relu (Acti (None, 16, 16, 192) 0 ['inception4a-br0-1x1-bn[0][0]']
vation)
inception4a-br1-3x3-relu (Acti (None, 16, 16, 208) 0 ['inception4a-br1-3x3-bn[0][0]']
vation)
inception4a-br2-5x5-relu (Acti (None, 16, 16, 48) 0 ['inception4a-br2-5x5-bn[0][0]']
vation)
inception4a-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4a-br3-1x1-bn[0][0]']
vation)
inception4a (Concatenate) (None, 16, 16, 512) 0 ['inception4a-br0-1x1-relu[0][0]'
, 'inception4a-br1-3x3-relu[0][0]
',
'inception4a-br2-5x5-relu[0][0]'
, 'inception4a-br3-1x1-relu[0][0]
']
inception4b-br1-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4a[0][0]']
2D)
inception4b-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4a[0][0]']
2D)
inception4b-br1-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4b-br1-1x1-conv[0][0]'
ormalization) ]
inception4b-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4b-br2-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4b-br1-1x1-bn[0][0]']
vation)
inception4b-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4b-br2-1x1-bn[0][0]']
vation)
inception4b-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4a[0][0]']
ng2D)
inception4b-br0-1x1-conv (Conv (None, 16, 16, 160) 81920 ['inception4a[0][0]']
2D)
inception4b-br1-3x3-conv (Conv (None, 16, 16, 224) 225792 ['inception4b-br1-1x1-relu[0][0]'
2D) ]
inception4b-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4b-br2-1x1-relu[0][0]'
2D) ]
inception4b-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4b-br3-pool[0][0]']
2D)
inception4b-br0-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4b-br0-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-3x3-bn (BatchN (None, 16, 16, 224) 672 ['inception4b-br1-3x3-conv[0][0]'
ormalization) ]
inception4b-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br2-5x5-conv[0][0]'
ormalization) ]
inception4b-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br3-1x1-conv[0][0]'
ormalization) ]
inception4b-br0-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4b-br0-1x1-bn[0][0]']
vation)
inception4b-br1-3x3-relu (Acti (None, 16, 16, 224) 0 ['inception4b-br1-3x3-bn[0][0]']
vation)
inception4b-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br2-5x5-bn[0][0]']
vation)
inception4b-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br3-1x1-bn[0][0]']
vation)
inception4b (Concatenate) (None, 16, 16, 512) 0 ['inception4b-br0-1x1-relu[0][0]'
, 'inception4b-br1-3x3-relu[0][0]
',
'inception4b-br2-5x5-relu[0][0]'
, 'inception4b-br3-1x1-relu[0][0]
']
inception4c-br1-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4b[0][0]']
2D)
inception4c-br1-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br1-1x1-conv[0][0]'
ormalization) ]
inception4c-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4c-br2-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br1-1x1-bn[0][0]']
vation)
inception4c-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4c-br2-1x1-bn[0][0]']
vation)
inception4c-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4b[0][0]']
ng2D)
inception4c-br0-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br1-3x3-conv (Conv (None, 16, 16, 256) 294912 ['inception4c-br1-1x1-relu[0][0]'
2D) ]
inception4c-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4c-br2-1x1-relu[0][0]'
2D) ]
inception4c-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4c-br3-pool[0][0]']
2D)
inception4c-br0-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br0-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-3x3-bn (BatchN (None, 16, 16, 256) 768 ['inception4c-br1-3x3-conv[0][0]'
ormalization) ]
inception4c-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br2-5x5-conv[0][0]'
ormalization) ]
inception4c-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br3-1x1-conv[0][0]'
ormalization) ]
inception4c-br0-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br0-1x1-bn[0][0]']
vation)
inception4c-br1-3x3-relu (Acti (None, 16, 16, 256) 0 ['inception4c-br1-3x3-bn[0][0]']
vation)
inception4c-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br2-5x5-bn[0][0]']
vation)
inception4c-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br3-1x1-bn[0][0]']
vation)
inception4c (Concatenate) (None, 16, 16, 512) 0 ['inception4c-br0-1x1-relu[0][0]'
, 'inception4c-br1-3x3-relu[0][0]
',
'inception4c-br2-5x5-relu[0][0]'
, 'inception4c-br3-1x1-relu[0][0]
']
inception4d-br1-1x1-conv (Conv (None, 16, 16, 144) 73728 ['inception4c[0][0]']
2D)
inception4d-br2-1x1-conv (Conv (None, 16, 16, 32) 16384 ['inception4c[0][0]']
2D)
inception4d-br1-1x1-bn (BatchN (None, 16, 16, 144) 432 ['inception4d-br1-1x1-conv[0][0]'
ormalization) ]
inception4d-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4d-br2-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-1x1-relu (Acti (None, 16, 16, 144) 0 ['inception4d-br1-1x1-bn[0][0]']
vation)
inception4d-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4d-br2-1x1-bn[0][0]']
vation)
inception4d-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4c[0][0]']
ng2D)
inception4d-br0-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4c[0][0]']
2D)
inception4d-br1-3x3-conv (Conv (None, 16, 16, 288) 373248 ['inception4d-br1-1x1-relu[0][0]'
2D) ]
inception4d-br2-5x5-conv (Conv (None, 16, 16, 64) 51200 ['inception4d-br2-1x1-relu[0][0]'
2D) ]
inception4d-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4d-br3-pool[0][0]']
2D)
inception4d-br0-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4d-br0-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-3x3-bn (BatchN (None, 16, 16, 288) 864 ['inception4d-br1-3x3-conv[0][0]'
ormalization) ]
inception4d-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br2-5x5-conv[0][0]'
ormalization) ]
inception4d-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br3-1x1-conv[0][0]'
ormalization) ]
inception4d-br0-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4d-br0-1x1-bn[0][0]']
vation)
inception4d-br1-3x3-relu (Acti (None, 16, 16, 288) 0 ['inception4d-br1-3x3-bn[0][0]']
vation)
inception4d-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br2-5x5-bn[0][0]']
vation)
inception4d-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br3-1x1-bn[0][0]']
vation)
inception4d (Concatenate) (None, 16, 16, 528) 0 ['inception4d-br0-1x1-relu[0][0]'
, 'inception4d-br1-3x3-relu[0][0]
',
'inception4d-br2-5x5-relu[0][0]'
, 'inception4d-br3-1x1-relu[0][0]
']
inception4e-br1-1x1-conv (Conv (None, 16, 16, 160) 84480 ['inception4d[0][0]']
2D)
inception4e-br2-1x1-conv (Conv (None, 16, 16, 32) 16896 ['inception4d[0][0]']
2D)
inception4e-br1-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4e-br1-1x1-conv[0][0]'
ormalization) ]
inception4e-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4e-br2-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4e-br1-1x1-bn[0][0]']
vation)
inception4e-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4e-br2-1x1-bn[0][0]']
vation)
inception4e-br3-pool (MaxPooli (None, 16, 16, 528) 0 ['inception4d[0][0]']
ng2D)
inception4e-br0-1x1-conv (Conv (None, 16, 16, 256) 135168 ['inception4d[0][0]']
2D)
inception4e-br1-3x3-conv (Conv (None, 16, 16, 320) 460800 ['inception4e-br1-1x1-relu[0][0]'
2D) ]
inception4e-br2-5x5-conv (Conv (None, 16, 16, 128) 102400 ['inception4e-br2-1x1-relu[0][0]'
2D) ]
inception4e-br3-1x1-conv (Conv (None, 16, 16, 128) 67584 ['inception4e-br3-pool[0][0]']
2D)
inception4e-br0-1x1-bn (BatchN (None, 16, 16, 256) 768 ['inception4e-br0-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-3x3-bn (BatchN (None, 16, 16, 320) 960 ['inception4e-br1-3x3-conv[0][0]'
ormalization) ]
inception4e-br2-5x5-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br2-5x5-conv[0][0]'
ormalization) ]
inception4e-br3-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br3-1x1-conv[0][0]'
ormalization) ]
inception4e-br0-1x1-relu (Acti (None, 16, 16, 256) 0 ['inception4e-br0-1x1-bn[0][0]']
vation)
inception4e-br1-3x3-relu (Acti (None, 16, 16, 320) 0 ['inception4e-br1-3x3-bn[0][0]']
vation)
inception4e-br2-5x5-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br2-5x5-bn[0][0]']
vation)
inception4e-br3-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br3-1x1-bn[0][0]']
vation)
inception4e (Concatenate) (None, 16, 16, 832) 0 ['inception4e-br0-1x1-relu[0][0]'
, 'inception4e-br1-3x3-relu[0][0]
',
'inception4e-br2-5x5-relu[0][0]'
, 'inception4e-br3-1x1-relu[0][0]
']
4pool (MaxPooling2D) (None, 8, 8, 832) 0 ['inception4e[0][0]']
inception5a-br1-1x1-conv (Conv (None, 8, 8, 160) 133120 ['4pool[0][0]']
2D)
inception5a-br2-1x1-conv (Conv (None, 8, 8, 32) 26624 ['4pool[0][0]']
2D)
inception5a-br1-1x1-bn (BatchN (None, 8, 8, 160) 480 ['inception5a-br1-1x1-conv[0][0]'
ormalization) ]
inception5a-br2-1x1-bn (BatchN (None, 8, 8, 32) 96 ['inception5a-br2-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-1x1-relu (Acti (None, 8, 8, 160) 0 ['inception5a-br1-1x1-bn[0][0]']
vation)
inception5a-br2-1x1-relu (Acti (None, 8, 8, 32) 0 ['inception5a-br2-1x1-bn[0][0]']
vation)
inception5a-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['4pool[0][0]']
ng2D)
inception5a-br0-1x1-conv (Conv (None, 8, 8, 256) 212992 ['4pool[0][0]']
2D)
inception5a-br1-3x3-conv (Conv (None, 8, 8, 320) 460800 ['inception5a-br1-1x1-relu[0][0]'
2D) ]
inception5a-br2-5x5-conv (Conv (None, 8, 8, 128) 102400 ['inception5a-br2-1x1-relu[0][0]'
2D) ]
inception5a-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5a-br3-pool[0][0]']
2D)
inception5a-br0-1x1-bn (BatchN (None, 8, 8, 256) 768 ['inception5a-br0-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-3x3-bn (BatchN (None, 8, 8, 320) 960 ['inception5a-br1-3x3-conv[0][0]'
ormalization) ]
inception5a-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br2-5x5-conv[0][0]'
ormalization) ]
inception5a-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br3-1x1-conv[0][0]'
ormalization) ]
inception5a-br0-1x1-relu (Acti (None, 8, 8, 256) 0 ['inception5a-br0-1x1-bn[0][0]']
vation)
inception5a-br1-3x3-relu (Acti (None, 8, 8, 320) 0 ['inception5a-br1-3x3-bn[0][0]']
vation)
inception5a-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br2-5x5-bn[0][0]']
vation)
inception5a-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br3-1x1-bn[0][0]']
vation)
inception5a (Concatenate) (None, 8, 8, 832) 0 ['inception5a-br0-1x1-relu[0][0]'
, 'inception5a-br1-3x3-relu[0][0]
',
'inception5a-br2-5x5-relu[0][0]'
, 'inception5a-br3-1x1-relu[0][0]
']
inception5b-br1-1x1-conv (Conv (None, 8, 8, 192) 159744 ['inception5a[0][0]']
2D)
inception5b-br2-1x1-conv (Conv (None, 8, 8, 48) 39936 ['inception5a[0][0]']
2D)
inception5b-br1-1x1-bn (BatchN (None, 8, 8, 192) 576 ['inception5b-br1-1x1-conv[0][0]'
ormalization) ]
inception5b-br2-1x1-bn (BatchN (None, 8, 8, 48) 144 ['inception5b-br2-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-1x1-relu (Acti (None, 8, 8, 192) 0 ['inception5b-br1-1x1-bn[0][0]']
vation)
inception5b-br2-1x1-relu (Acti (None, 8, 8, 48) 0 ['inception5b-br2-1x1-bn[0][0]']
vation)
inception5b-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['inception5a[0][0]']
ng2D)
inception5b-br0-1x1-conv (Conv (None, 8, 8, 384) 319488 ['inception5a[0][0]']
2D)
inception5b-br1-3x3-conv (Conv (None, 8, 8, 384) 663552 ['inception5b-br1-1x1-relu[0][0]'
2D) ]
inception5b-br2-5x5-conv (Conv (None, 8, 8, 128) 153600 ['inception5b-br2-1x1-relu[0][0]'
2D) ]
inception5b-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5b-br3-pool[0][0]']
2D)
inception5b-br0-1x1-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br0-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-3x3-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br1-3x3-conv[0][0]'
ormalization) ]
inception5b-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br2-5x5-conv[0][0]'
ormalization) ]
inception5b-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br3-1x1-conv[0][0]'
ormalization) ]
inception5b-br0-1x1-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br0-1x1-bn[0][0]']
vation)
inception5b-br1-3x3-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br1-3x3-bn[0][0]']
vation)
inception5b-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br2-5x5-bn[0][0]']
vation)
inception5b-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br3-1x1-bn[0][0]']
vation)
inception5b (Concatenate) (None, 8, 8, 1024) 0 ['inception5b-br0-1x1-relu[0][0]'
, 'inception5b-br1-3x3-relu[0][0]
',
'inception5b-br2-5x5-relu[0][0]'
, 'inception5b-br3-1x1-relu[0][0]
']
avg8x8 (AveragePooling2D) (None, 1, 1, 1024) 0 ['inception5b[0][0]']
flatten (Flatten) (None, 1024) 0 ['avg8x8[0][0]']
predictions (Dense) (None, 10) 10250 ['flatten[0][0]']
==================================================================================================
Total params: 5,984,858
Trainable params: 5,970,426
Non-trainable params: 14,432
__________________________________________________________________________________________________
model_img = output_dir + '/cifar10_%s.png'%(model_name) # 模型结构图保存路径
plot_model(model, to_file=model_img, show_shapes=True) # 模型结构保存为一张图片
print('%s已保存' % model_img)
./output/cifar10_googleNet.png已保存
开始训练模型
首先我们可以设置我们的迭代次数和batch_size
epochs = 20 # 迭代次数
batch_size = 128 # 批大小
这一部分是设置在训练的时候的一些参数
- 首先保存最好的模型,先定义我们的model path
- 设置save_best_only=True,也就是代表只保存一遍
- monitor='val_loss’代表的是监视val_loss,着重观察val_loss,只选取最小的val_loss的模型进行保存,当然这个我们也可以换成val_acc也是可以的
checkpoint = ModelCheckpoint(output_dir + '/best_%s_simple.h5'%model_name, # model filename
monitor='val_loss', # quantity to monitor
verbose=0, # verbosity - 0 or 1
save_best_only= True, # The latest best model will not be overwritten
mode='auto') # The decision to overwrite model is made
# automatically depending on the quantity to monitor
接下来我们就可以定义我们的优化器和损失函数了,keras很简单,并且定义我们需要计算的metrics为准确率即可
adam = adam_v2.Adam(lr = 0.0001)
model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])
最后我们使用内置的fit函数,并且加上我们所需要的超参数,就可以完成我们的训练了。
history = model.fit(x_train,y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_val,y_val),
shuffle=True,
callbacks=[checkpoint])
Epoch 1/20
391/391 [==============================] - 200s 477ms/step - loss: 1.3094 - accuracy: 0.5279 - val_loss: 2.7339 - val_accuracy: 0.2560
Epoch 2/20
391/391 [==============================] - 180s 462ms/step - loss: 0.9067 - accuracy: 0.6792 - val_loss: 0.9504 - val_accuracy: 0.6657
Epoch 3/20
391/391 [==============================] - 179s 458ms/step - loss: 0.7013 - accuracy: 0.7533 - val_loss: 1.0037 - val_accuracy: 0.6628
Epoch 4/20
391/391 [==============================] - 179s 458ms/step - loss: 0.5466 - accuracy: 0.8092 - val_loss: 0.9532 - val_accuracy: 0.6814
Epoch 5/20
391/391 [==============================] - 180s 461ms/step - loss: 0.4244 - accuracy: 0.8540 - val_loss: 0.8690 - val_accuracy: 0.7089
Epoch 6/20
391/391 [==============================] - 180s 461ms/step - loss: 0.3142 - accuracy: 0.8936 - val_loss: 0.7387 - val_accuracy: 0.7597
Epoch 7/20
391/391 [==============================] - 179s 458ms/step - loss: 0.2398 - accuracy: 0.9185 - val_loss: 0.9407 - val_accuracy: 0.7250
Epoch 8/20
391/391 [==============================] - 179s 457ms/step - loss: 0.1662 - accuracy: 0.9448 - val_loss: 1.0208 - val_accuracy: 0.7310
Epoch 9/20
391/391 [==============================] - 179s 458ms/step - loss: 0.1258 - accuracy: 0.9584 - val_loss: 1.0521 - val_accuracy: 0.7229
Epoch 10/20
391/391 [==============================] - 179s 457ms/step - loss: 0.0990 - accuracy: 0.9678 - val_loss: 1.0299 - val_accuracy: 0.7357
Epoch 11/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0852 - accuracy: 0.9716 - val_loss: 0.9104 - val_accuracy: 0.7651
Epoch 12/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0728 - accuracy: 0.9758 - val_loss: 0.9636 - val_accuracy: 0.7624
Epoch 13/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0707 - accuracy: 0.9763 - val_loss: 1.8039 - val_accuracy: 0.6503
Epoch 14/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0636 - accuracy: 0.9790 - val_loss: 0.9348 - val_accuracy: 0.7708
Epoch 15/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0601 - accuracy: 0.9803 - val_loss: 1.5003 - val_accuracy: 0.7187
Epoch 16/20
391/391 [==============================] - 179s 459ms/step - loss: 0.0519 - accuracy: 0.9830 - val_loss: 0.9691 - val_accuracy: 0.7796
Epoch 17/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0478 - accuracy: 0.9842 - val_loss: 1.1247 - val_accuracy: 0.7543
Epoch 18/20
391/391 [==============================] - 179s 458ms/step - loss: 0.0582 - accuracy: 0.9802 - val_loss: 1.2302 - val_accuracy: 0.7420
Epoch 19/20
391/391 [==============================] - 179s 457ms/step - loss: 0.0445 - accuracy: 0.9851 - val_loss: 1.6843 - val_accuracy: 0.6992
Epoch 20/20
391/391 [==============================] - 179s 459ms/step - loss: 0.0434 - accuracy: 0.9847 - val_loss: 1.2670 - val_accuracy: 0.7417
可视化准确率、损失函数
def plot_model_history(model_history):
fig, axs = plt.subplots(1,2,figsize=(15,5))
# summarize history for accuracy
axs[0].plot(range(1,len(model_history.history['accuracy'])+1),model_history.history['accuracy'])
axs[0].plot(range(1,len(model_history.history['val_accuracy'])+1),model_history.history['val_accuracy'])
axs[0].set_title('Model Accuracy')
axs[0].set_ylabel('Accuracy')
axs[0].set_xlabel('Epoch')
axs[0].set_xticks(np.arange(1,len(model_history.history['accuracy'])+1),len(model_history.history['accuracy'])/10)
axs[0].legend(['train', 'val'], loc='best')
# summarize history for loss
axs[1].plot(range(1,len(model_history.history['loss'])+1),model_history.history['loss'])
axs[1].plot(range(1,len(model_history.history['val_loss'])+1),model_history.history['val_loss'])
axs[1].set_title('Model Loss')
axs[1].set_ylabel('Loss')
axs[1].set_xlabel('Epoch')
axs[1].set_xticks(np.arange(1,len(model_history.history['loss'])+1),len(model_history.history['loss'])/10)
axs[1].legend(['train', 'val'], loc='best')
plt.show()
plot_model_history(history)
保存模型
model_path = output_dir + '/keras_cifar10_%s_model.h5'%model_name
model.save(model_path)
print('%s已保存' % model_path)
./output/keras_cifar10_googleNet_model.h5已保存
预测结果
x_test,y_test = x_val,y_val
# 取验证集里面的图片拿来预测看看
name = {
0: 'airplane', 1: 'automobile', 2: 'bird', 3: 'cat', 4: 'deer',
5: 'dog', 6: 'frog', 7: 'horse', 8: 'ship', 9: 'truck'}
n = 20 # 取多少张图片
x_test = x_val[:n]
y_test = y_val[:n]
# 预测
y_predict = model.predict(x_test, batch_size=n)
# 绘制预测结果
plt.figure(figsize=(18, 3)) # 指定画布大小
for i in range(n):
plt.subplot(2, 10, i + 1)
plt.axis('off') # 取消x,y轴坐标
plt.imshow(x_test[i]) # 显示图片
if y_test[i].argmax() == y_predict[i].argmax():
# 预测正确,用绿色标题
plt.title('%s,%s' % (name[y_test[i].argmax()], name[y_predict[i].argmax()]), color='green')
else:
# 预测错误,用红色标题
plt.title('%s,%s' % (name[y_test[i].argmax()], name[y_predict[i].argmax()]), color='red')
predict_img = output_dir + '/predict_%s.png'%(model_name)
print('%s已保存' % predict_img)
plt.savefig(predict_img) # 保存预测图片
plt.show() # 显示画布
./output/predict_googleNet.png已保存
res = model.evaluate(x_test,y_test)
print('{:2f}%'.format(res[1]*100))
1/1 [==============================] - 0s 36ms/step - loss: 1.2039 - accuracy: 0.7000
69.999999%
res = model.evaluate(x_val,y_val)
print('{:2f}%'.format(res[1]*100))
313/313 [==============================] - 12s 35ms/step - loss: 1.2670 - accuracy: 0.7417
74.169999%
数据增强
除了用原图片进行训练之外,我们还有一种方式可以增加准确性,也就是数据增强。下面来介绍一下数据增强
**数据增强(Data Augmentation)**是一种通过让有限的数据产生更多的等价数据来人工扩展训练数据集的技术。它是克服训练数据不足的有效手段,目前在深度学习的各个领域中应用广泛。但是由于生成的数据与真实数据之间的差异,也不可避免地带来了噪声问题。深度神经网络在许多任务中表现良好,但这些网络通常需要大量数据才能避免过度拟合。遗憾的是,许多场景无法获得大量数据,数据增强技术的存在是为了解决这个问题,这是针对有限数据问题的解决方案。数据增强一套技术,可提高训练数据集的大小和质量,以便您可以使用它们来构建更好的深度学习模型。
计算视觉领域的数据增强
计算视觉领域的数据增强算法大致可以分为两类:第一类是基于基本图像处理技术的数据增强,第二个类别是基于深度学习的数据增强算法。
下面先介绍基于基本图像处理技术的数据增强方法:
- 几何变换(Geometric Transformations):由于训练集与测试集合中可能存在潜在的位置偏差,使得模型在测试集中很难达到训练集中的效果,几何变换可以有效地克服训练数据中存在的位置偏差,而且易于实现,许多图像处理库都包含这个功能。
- 颜色变换(Color Space):图片在输入计算机之前,通常会被编码为张量(高度×宽度×颜色通道),所以可以在色彩通道空间进行数据增强,比如将某种颜色通道关闭,或者改变亮度值。
- 旋转 | 反射变换(Rotation/Reflection):选择一个角度,左右旋转图像,可以改变图像内容朝向。关于旋转角度需要慎重考虑,角度太大或者太小都不合适,适宜的角度是1度 到 20度。
- 噪声注入(Noise Injection):从高斯分布中采样出的随机值矩阵加入到图像的RGB像素中,通过向图像添加噪点可以帮助CNN学习更强大的功能。
- 内核过滤器(Kernel Filters):内核滤镜是在图像处理中一种非常流行的技术,比如锐化和模糊。将特定功能的内核滤镜与图像进行卷积操作,就可以得到增强后的数据。直观上,数据增强生成的图像可能会使得模型面对这种类型的图像具有更高的鲁棒性。
- 混合图像(Mix):通过平均图像像素值将图像混合在一起是一种非常违反直觉的数据增强方法。对于人来说,混合图像生成的数据似乎没有意义。虽然这种方法缺乏可解释性,但是作为一种简单有效的数据增强算法,有一系列的工作进行相关的研究。Inoue在图像每个像素点混合像素值来混合图像,Summers和Dinneen又尝试以非线性的方法来混合图像,Takahashi和Matsubara通过随机图像裁剪和拼接来混合图像,以及后来的mixup方法均取得了不错的成果。
- 随机擦除(Random Erasing):随机擦除是Zhong等人开发的数据增强技术。他们受到Dropout机制的启发,随机选取图片中的一部分,将这部分图片删除,这项技术可以提高模型在图片被部分遮挡的情况下性能,除此之外还可以确保网络关注整个图像,而不只是其中的一部分。
- 缩放变换(Zoom):图像按照一定的比例进行放大和缩小并不改变图像中的内容,可以增加模型的泛化性能。
- 移动(Translation):向左,向右,向上或向下移动图像可以避免数据中的位置偏差,比如在人脸识别数据集合中,如果所有图像都居中,使用这种数据增强方法可以避免可能出现的位置偏差导致的错误。
- 翻转变换(Flipping):通常是关于水平或者竖直的轴进行图像翻转操作,这种扩充是最容易实现的扩充,并且已经证明对ImageNet数据集有效。
- 裁剪(Cropping):如果输入数据集合的大小是变化的,裁剪可以作为数据预处理的一个手段,通过裁剪图像的中央色块,可以得到新的数据。在实际使用过程之中,这些数据增强算法不是只使用一种,而是使用一套数据增强策略,在AutoAugment这篇文章中,作者尝试让模型自动选择数据增强策略。
第二个类别是基于深度学习的数据增强算法:
- 特征空间增强(Feature Space Augmentation):神经网络可以将图像这种高维向量映射为低维向量,之前讨论的所有图像数据增强方法都应用于输入空间中的图像。现在可以在特征空间进行数据增强操作,例如:SMOTE算法,它是一种流行的增强方法,通过将k个最近的邻居合并以形成新实例来缓解类不平衡问题。
- 对抗生成(Adversarial Training):对抗攻击表明,图像表示的健壮性远不及预期的健壮性,Moosavi-Dezfooli等人充分证明了这一点。对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。
- 基于GAN的数据增强(GAN-based Data Augmentation):使用 GAN 生成模型来生成更多的数据,可用作解决类别不平衡问题的过采样技术。
- 神经风格转换(Neural Style Transfer):通过神经网络风格迁移来生成不同风格的数据,防止模型过拟合。
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import LearningRateScheduler
# fit data with data augmentation or not
data_augmentation = True
# def lr_scheduler(epoch):
# return lr * (0.1 ** (epoch // 50))
# reduce_lr = LearningRateScheduler(lr_scheduler)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.93,
patience=1, min_lr=1e-6, verbose=1)
checkpoint = ModelCheckpoint(output_dir + '/best_%s_data_augmentation.h5'%model_name, # model filename
monitor='val_loss', # quantity to monitor
verbose=0, # verbosity - 0 or 1
save_best_only= True, # The latest best model will not be overwritten
mode='auto') # The decision to overwrite model is made
# automatically depending on the quantity to monitor
batch_size = 128
epochs = 30
from keras.optimizers import gradient_descent_v2
model = InceptionV1ForCIFAR10()
sgd = gradient_descent_v2.SGD(lr = 0.1, momentum=0.9, nesterov=True)
model.compile(loss = 'categorical_crossentropy', optimizer = sgd, metrics = ['accuracy'])
model.summary()
Model: "inception_v1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_2 (InputLayer) [(None, 32, 32, 3)] 0 []
2a-conv (Conv2D) (None, 32, 32, 64) 192 ['input_2[0][0]']
2a-bn (BatchNormalization) (None, 32, 32, 64) 192 ['2a-conv[0][0]']
2a-relu (Activation) (None, 32, 32, 64) 0 ['2a-bn[0][0]']
2b-conv (Conv2D) (None, 32, 32, 192) 110592 ['2a-relu[0][0]']
2b-bn (BatchNormalization) (None, 32, 32, 192) 576 ['2b-conv[0][0]']
2b-relu (Activation) (None, 32, 32, 192) 0 ['2b-bn[0][0]']
inception3a-br1-1x1-conv (Conv (None, 32, 32, 96) 18432 ['2b-relu[0][0]']
2D)
inception3a-br2-1x1-conv (Conv (None, 32, 32, 16) 3072 ['2b-relu[0][0]']
2D)
inception3a-br1-1x1-bn (BatchN (None, 32, 32, 96) 288 ['inception3a-br1-1x1-conv[0][0]'
ormalization) ]
inception3a-br2-1x1-bn (BatchN (None, 32, 32, 16) 48 ['inception3a-br2-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-1x1-relu (Acti (None, 32, 32, 96) 0 ['inception3a-br1-1x1-bn[0][0]']
vation)
inception3a-br2-1x1-relu (Acti (None, 32, 32, 16) 0 ['inception3a-br2-1x1-bn[0][0]']
vation)
inception3a-br3-pool (MaxPooli (None, 32, 32, 192) 0 ['2b-relu[0][0]']
ng2D)
inception3a-br0-1x1-conv (Conv (None, 32, 32, 64) 12288 ['2b-relu[0][0]']
2D)
inception3a-br1-3x3-conv (Conv (None, 32, 32, 128) 110592 ['inception3a-br1-1x1-relu[0][0]'
2D) ]
inception3a-br2-5x5-conv (Conv (None, 32, 32, 32) 12800 ['inception3a-br2-1x1-relu[0][0]'
2D) ]
inception3a-br3-1x1-conv (Conv (None, 32, 32, 32) 6144 ['inception3a-br3-pool[0][0]']
2D)
inception3a-br0-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3a-br0-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-3x3-bn (BatchN (None, 32, 32, 128) 384 ['inception3a-br1-3x3-conv[0][0]'
ormalization) ]
inception3a-br2-5x5-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br2-5x5-conv[0][0]'
ormalization) ]
inception3a-br3-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br3-1x1-conv[0][0]'
ormalization) ]
inception3a-br0-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3a-br0-1x1-bn[0][0]']
vation)
inception3a-br1-3x3-relu (Acti (None, 32, 32, 128) 0 ['inception3a-br1-3x3-bn[0][0]']
vation)
inception3a-br2-5x5-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br2-5x5-bn[0][0]']
vation)
inception3a-br3-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br3-1x1-bn[0][0]']
vation)
inception3a (Concatenate) (None, 32, 32, 256) 0 ['inception3a-br0-1x1-relu[0][0]'
, 'inception3a-br1-3x3-relu[0][0]
',
'inception3a-br2-5x5-relu[0][0]'
, 'inception3a-br3-1x1-relu[0][0]
']
inception3b-br1-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br2-1x1-conv (Conv (None, 32, 32, 32) 8192 ['inception3a[0][0]']
2D)
inception3b-br1-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br1-1x1-conv[0][0]'
ormalization) ]
inception3b-br2-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3b-br2-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br1-1x1-bn[0][0]']
vation)
inception3b-br2-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3b-br2-1x1-bn[0][0]']
vation)
inception3b-br3-pool (MaxPooli (None, 32, 32, 256) 0 ['inception3a[0][0]']
ng2D)
inception3b-br0-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br1-3x3-conv (Conv (None, 32, 32, 192) 221184 ['inception3b-br1-1x1-relu[0][0]'
2D) ]
inception3b-br2-5x5-conv (Conv (None, 32, 32, 96) 76800 ['inception3b-br2-1x1-relu[0][0]'
2D) ]
inception3b-br3-1x1-conv (Conv (None, 32, 32, 64) 16384 ['inception3b-br3-pool[0][0]']
2D)
inception3b-br0-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br0-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-3x3-bn (BatchN (None, 32, 32, 192) 576 ['inception3b-br1-3x3-conv[0][0]'
ormalization) ]
inception3b-br2-5x5-bn (BatchN (None, 32, 32, 96) 288 ['inception3b-br2-5x5-conv[0][0]'
ormalization) ]
inception3b-br3-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3b-br3-1x1-conv[0][0]'
ormalization) ]
inception3b-br0-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br0-1x1-bn[0][0]']
vation)
inception3b-br1-3x3-relu (Acti (None, 32, 32, 192) 0 ['inception3b-br1-3x3-bn[0][0]']
vation)
inception3b-br2-5x5-relu (Acti (None, 32, 32, 96) 0 ['inception3b-br2-5x5-bn[0][0]']
vation)
inception3b-br3-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3b-br3-1x1-bn[0][0]']
vation)
inception3b (Concatenate) (None, 32, 32, 480) 0 ['inception3b-br0-1x1-relu[0][0]'
, 'inception3b-br1-3x3-relu[0][0]
',
'inception3b-br2-5x5-relu[0][0]'
, 'inception3b-br3-1x1-relu[0][0]
']
3pool (MaxPooling2D) (None, 16, 16, 480) 0 ['inception3b[0][0]']
inception4a-br1-1x1-conv (Conv (None, 16, 16, 96) 46080 ['3pool[0][0]']
2D)
inception4a-br2-1x1-conv (Conv (None, 16, 16, 16) 7680 ['3pool[0][0]']
2D)
inception4a-br1-1x1-bn (BatchN (None, 16, 16, 96) 288 ['inception4a-br1-1x1-conv[0][0]'
ormalization) ]
inception4a-br2-1x1-bn (BatchN (None, 16, 16, 16) 48 ['inception4a-br2-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-1x1-relu (Acti (None, 16, 16, 96) 0 ['inception4a-br1-1x1-bn[0][0]']
vation)
inception4a-br2-1x1-relu (Acti (None, 16, 16, 16) 0 ['inception4a-br2-1x1-bn[0][0]']
vation)
inception4a-br3-pool (MaxPooli (None, 16, 16, 480) 0 ['3pool[0][0]']
ng2D)
inception4a-br0-1x1-conv (Conv (None, 16, 16, 192) 92160 ['3pool[0][0]']
2D)
inception4a-br1-3x3-conv (Conv (None, 16, 16, 208) 179712 ['inception4a-br1-1x1-relu[0][0]'
2D) ]
inception4a-br2-5x5-conv (Conv (None, 16, 16, 48) 19200 ['inception4a-br2-1x1-relu[0][0]'
2D) ]
inception4a-br3-1x1-conv (Conv (None, 16, 16, 64) 30720 ['inception4a-br3-pool[0][0]']
2D)
inception4a-br0-1x1-bn (BatchN (None, 16, 16, 192) 576 ['inception4a-br0-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-3x3-bn (BatchN (None, 16, 16, 208) 624 ['inception4a-br1-3x3-conv[0][0]'
ormalization) ]
inception4a-br2-5x5-bn (BatchN (None, 16, 16, 48) 144 ['inception4a-br2-5x5-conv[0][0]'
ormalization) ]
inception4a-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4a-br3-1x1-conv[0][0]'
ormalization) ]
inception4a-br0-1x1-relu (Acti (None, 16, 16, 192) 0 ['inception4a-br0-1x1-bn[0][0]']
vation)
inception4a-br1-3x3-relu (Acti (None, 16, 16, 208) 0 ['inception4a-br1-3x3-bn[0][0]']
vation)
inception4a-br2-5x5-relu (Acti (None, 16, 16, 48) 0 ['inception4a-br2-5x5-bn[0][0]']
vation)
inception4a-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4a-br3-1x1-bn[0][0]']
vation)
inception4a (Concatenate) (None, 16, 16, 512) 0 ['inception4a-br0-1x1-relu[0][0]'
, 'inception4a-br1-3x3-relu[0][0]
',
'inception4a-br2-5x5-relu[0][0]'
, 'inception4a-br3-1x1-relu[0][0]
']
inception4b-br1-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4a[0][0]']
2D)
inception4b-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4a[0][0]']
2D)
inception4b-br1-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4b-br1-1x1-conv[0][0]'
ormalization) ]
inception4b-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4b-br2-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4b-br1-1x1-bn[0][0]']
vation)
inception4b-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4b-br2-1x1-bn[0][0]']
vation)
inception4b-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4a[0][0]']
ng2D)
inception4b-br0-1x1-conv (Conv (None, 16, 16, 160) 81920 ['inception4a[0][0]']
2D)
inception4b-br1-3x3-conv (Conv (None, 16, 16, 224) 225792 ['inception4b-br1-1x1-relu[0][0]'
2D) ]
inception4b-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4b-br2-1x1-relu[0][0]'
2D) ]
inception4b-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4b-br3-pool[0][0]']
2D)
inception4b-br0-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4b-br0-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-3x3-bn (BatchN (None, 16, 16, 224) 672 ['inception4b-br1-3x3-conv[0][0]'
ormalization) ]
inception4b-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br2-5x5-conv[0][0]'
ormalization) ]
inception4b-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br3-1x1-conv[0][0]'
ormalization) ]
inception4b-br0-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4b-br0-1x1-bn[0][0]']
vation)
inception4b-br1-3x3-relu (Acti (None, 16, 16, 224) 0 ['inception4b-br1-3x3-bn[0][0]']
vation)
inception4b-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br2-5x5-bn[0][0]']
vation)
inception4b-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br3-1x1-bn[0][0]']
vation)
inception4b (Concatenate) (None, 16, 16, 512) 0 ['inception4b-br0-1x1-relu[0][0]'
, 'inception4b-br1-3x3-relu[0][0]
',
'inception4b-br2-5x5-relu[0][0]'
, 'inception4b-br3-1x1-relu[0][0]
']
inception4c-br1-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4b[0][0]']
2D)
inception4c-br1-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br1-1x1-conv[0][0]'
ormalization) ]
inception4c-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4c-br2-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br1-1x1-bn[0][0]']
vation)
inception4c-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4c-br2-1x1-bn[0][0]']
vation)
inception4c-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4b[0][0]']
ng2D)
inception4c-br0-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br1-3x3-conv (Conv (None, 16, 16, 256) 294912 ['inception4c-br1-1x1-relu[0][0]'
2D) ]
inception4c-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4c-br2-1x1-relu[0][0]'
2D) ]
inception4c-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4c-br3-pool[0][0]']
2D)
inception4c-br0-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br0-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-3x3-bn (BatchN (None, 16, 16, 256) 768 ['inception4c-br1-3x3-conv[0][0]'
ormalization) ]
inception4c-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br2-5x5-conv[0][0]'
ormalization) ]
inception4c-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br3-1x1-conv[0][0]'
ormalization) ]
inception4c-br0-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br0-1x1-bn[0][0]']
vation)
inception4c-br1-3x3-relu (Acti (None, 16, 16, 256) 0 ['inception4c-br1-3x3-bn[0][0]']
vation)
inception4c-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br2-5x5-bn[0][0]']
vation)
inception4c-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br3-1x1-bn[0][0]']
vation)
inception4c (Concatenate) (None, 16, 16, 512) 0 ['inception4c-br0-1x1-relu[0][0]'
, 'inception4c-br1-3x3-relu[0][0]
',
'inception4c-br2-5x5-relu[0][0]'
, 'inception4c-br3-1x1-relu[0][0]
']
inception4d-br1-1x1-conv (Conv (None, 16, 16, 144) 73728 ['inception4c[0][0]']
2D)
inception4d-br2-1x1-conv (Conv (None, 16, 16, 32) 16384 ['inception4c[0][0]']
2D)
inception4d-br1-1x1-bn (BatchN (None, 16, 16, 144) 432 ['inception4d-br1-1x1-conv[0][0]'
ormalization) ]
inception4d-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4d-br2-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-1x1-relu (Acti (None, 16, 16, 144) 0 ['inception4d-br1-1x1-bn[0][0]']
vation)
inception4d-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4d-br2-1x1-bn[0][0]']
vation)
inception4d-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4c[0][0]']
ng2D)
inception4d-br0-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4c[0][0]']
2D)
inception4d-br1-3x3-conv (Conv (None, 16, 16, 288) 373248 ['inception4d-br1-1x1-relu[0][0]'
2D) ]
inception4d-br2-5x5-conv (Conv (None, 16, 16, 64) 51200 ['inception4d-br2-1x1-relu[0][0]'
2D) ]
inception4d-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4d-br3-pool[0][0]']
2D)
inception4d-br0-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4d-br0-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-3x3-bn (BatchN (None, 16, 16, 288) 864 ['inception4d-br1-3x3-conv[0][0]'
ormalization) ]
inception4d-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br2-5x5-conv[0][0]'
ormalization) ]
inception4d-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br3-1x1-conv[0][0]'
ormalization) ]
inception4d-br0-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4d-br0-1x1-bn[0][0]']
vation)
inception4d-br1-3x3-relu (Acti (None, 16, 16, 288) 0 ['inception4d-br1-3x3-bn[0][0]']
vation)
inception4d-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br2-5x5-bn[0][0]']
vation)
inception4d-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br3-1x1-bn[0][0]']
vation)
inception4d (Concatenate) (None, 16, 16, 528) 0 ['inception4d-br0-1x1-relu[0][0]'
, 'inception4d-br1-3x3-relu[0][0]
',
'inception4d-br2-5x5-relu[0][0]'
, 'inception4d-br3-1x1-relu[0][0]
']
inception4e-br1-1x1-conv (Conv (None, 16, 16, 160) 84480 ['inception4d[0][0]']
2D)
inception4e-br2-1x1-conv (Conv (None, 16, 16, 32) 16896 ['inception4d[0][0]']
2D)
inception4e-br1-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4e-br1-1x1-conv[0][0]'
ormalization) ]
inception4e-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4e-br2-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4e-br1-1x1-bn[0][0]']
vation)
inception4e-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4e-br2-1x1-bn[0][0]']
vation)
inception4e-br3-pool (MaxPooli (None, 16, 16, 528) 0 ['inception4d[0][0]']
ng2D)
inception4e-br0-1x1-conv (Conv (None, 16, 16, 256) 135168 ['inception4d[0][0]']
2D)
inception4e-br1-3x3-conv (Conv (None, 16, 16, 320) 460800 ['inception4e-br1-1x1-relu[0][0]'
2D) ]
inception4e-br2-5x5-conv (Conv (None, 16, 16, 128) 102400 ['inception4e-br2-1x1-relu[0][0]'
2D) ]
inception4e-br3-1x1-conv (Conv (None, 16, 16, 128) 67584 ['inception4e-br3-pool[0][0]']
2D)
inception4e-br0-1x1-bn (BatchN (None, 16, 16, 256) 768 ['inception4e-br0-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-3x3-bn (BatchN (None, 16, 16, 320) 960 ['inception4e-br1-3x3-conv[0][0]'
ormalization) ]
inception4e-br2-5x5-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br2-5x5-conv[0][0]'
ormalization) ]
inception4e-br3-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br3-1x1-conv[0][0]'
ormalization) ]
inception4e-br0-1x1-relu (Acti (None, 16, 16, 256) 0 ['inception4e-br0-1x1-bn[0][0]']
vation)
inception4e-br1-3x3-relu (Acti (None, 16, 16, 320) 0 ['inception4e-br1-3x3-bn[0][0]']
vation)
inception4e-br2-5x5-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br2-5x5-bn[0][0]']
vation)
inception4e-br3-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br3-1x1-bn[0][0]']
vation)
inception4e (Concatenate) (None, 16, 16, 832) 0 ['inception4e-br0-1x1-relu[0][0]'
, 'inception4e-br1-3x3-relu[0][0]
',
'inception4e-br2-5x5-relu[0][0]'
, 'inception4e-br3-1x1-relu[0][0]
']
4pool (MaxPooling2D) (None, 8, 8, 832) 0 ['inception4e[0][0]']
inception5a-br1-1x1-conv (Conv (None, 8, 8, 160) 133120 ['4pool[0][0]']
2D)
inception5a-br2-1x1-conv (Conv (None, 8, 8, 32) 26624 ['4pool[0][0]']
2D)
inception5a-br1-1x1-bn (BatchN (None, 8, 8, 160) 480 ['inception5a-br1-1x1-conv[0][0]'
ormalization) ]
inception5a-br2-1x1-bn (BatchN (None, 8, 8, 32) 96 ['inception5a-br2-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-1x1-relu (Acti (None, 8, 8, 160) 0 ['inception5a-br1-1x1-bn[0][0]']
vation)
inception5a-br2-1x1-relu (Acti (None, 8, 8, 32) 0 ['inception5a-br2-1x1-bn[0][0]']
vation)
inception5a-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['4pool[0][0]']
ng2D)
inception5a-br0-1x1-conv (Conv (None, 8, 8, 256) 212992 ['4pool[0][0]']
2D)
inception5a-br1-3x3-conv (Conv (None, 8, 8, 320) 460800 ['inception5a-br1-1x1-relu[0][0]'
2D) ]
inception5a-br2-5x5-conv (Conv (None, 8, 8, 128) 102400 ['inception5a-br2-1x1-relu[0][0]'
2D) ]
inception5a-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5a-br3-pool[0][0]']
2D)
inception5a-br0-1x1-bn (BatchN (None, 8, 8, 256) 768 ['inception5a-br0-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-3x3-bn (BatchN (None, 8, 8, 320) 960 ['inception5a-br1-3x3-conv[0][0]'
ormalization) ]
inception5a-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br2-5x5-conv[0][0]'
ormalization) ]
inception5a-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br3-1x1-conv[0][0]'
ormalization) ]
inception5a-br0-1x1-relu (Acti (None, 8, 8, 256) 0 ['inception5a-br0-1x1-bn[0][0]']
vation)
inception5a-br1-3x3-relu (Acti (None, 8, 8, 320) 0 ['inception5a-br1-3x3-bn[0][0]']
vation)
inception5a-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br2-5x5-bn[0][0]']
vation)
inception5a-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br3-1x1-bn[0][0]']
vation)
inception5a (Concatenate) (None, 8, 8, 832) 0 ['inception5a-br0-1x1-relu[0][0]'
, 'inception5a-br1-3x3-relu[0][0]
',
'inception5a-br2-5x5-relu[0][0]'
, 'inception5a-br3-1x1-relu[0][0]
']
inception5b-br1-1x1-conv (Conv (None, 8, 8, 192) 159744 ['inception5a[0][0]']
2D)
inception5b-br2-1x1-conv (Conv (None, 8, 8, 48) 39936 ['inception5a[0][0]']
2D)
inception5b-br1-1x1-bn (BatchN (None, 8, 8, 192) 576 ['inception5b-br1-1x1-conv[0][0]'
ormalization) ]
inception5b-br2-1x1-bn (BatchN (None, 8, 8, 48) 144 ['inception5b-br2-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-1x1-relu (Acti (None, 8, 8, 192) 0 ['inception5b-br1-1x1-bn[0][0]']
vation)
inception5b-br2-1x1-relu (Acti (None, 8, 8, 48) 0 ['inception5b-br2-1x1-bn[0][0]']
vation)
inception5b-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['inception5a[0][0]']
ng2D)
inception5b-br0-1x1-conv (Conv (None, 8, 8, 384) 319488 ['inception5a[0][0]']
2D)
inception5b-br1-3x3-conv (Conv (None, 8, 8, 384) 663552 ['inception5b-br1-1x1-relu[0][0]'
2D) ]
inception5b-br2-5x5-conv (Conv (None, 8, 8, 128) 153600 ['inception5b-br2-1x1-relu[0][0]'
2D) ]
inception5b-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5b-br3-pool[0][0]']
2D)
inception5b-br0-1x1-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br0-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-3x3-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br1-3x3-conv[0][0]'
ormalization) ]
inception5b-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br2-5x5-conv[0][0]'
ormalization) ]
inception5b-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br3-1x1-conv[0][0]'
ormalization) ]
inception5b-br0-1x1-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br0-1x1-bn[0][0]']
vation)
inception5b-br1-3x3-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br1-3x3-bn[0][0]']
vation)
inception5b-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br2-5x5-bn[0][0]']
vation)
inception5b-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br3-1x1-bn[0][0]']
vation)
inception5b (Concatenate) (None, 8, 8, 1024) 0 ['inception5b-br0-1x1-relu[0][0]'
, 'inception5b-br1-3x3-relu[0][0]
',
'inception5b-br2-5x5-relu[0][0]'
, 'inception5b-br3-1x1-relu[0][0]
']
avg8x8 (AveragePooling2D) (None, 1, 1, 1024) 0 ['inception5b[0][0]']
flatten (Flatten) (None, 1024) 0 ['avg8x8[0][0]']
predictions (Dense) (None, 10) 10250 ['flatten[0][0]']
==================================================================================================
Total params: 5,984,858
Trainable params: 5,970,426
Non-trainable params: 14,432
__________________________________________________________________________________________________
2D)
inception3a-br2-1x1-conv (Conv (None, 32, 32, 16) 3072 ['2b-relu[0][0]']
2D)
inception3a-br1-1x1-bn (BatchN (None, 32, 32, 96) 288 ['inception3a-br1-1x1-conv[0][0]'
ormalization) ]
inception3a-br2-1x1-bn (BatchN (None, 32, 32, 16) 48 ['inception3a-br2-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-1x1-relu (Acti (None, 32, 32, 96) 0 ['inception3a-br1-1x1-bn[0][0]']
vation)
inception3a-br2-1x1-relu (Acti (None, 32, 32, 16) 0 ['inception3a-br2-1x1-bn[0][0]']
vation)
inception3a-br3-pool (MaxPooli (None, 32, 32, 192) 0 ['2b-relu[0][0]']
ng2D)
inception3a-br0-1x1-conv (Conv (None, 32, 32, 64) 12288 ['2b-relu[0][0]']
2D)
inception3a-br1-3x3-conv (Conv (None, 32, 32, 128) 110592 ['inception3a-br1-1x1-relu[0][0]'
2D) ]
inception3a-br2-5x5-conv (Conv (None, 32, 32, 32) 12800 ['inception3a-br2-1x1-relu[0][0]'
2D) ]
inception3a-br3-1x1-conv (Conv (None, 32, 32, 32) 6144 ['inception3a-br3-pool[0][0]']
2D)
inception3a-br0-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3a-br0-1x1-conv[0][0]'
ormalization) ]
inception3a-br1-3x3-bn (BatchN (None, 32, 32, 128) 384 ['inception3a-br1-3x3-conv[0][0]'
ormalization) ]
inception3a-br2-5x5-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br2-5x5-conv[0][0]'
ormalization) ]
inception3a-br3-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3a-br3-1x1-conv[0][0]'
ormalization) ]
inception3a-br0-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3a-br0-1x1-bn[0][0]']
vation)
inception3a-br1-3x3-relu (Acti (None, 32, 32, 128) 0 ['inception3a-br1-3x3-bn[0][0]']
vation)
inception3a-br2-5x5-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br2-5x5-bn[0][0]']
vation)
inception3a-br3-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3a-br3-1x1-bn[0][0]']
vation)
inception3a (Concatenate) (None, 32, 32, 256) 0 ['inception3a-br0-1x1-relu[0][0]'
, 'inception3a-br1-3x3-relu[0][0]
',
'inception3a-br2-5x5-relu[0][0]'
, 'inception3a-br3-1x1-relu[0][0]
']
inception3b-br1-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br2-1x1-conv (Conv (None, 32, 32, 32) 8192 ['inception3a[0][0]']
2D)
inception3b-br1-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br1-1x1-conv[0][0]'
ormalization) ]
inception3b-br2-1x1-bn (BatchN (None, 32, 32, 32) 96 ['inception3b-br2-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br1-1x1-bn[0][0]']
vation)
inception3b-br2-1x1-relu (Acti (None, 32, 32, 32) 0 ['inception3b-br2-1x1-bn[0][0]']
vation)
inception3b-br3-pool (MaxPooli (None, 32, 32, 256) 0 ['inception3a[0][0]']
ng2D)
inception3b-br0-1x1-conv (Conv (None, 32, 32, 128) 32768 ['inception3a[0][0]']
2D)
inception3b-br1-3x3-conv (Conv (None, 32, 32, 192) 221184 ['inception3b-br1-1x1-relu[0][0]'
2D) ]
inception3b-br2-5x5-conv (Conv (None, 32, 32, 96) 76800 ['inception3b-br2-1x1-relu[0][0]'
2D) ]
inception3b-br3-1x1-conv (Conv (None, 32, 32, 64) 16384 ['inception3b-br3-pool[0][0]']
2D)
inception3b-br0-1x1-bn (BatchN (None, 32, 32, 128) 384 ['inception3b-br0-1x1-conv[0][0]'
ormalization) ]
inception3b-br1-3x3-bn (BatchN (None, 32, 32, 192) 576 ['inception3b-br1-3x3-conv[0][0]'
ormalization) ]
inception3b-br2-5x5-bn (BatchN (None, 32, 32, 96) 288 ['inception3b-br2-5x5-conv[0][0]'
ormalization) ]
inception3b-br3-1x1-bn (BatchN (None, 32, 32, 64) 192 ['inception3b-br3-1x1-conv[0][0]'
ormalization) ]
inception3b-br0-1x1-relu (Acti (None, 32, 32, 128) 0 ['inception3b-br0-1x1-bn[0][0]']
vation)
inception3b-br1-3x3-relu (Acti (None, 32, 32, 192) 0 ['inception3b-br1-3x3-bn[0][0]']
vation)
inception3b-br2-5x5-relu (Acti (None, 32, 32, 96) 0 ['inception3b-br2-5x5-bn[0][0]']
vation)
inception3b-br3-1x1-relu (Acti (None, 32, 32, 64) 0 ['inception3b-br3-1x1-bn[0][0]']
vation)
inception3b (Concatenate) (None, 32, 32, 480) 0 ['inception3b-br0-1x1-relu[0][0]'
, 'inception3b-br1-3x3-relu[0][0]
',
'inception3b-br2-5x5-relu[0][0]'
, 'inception3b-br3-1x1-relu[0][0]
']
3pool (MaxPooling2D) (None, 16, 16, 480) 0 ['inception3b[0][0]']
inception4a-br1-1x1-conv (Conv (None, 16, 16, 96) 46080 ['3pool[0][0]']
2D)
inception4a-br2-1x1-conv (Conv (None, 16, 16, 16) 7680 ['3pool[0][0]']
2D)
inception4a-br1-1x1-bn (BatchN (None, 16, 16, 96) 288 ['inception4a-br1-1x1-conv[0][0]'
ormalization) ]
inception4a-br2-1x1-bn (BatchN (None, 16, 16, 16) 48 ['inception4a-br2-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-1x1-relu (Acti (None, 16, 16, 96) 0 ['inception4a-br1-1x1-bn[0][0]']
vation)
inception4a-br2-1x1-relu (Acti (None, 16, 16, 16) 0 ['inception4a-br2-1x1-bn[0][0]']
vation)
inception4a-br3-pool (MaxPooli (None, 16, 16, 480) 0 ['3pool[0][0]']
ng2D)
inception4a-br0-1x1-conv (Conv (None, 16, 16, 192) 92160 ['3pool[0][0]']
2D)
inception4a-br1-3x3-conv (Conv (None, 16, 16, 208) 179712 ['inception4a-br1-1x1-relu[0][0]'
2D) ]
inception4a-br2-5x5-conv (Conv (None, 16, 16, 48) 19200 ['inception4a-br2-1x1-relu[0][0]'
2D) ]
inception4a-br3-1x1-conv (Conv (None, 16, 16, 64) 30720 ['inception4a-br3-pool[0][0]']
2D)
inception4a-br0-1x1-bn (BatchN (None, 16, 16, 192) 576 ['inception4a-br0-1x1-conv[0][0]'
ormalization) ]
inception4a-br1-3x3-bn (BatchN (None, 16, 16, 208) 624 ['inception4a-br1-3x3-conv[0][0]'
ormalization) ]
inception4a-br2-5x5-bn (BatchN (None, 16, 16, 48) 144 ['inception4a-br2-5x5-conv[0][0]'
ormalization) ]
inception4a-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4a-br3-1x1-conv[0][0]'
ormalization) ]
inception4a-br0-1x1-relu (Acti (None, 16, 16, 192) 0 ['inception4a-br0-1x1-bn[0][0]']
vation)
inception4a-br1-3x3-relu (Acti (None, 16, 16, 208) 0 ['inception4a-br1-3x3-bn[0][0]']
vation)
inception4a-br2-5x5-relu (Acti (None, 16, 16, 48) 0 ['inception4a-br2-5x5-bn[0][0]']
vation)
inception4a-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4a-br3-1x1-bn[0][0]']
vation)
inception4a (Concatenate) (None, 16, 16, 512) 0 ['inception4a-br0-1x1-relu[0][0]'
, 'inception4a-br1-3x3-relu[0][0]
',
'inception4a-br2-5x5-relu[0][0]'
, 'inception4a-br3-1x1-relu[0][0]
']
inception4b-br1-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4a[0][0]']
2D)
inception4b-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4a[0][0]']
2D)
inception4b-br1-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4b-br1-1x1-conv[0][0]'
ormalization) ]
inception4b-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4b-br2-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4b-br1-1x1-bn[0][0]']
vation)
inception4b-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4b-br2-1x1-bn[0][0]']
vation)
inception4b-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4a[0][0]']
ng2D)
inception4b-br0-1x1-conv (Conv (None, 16, 16, 160) 81920 ['inception4a[0][0]']
2D)
inception4b-br1-3x3-conv (Conv (None, 16, 16, 224) 225792 ['inception4b-br1-1x1-relu[0][0]'
2D) ]
inception4b-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4b-br2-1x1-relu[0][0]'
2D) ]
inception4b-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4b-br3-pool[0][0]']
2D)
inception4b-br0-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4b-br0-1x1-conv[0][0]'
ormalization) ]
inception4b-br1-3x3-bn (BatchN (None, 16, 16, 224) 672 ['inception4b-br1-3x3-conv[0][0]'
ormalization) ]
inception4b-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br2-5x5-conv[0][0]'
ormalization) ]
inception4b-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4b-br3-1x1-conv[0][0]'
ormalization) ]
inception4b-br0-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4b-br0-1x1-bn[0][0]']
vation)
inception4b-br1-3x3-relu (Acti (None, 16, 16, 224) 0 ['inception4b-br1-3x3-bn[0][0]']
vation)
inception4b-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br2-5x5-bn[0][0]']
vation)
inception4b-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4b-br3-1x1-bn[0][0]']
vation)
inception4b (Concatenate) (None, 16, 16, 512) 0 ['inception4b-br0-1x1-relu[0][0]'
, 'inception4b-br1-3x3-relu[0][0]
',
'inception4b-br2-5x5-relu[0][0]'
, 'inception4b-br3-1x1-relu[0][0]
']
inception4c-br1-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br2-1x1-conv (Conv (None, 16, 16, 24) 12288 ['inception4b[0][0]']
2D)
inception4c-br1-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br1-1x1-conv[0][0]'
ormalization) ]
inception4c-br2-1x1-bn (BatchN (None, 16, 16, 24) 72 ['inception4c-br2-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br1-1x1-bn[0][0]']
vation)
inception4c-br2-1x1-relu (Acti (None, 16, 16, 24) 0 ['inception4c-br2-1x1-bn[0][0]']
vation)
inception4c-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4b[0][0]']
ng2D)
inception4c-br0-1x1-conv (Conv (None, 16, 16, 128) 65536 ['inception4b[0][0]']
2D)
inception4c-br1-3x3-conv (Conv (None, 16, 16, 256) 294912 ['inception4c-br1-1x1-relu[0][0]'
2D) ]
inception4c-br2-5x5-conv (Conv (None, 16, 16, 64) 38400 ['inception4c-br2-1x1-relu[0][0]'
2D) ]
inception4c-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4c-br3-pool[0][0]']
2D)
inception4c-br0-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4c-br0-1x1-conv[0][0]'
ormalization) ]
inception4c-br1-3x3-bn (BatchN (None, 16, 16, 256) 768 ['inception4c-br1-3x3-conv[0][0]'
ormalization) ]
inception4c-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br2-5x5-conv[0][0]'
ormalization) ]
inception4c-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4c-br3-1x1-conv[0][0]'
ormalization) ]
inception4c-br0-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4c-br0-1x1-bn[0][0]']
vation)
inception4c-br1-3x3-relu (Acti (None, 16, 16, 256) 0 ['inception4c-br1-3x3-bn[0][0]']
vation)
inception4c-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br2-5x5-bn[0][0]']
vation)
inception4c-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4c-br3-1x1-bn[0][0]']
vation)
inception4c (Concatenate) (None, 16, 16, 512) 0 ['inception4c-br0-1x1-relu[0][0]'
, 'inception4c-br1-3x3-relu[0][0]
',
'inception4c-br2-5x5-relu[0][0]'
, 'inception4c-br3-1x1-relu[0][0]
']
inception4d-br1-1x1-conv (Conv (None, 16, 16, 144) 73728 ['inception4c[0][0]']
2D)
inception4d-br2-1x1-conv (Conv (None, 16, 16, 32) 16384 ['inception4c[0][0]']
2D)
inception4d-br1-1x1-bn (BatchN (None, 16, 16, 144) 432 ['inception4d-br1-1x1-conv[0][0]'
ormalization) ]
inception4d-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4d-br2-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-1x1-relu (Acti (None, 16, 16, 144) 0 ['inception4d-br1-1x1-bn[0][0]']
vation)
inception4d-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4d-br2-1x1-bn[0][0]']
vation)
inception4d-br3-pool (MaxPooli (None, 16, 16, 512) 0 ['inception4c[0][0]']
ng2D)
inception4d-br0-1x1-conv (Conv (None, 16, 16, 112) 57344 ['inception4c[0][0]']
2D)
inception4d-br1-3x3-conv (Conv (None, 16, 16, 288) 373248 ['inception4d-br1-1x1-relu[0][0]'
2D) ]
inception4d-br2-5x5-conv (Conv (None, 16, 16, 64) 51200 ['inception4d-br2-1x1-relu[0][0]'
2D) ]
inception4d-br3-1x1-conv (Conv (None, 16, 16, 64) 32768 ['inception4d-br3-pool[0][0]']
2D)
inception4d-br0-1x1-bn (BatchN (None, 16, 16, 112) 336 ['inception4d-br0-1x1-conv[0][0]'
ormalization) ]
inception4d-br1-3x3-bn (BatchN (None, 16, 16, 288) 864 ['inception4d-br1-3x3-conv[0][0]'
ormalization) ]
inception4d-br2-5x5-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br2-5x5-conv[0][0]'
ormalization) ]
inception4d-br3-1x1-bn (BatchN (None, 16, 16, 64) 192 ['inception4d-br3-1x1-conv[0][0]'
ormalization) ]
inception4d-br0-1x1-relu (Acti (None, 16, 16, 112) 0 ['inception4d-br0-1x1-bn[0][0]']
vation)
inception4d-br1-3x3-relu (Acti (None, 16, 16, 288) 0 ['inception4d-br1-3x3-bn[0][0]']
vation)
inception4d-br2-5x5-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br2-5x5-bn[0][0]']
vation)
inception4d-br3-1x1-relu (Acti (None, 16, 16, 64) 0 ['inception4d-br3-1x1-bn[0][0]']
vation)
inception4d (Concatenate) (None, 16, 16, 528) 0 ['inception4d-br0-1x1-relu[0][0]'
, 'inception4d-br1-3x3-relu[0][0]
',
'inception4d-br2-5x5-relu[0][0]'
, 'inception4d-br3-1x1-relu[0][0]
']
inception4e-br1-1x1-conv (Conv (None, 16, 16, 160) 84480 ['inception4d[0][0]']
2D)
inception4e-br2-1x1-conv (Conv (None, 16, 16, 32) 16896 ['inception4d[0][0]']
2D)
inception4e-br1-1x1-bn (BatchN (None, 16, 16, 160) 480 ['inception4e-br1-1x1-conv[0][0]'
ormalization) ]
inception4e-br2-1x1-bn (BatchN (None, 16, 16, 32) 96 ['inception4e-br2-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-1x1-relu (Acti (None, 16, 16, 160) 0 ['inception4e-br1-1x1-bn[0][0]']
vation)
inception4e-br2-1x1-relu (Acti (None, 16, 16, 32) 0 ['inception4e-br2-1x1-bn[0][0]']
vation)
inception4e-br3-pool (MaxPooli (None, 16, 16, 528) 0 ['inception4d[0][0]']
ng2D)
inception4e-br0-1x1-conv (Conv (None, 16, 16, 256) 135168 ['inception4d[0][0]']
2D)
inception4e-br1-3x3-conv (Conv (None, 16, 16, 320) 460800 ['inception4e-br1-1x1-relu[0][0]'
2D) ]
inception4e-br2-5x5-conv (Conv (None, 16, 16, 128) 102400 ['inception4e-br2-1x1-relu[0][0]'
2D) ]
inception4e-br3-1x1-conv (Conv (None, 16, 16, 128) 67584 ['inception4e-br3-pool[0][0]']
2D)
inception4e-br0-1x1-bn (BatchN (None, 16, 16, 256) 768 ['inception4e-br0-1x1-conv[0][0]'
ormalization) ]
inception4e-br1-3x3-bn (BatchN (None, 16, 16, 320) 960 ['inception4e-br1-3x3-conv[0][0]'
ormalization) ]
inception4e-br2-5x5-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br2-5x5-conv[0][0]'
ormalization) ]
inception4e-br3-1x1-bn (BatchN (None, 16, 16, 128) 384 ['inception4e-br3-1x1-conv[0][0]'
ormalization) ]
inception4e-br0-1x1-relu (Acti (None, 16, 16, 256) 0 ['inception4e-br0-1x1-bn[0][0]']
vation)
inception4e-br1-3x3-relu (Acti (None, 16, 16, 320) 0 ['inception4e-br1-3x3-bn[0][0]']
vation)
inception4e-br2-5x5-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br2-5x5-bn[0][0]']
vation)
inception4e-br3-1x1-relu (Acti (None, 16, 16, 128) 0 ['inception4e-br3-1x1-bn[0][0]']
vation)
inception4e (Concatenate) (None, 16, 16, 832) 0 ['inception4e-br0-1x1-relu[0][0]'
, 'inception4e-br1-3x3-relu[0][0]
',
'inception4e-br2-5x5-relu[0][0]'
, 'inception4e-br3-1x1-relu[0][0]
']
4pool (MaxPooling2D) (None, 8, 8, 832) 0 ['inception4e[0][0]']
inception5a-br1-1x1-conv (Conv (None, 8, 8, 160) 133120 ['4pool[0][0]']
2D)
inception5a-br2-1x1-conv (Conv (None, 8, 8, 32) 26624 ['4pool[0][0]']
2D)
inception5a-br1-1x1-bn (BatchN (None, 8, 8, 160) 480 ['inception5a-br1-1x1-conv[0][0]'
ormalization) ]
inception5a-br2-1x1-bn (BatchN (None, 8, 8, 32) 96 ['inception5a-br2-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-1x1-relu (Acti (None, 8, 8, 160) 0 ['inception5a-br1-1x1-bn[0][0]']
vation)
inception5a-br2-1x1-relu (Acti (None, 8, 8, 32) 0 ['inception5a-br2-1x1-bn[0][0]']
vation)
inception5a-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['4pool[0][0]']
ng2D)
inception5a-br0-1x1-conv (Conv (None, 8, 8, 256) 212992 ['4pool[0][0]']
2D)
inception5a-br1-3x3-conv (Conv (None, 8, 8, 320) 460800 ['inception5a-br1-1x1-relu[0][0]'
2D) ]
inception5a-br2-5x5-conv (Conv (None, 8, 8, 128) 102400 ['inception5a-br2-1x1-relu[0][0]'
2D) ]
inception5a-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5a-br3-pool[0][0]']
2D)
inception5a-br0-1x1-bn (BatchN (None, 8, 8, 256) 768 ['inception5a-br0-1x1-conv[0][0]'
ormalization) ]
inception5a-br1-3x3-bn (BatchN (None, 8, 8, 320) 960 ['inception5a-br1-3x3-conv[0][0]'
ormalization) ]
inception5a-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br2-5x5-conv[0][0]'
ormalization) ]
inception5a-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5a-br3-1x1-conv[0][0]'
ormalization) ]
inception5a-br0-1x1-relu (Acti (None, 8, 8, 256) 0 ['inception5a-br0-1x1-bn[0][0]']
vation)
inception5a-br1-3x3-relu (Acti (None, 8, 8, 320) 0 ['inception5a-br1-3x3-bn[0][0]']
vation)
inception5a-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br2-5x5-bn[0][0]']
vation)
inception5a-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5a-br3-1x1-bn[0][0]']
vation)
inception5a (Concatenate) (None, 8, 8, 832) 0 ['inception5a-br0-1x1-relu[0][0]'
, 'inception5a-br1-3x3-relu[0][0]
',
'inception5a-br2-5x5-relu[0][0]'
, 'inception5a-br3-1x1-relu[0][0]
']
inception5b-br1-1x1-conv (Conv (None, 8, 8, 192) 159744 ['inception5a[0][0]']
2D)
inception5b-br2-1x1-conv (Conv (None, 8, 8, 48) 39936 ['inception5a[0][0]']
2D)
inception5b-br1-1x1-bn (BatchN (None, 8, 8, 192) 576 ['inception5b-br1-1x1-conv[0][0]'
ormalization) ]
inception5b-br2-1x1-bn (BatchN (None, 8, 8, 48) 144 ['inception5b-br2-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-1x1-relu (Acti (None, 8, 8, 192) 0 ['inception5b-br1-1x1-bn[0][0]']
vation)
inception5b-br2-1x1-relu (Acti (None, 8, 8, 48) 0 ['inception5b-br2-1x1-bn[0][0]']
vation)
inception5b-br3-pool (MaxPooli (None, 8, 8, 832) 0 ['inception5a[0][0]']
ng2D)
inception5b-br0-1x1-conv (Conv (None, 8, 8, 384) 319488 ['inception5a[0][0]']
2D)
inception5b-br1-3x3-conv (Conv (None, 8, 8, 384) 663552 ['inception5b-br1-1x1-relu[0][0]'
2D) ]
inception5b-br2-5x5-conv (Conv (None, 8, 8, 128) 153600 ['inception5b-br2-1x1-relu[0][0]'
2D) ]
inception5b-br3-1x1-conv (Conv (None, 8, 8, 128) 106496 ['inception5b-br3-pool[0][0]']
2D)
inception5b-br0-1x1-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br0-1x1-conv[0][0]'
ormalization) ]
inception5b-br1-3x3-bn (BatchN (None, 8, 8, 384) 1152 ['inception5b-br1-3x3-conv[0][0]'
ormalization) ]
inception5b-br2-5x5-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br2-5x5-conv[0][0]'
ormalization) ]
inception5b-br3-1x1-bn (BatchN (None, 8, 8, 128) 384 ['inception5b-br3-1x1-conv[0][0]'
ormalization) ]
inception5b-br0-1x1-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br0-1x1-bn[0][0]']
vation)
inception5b-br1-3x3-relu (Acti (None, 8, 8, 384) 0 ['inception5b-br1-3x3-bn[0][0]']
vation)
inception5b-br2-5x5-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br2-5x5-bn[0][0]']
vation)
inception5b-br3-1x1-relu (Acti (None, 8, 8, 128) 0 ['inception5b-br3-1x1-bn[0][0]']
vation)
inception5b (Concatenate) (None, 8, 8, 1024) 0 ['inception5b-br0-1x1-relu[0][0]'
, 'inception5b-br1-3x3-relu[0][0]
',
'inception5b-br2-5x5-relu[0][0]'
, 'inception5b-br3-1x1-relu[0][0]
']
avg8x8 (AveragePooling2D) (None, 1, 1, 1024) 0 ['inception5b[0][0]']
flatten (Flatten) (None, 1024) 0 ['avg8x8[0][0]']
predictions (Dense) (None, 10) 10250 ['flatten[0][0]']
==================================================================================================
Total params: 5,984,858
Trainable params: 5,970,426
Non-trainable params: 14,432
__________________________________________________________________________________________________
这段代码我们使用的是基于基本图像处理的数据增强,我们设置了一些,比如roattion_range也就是旋转的角度,以及左右偏移大概0.1,以及水平翻转等,这些都是可以在我们的ImageDataGenerator中进行设置
%%time
if data_augmentation:
# datagen
datagen = ImageDataGenerator(
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
rotation_range=15, # randomly rotate images in the range (degrees, 0 to 180)
width_shift_range=0.1, # randomly shift images horizontally (fraction of total width)
height_shift_range=0.1, # randomly shift images vertically (fraction of total height)
horizontal_flip=True, # randomly flip images
vertical_flip=False, # randomly flip images
)
# (std, mean, and principal components if ZCA whitening is applied).
datagen.fit(x_train)
print('train with data augmentation')
history = model.fit_generator(generator=datagen.flow(x_train, y_train, batch_size=batch_size),
epochs=epochs,
callbacks=[reduce_lr],
validation_data=(x_val, y_val)
)
else:
print('train without data augmentation')
history = model.fit(x_train, y_train,
batch_size=batch_size, epochs=epochs,
callbacks=[reduce_lr],
validation_data=(x_val, y_val)
)
train with data augmentation
Epoch 1/30
391/391 [==============================] - 517s 1s/step - loss: 1.5435 - accuracy: 0.4563 - val_loss: 1.4637 - val_accuracy: 0.5141 - lr: 0.1000
Epoch 2/30
391/391 [==============================] - 479s 1s/step - loss: 0.9685 - accuracy: 0.6567 - val_loss: 1.1314 - val_accuracy: 0.6326 - lr: 0.1000
Epoch 3/30
391/391 [==============================] - 478s 1s/step - loss: 0.7247 - accuracy: 0.7472 - val_loss: 0.8824 - val_accuracy: 0.7100 - lr: 0.1000
Epoch 4/30
391/391 [==============================] - ETA: 0s - loss: 0.5924 - accuracy: 0.7954
Epoch 4: ReduceLROnPlateau reducing learning rate to 0.093000001385808.
391/391 [==============================] - 479s 1s/step - loss: 0.5924 - accuracy: 0.7954 - val_loss: 1.1754 - val_accuracy: 0.6716 - lr: 0.1000
Epoch 5/30
391/391 [==============================] - 479s 1s/step - loss: 0.4967 - accuracy: 0.8290 - val_loss: 0.7147 - val_accuracy: 0.7688 - lr: 0.0930
Epoch 6/30
391/391 [==============================] - 479s 1s/step - loss: 0.4283 - accuracy: 0.8504 - val_loss: 0.5568 - val_accuracy: 0.8125 - lr: 0.0930
Epoch 7/30
391/391 [==============================] - 479s 1s/step - loss: 0.3841 - accuracy: 0.8672 - val_loss: 0.4610 - val_accuracy: 0.8434 - lr: 0.0930
Epoch 8/30
391/391 [==============================] - ETA: 0s - loss: 0.3445 - accuracy: 0.8803
Epoch 8: ReduceLROnPlateau reducing learning rate to 0.08649000205099583.
391/391 [==============================] - 479s 1s/step - loss: 0.3445 - accuracy: 0.8803 - val_loss: 0.5123 - val_accuracy: 0.8343 - lr: 0.0930
Epoch 9/30
391/391 [==============================] - 478s 1s/step - loss: 0.3034 - accuracy: 0.8949 - val_loss: 0.4373 - val_accuracy: 0.8478 - lr: 0.0865
Epoch 10/30
391/391 [==============================] - ETA: 0s - loss: 0.2811 - accuracy: 0.9021
Epoch 10: ReduceLROnPlateau reducing learning rate to 0.0804357048869133.
391/391 [==============================] - 478s 1s/step - loss: 0.2811 - accuracy: 0.9021 - val_loss: 0.7654 - val_accuracy: 0.7912 - lr: 0.0865
Epoch 11/30
391/391 [==============================] - ETA: 0s - loss: 0.2444 - accuracy: 0.9160
Epoch 11: ReduceLROnPlateau reducing learning rate to 0.07480520859360695.
391/391 [==============================] - 478s 1s/step - loss: 0.2444 - accuracy: 0.9160 - val_loss: 0.5647 - val_accuracy: 0.8336 - lr: 0.0804
Epoch 12/30
391/391 [==============================] - ETA: 0s - loss: 0.2210 - accuracy: 0.9224
Epoch 12: ReduceLROnPlateau reducing learning rate to 0.06956884302198887.
391/391 [==============================] - 479s 1s/step - loss: 0.2210 - accuracy: 0.9224 - val_loss: 0.5110 - val_accuracy: 0.8455 - lr: 0.0748
Epoch 13/30
391/391 [==============================] - 480s 1s/step - loss: 0.1933 - accuracy: 0.9329 - val_loss: 0.3669 - val_accuracy: 0.8872 - lr: 0.0696
Epoch 14/30
391/391 [==============================] - ETA: 0s - loss: 0.1786 - accuracy: 0.9379
Epoch 14: ReduceLROnPlateau reducing learning rate to 0.06469902366399766.
391/391 [==============================] - 479s 1s/step - loss: 0.1786 - accuracy: 0.9379 - val_loss: 0.5728 - val_accuracy: 0.8439 - lr: 0.0696
Epoch 15/30
391/391 [==============================] - ETA: 0s - loss: 0.1634 - accuracy: 0.9414
Epoch 15: ReduceLROnPlateau reducing learning rate to 0.06017009228467941.
391/391 [==============================] - 478s 1s/step - loss: 0.1634 - accuracy: 0.9414 - val_loss: 0.5808 - val_accuracy: 0.8468 - lr: 0.0647
Epoch 16/30
391/391 [==============================] - ETA: 0s - loss: 0.1416 - accuracy: 0.9501
Epoch 16: ReduceLROnPlateau reducing learning rate to 0.05595818527042866.
391/391 [==============================] - 479s 1s/step - loss: 0.1416 - accuracy: 0.9501 - val_loss: 0.5402 - val_accuracy: 0.8560 - lr: 0.0602
Epoch 17/30
391/391 [==============================] - ETA: 0s - loss: 0.1281 - accuracy: 0.9552
Epoch 17: ReduceLROnPlateau reducing learning rate to 0.05204111237078905.
391/391 [==============================] - 478s 1s/step - loss: 0.1281 - accuracy: 0.9552 - val_loss: 0.4609 - val_accuracy: 0.8759 - lr: 0.0560
Epoch 18/30
391/391 [==============================] - 487s 1s/step - loss: 0.1143 - accuracy: 0.9587 - val_loss: 0.3379 - val_accuracy: 0.9004 - lr: 0.0520
Epoch 19/30
391/391 [==============================] - ETA: 0s - loss: 0.1081 - accuracy: 0.9622
Epoch 19: ReduceLROnPlateau reducing learning rate to 0.04839823544025421.
391/391 [==============================] - 478s 1s/step - loss: 0.1081 - accuracy: 0.9622 - val_loss: 0.4783 - val_accuracy: 0.8749 - lr: 0.0520
Epoch 20/30
391/391 [==============================] - ETA: 0s - loss: 0.0949 - accuracy: 0.9657
Epoch 20: ReduceLROnPlateau reducing learning rate to 0.04501035757362843.
391/391 [==============================] - 479s 1s/step - loss: 0.0949 - accuracy: 0.9657 - val_loss: 0.4170 - val_accuracy: 0.8907 - lr: 0.0484
Epoch 21/30
391/391 [==============================] - ETA: 0s - loss: 0.0818 - accuracy: 0.9711
Epoch 21: ReduceLROnPlateau reducing learning rate to 0.04185963302850723.
391/391 [==============================] - 479s 1s/step - loss: 0.0818 - accuracy: 0.9711 - val_loss: 0.4150 - val_accuracy: 0.8899 - lr: 0.0450
Epoch 22/30
391/391 [==============================] - ETA: 0s - loss: 0.0729 - accuracy: 0.9738
Epoch 22: ReduceLROnPlateau reducing learning rate to 0.03892945982515812.
391/391 [==============================] - 478s 1s/step - loss: 0.0729 - accuracy: 0.9738 - val_loss: 0.4291 - val_accuracy: 0.8956 - lr: 0.0419
Epoch 23/30
391/391 [==============================] - ETA: 0s - loss: 0.0636 - accuracy: 0.9783
Epoch 23: ReduceLROnPlateau reducing learning rate to 0.03620439659804106.
391/391 [==============================] - 479s 1s/step - loss: 0.0636 - accuracy: 0.9783 - val_loss: 0.4060 - val_accuracy: 0.9007 - lr: 0.0389
Epoch 24/30
391/391 [==============================] - ETA: 0s - loss: 0.0606 - accuracy: 0.9791
Epoch 24: ReduceLROnPlateau reducing learning rate to 0.03367008984088898.
391/391 [==============================] - 479s 1s/step - loss: 0.0606 - accuracy: 0.9791 - val_loss: 0.4204 - val_accuracy: 0.9040 - lr: 0.0362
Epoch 25/30
391/391 [==============================] - ETA: 0s - loss: 0.0534 - accuracy: 0.9814
Epoch 25: ReduceLROnPlateau reducing learning rate to 0.03131318382918835.
391/391 [==============================] - 478s 1s/step - loss: 0.0534 - accuracy: 0.9814 - val_loss: 0.4334 - val_accuracy: 0.9018 - lr: 0.0337
Epoch 26/30
391/391 [==============================] - ETA: 0s - loss: 0.0451 - accuracy: 0.9839
Epoch 26: ReduceLROnPlateau reducing learning rate to 0.02912126172333956.
391/391 [==============================] - 478s 1s/step - loss: 0.0451 - accuracy: 0.9839 - val_loss: 0.4527 - val_accuracy: 0.8986 - lr: 0.0313
Epoch 27/30
391/391 [==============================] - ETA: 0s - loss: 0.0394 - accuracy: 0.9861
Epoch 27: ReduceLROnPlateau reducing learning rate to 0.027082772813737395.
391/391 [==============================] - 479s 1s/step - loss: 0.0394 - accuracy: 0.9861 - val_loss: 0.4816 - val_accuracy: 0.8999 - lr: 0.0291
Epoch 28/30
391/391 [==============================] - ETA: 0s - loss: 0.0381 - accuracy: 0.9868
Epoch 28: ReduceLROnPlateau reducing learning rate to 0.025186978820711376.
391/391 [==============================] - 480s 1s/step - loss: 0.0381 - accuracy: 0.9868 - val_loss: 0.3836 - val_accuracy: 0.9145 - lr: 0.0271
Epoch 29/30
391/391 [==============================] - ETA: 0s - loss: 0.0332 - accuracy: 0.9888
Epoch 29: ReduceLROnPlateau reducing learning rate to 0.02342388980090618.
391/391 [==============================] - 487s 1s/step - loss: 0.0332 - accuracy: 0.9888 - val_loss: 0.3788 - val_accuracy: 0.9146 - lr: 0.0252
Epoch 30/30
391/391 [==============================] - ETA: 0s - loss: 0.0255 - accuracy: 0.9913
Epoch 30: ReduceLROnPlateau reducing learning rate to 0.02178421737626195.
391/391 [==============================] - 479s 1s/step - loss: 0.0255 - accuracy: 0.9913 - val_loss: 0.4110 - val_accuracy: 0.9167 - lr: 0.0234
CPU times: user 3h 8min 49s, sys: 2min 28s, total: 3h 11min 17s
Wall time: 4h 17s
plot_model_history(history)
从结果可以看出,使用了数据增强之后,我们的结果是比没有进行数据增强是好的,已经达到了91.67%+的准确率,如果设置好数据增强的参数,很有可能可以得到更高的准确率,数据增强还是对结果有比较大的影响的。
loss,acc = model.evaluate(x_val,y_val)
print('evaluate loss:%f acc:%f' % (loss, acc))
313/313 [==============================] - 34s 109ms/step - loss: 0.4110 - accuracy: 0.9167
evaluate loss:0.410978 acc:0.916700