热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【KerasAlexNet】CIFAR10

系列连载目录请查看博客《Paper》4.1小节【Keras】ClassificationinCIFAR-10系列连载学习借鉴github:BIGBALLONci

系列连载目录


  • 请查看博客 《Paper》 4.1 小节 【Keras】Classification in CIFAR-10 系列连载

学习借鉴


  • github:BIGBALLON/cifar-10-cnn
  • 知乎专栏:写给妹子的深度学习教程
  • AlexNet Caffe 代码:https://github.com/BVLC/caffe/blob/master/models/bvlc_alexnet/train_val.prototxthttps://github.com/DeepScale/SqueezeNet/blob/master/SqueezeNet_v1.0/train_val.prototxt
  • AlexNet Keras 代码:keras实现常用深度学习模型LeNet,AlexNet,ZFNet,VGGNet,GoogleNet,Resnet

参考


  • 【Keras-CNN】CIFAR-10
  • 本地远程访问Ubuntu16.04.3服务器上的TensorBoard
  • caffe代码可视化工具

代码


  • 链接:https://pan.baidu.com/s/1KnR1ZYTHaXOStmDA_d1jjQ
    提取码:7d87

硬件


  • TITAN XP



文章目录

  • 1 理论基础
  • 2 AlexNet 代码实现
    • 2.1 alexnet
    • 2.2 alexnet_slim
    • 2.3 alexnet_slim_regular
    • 2.4 alexnet_thinner
  • 3 总结


1 理论基础

在这里插入图片描述


2 AlexNet 代码实现


2.1 alexnet

1)导入库,设置好超参数

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="1" import keras
from keras.datasets import cifar10
from keras import backend as K
from keras.layers import Input, Conv2D, GlobalAveragePooling2D, Dense, BatchNormalization, Activation, MaxPooling2D
from keras.models import Model
from keras.layers import concatenate,Dropout,Flattenfrom keras import optimizers,regularizers
from keras.preprocessing.image import ImageDataGenerator
from keras.initializers import he_normal
from keras.callbacks import LearningRateScheduler, TensorBoard, ModelCheckpointnum_classes = 10
batch_size = 64 # 64 or 32 or other
epochs = 300
iterations = 782
DROPOUT=0.5 # keep 50%
CONCAT_AXIS=3
weight_decay=1e-4
DATA_FORMAT='channels_last' # Theano:'channels_first' Tensorflow:'channels_last'
log_filepath = './alexnet'

2)数据预处理并设置 learning schedule

def color_preprocessing(x_train,x_test):x_train &#61; x_train.astype(&#39;float32&#39;)x_test &#61; x_test.astype(&#39;float32&#39;)mean &#61; [125.307, 122.95, 113.865]std &#61; [62.9932, 62.0887, 66.7048]for i in range(3):x_train[:,:,:,i] &#61; (x_train[:,:,:,i] - mean[i]) / std[i]x_test[:,:,:,i] &#61; (x_test[:,:,:,i] - mean[i]) / std[i]return x_train, x_testdef scheduler(epoch):if epoch < 100:return 0.01if epoch < 200:return 0.001return 0.0001# load data
(x_train, y_train), (x_test, y_test) &#61; cifar10.load_data()
y_train &#61; keras.utils.to_categorical(y_train, num_classes)
y_test &#61; keras.utils.to_categorical(y_test, num_classes)
x_train, x_test &#61; color_preprocessing(x_train, x_test)

3&#xff09;搭建网络
在这里插入图片描述
https://engmrk.com/alexnet-implementation-using-keras/

def alexnet(img_input,classes&#61;10):x &#61; Conv2D(96,(11,11),strides&#61;(4,4),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(img_input)# validx &#61; MaxPooling2D(pool_size&#61;(3,3),strides&#61;(2,2),padding&#61;&#39;same&#39;,data_format&#61;DATA_FORMAT)(x)x &#61; Conv2D(256,(5,5),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(x)x &#61; MaxPooling2D(pool_size&#61;(3,3),strides&#61;(2,2),padding&#61;&#39;same&#39;,data_format&#61;DATA_FORMAT)(x)x &#61; Conv2D(384,(3,3),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(x) x &#61; Conv2D(384,(3,3),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(x) x &#61; Conv2D(256,(3,3),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(x)x &#61; MaxPooling2D(pool_size&#61;(3,3),strides&#61;(2,2),padding&#61;&#39;same&#39;,data_format&#61;DATA_FORMAT)(x)x &#61; Flatten()(x)x &#61; Dense(4096,activation&#61;&#39;relu&#39;)(x)x &#61; Dropout(0.5)(x)x &#61; Dense(4096,activation&#61;&#39;relu&#39;)(x)x &#61; Dropout(0.5)(x)out &#61; Dense(classes, activation&#61;&#39;softmax&#39;)(x)return out

4&#xff09;生成模型

img_input&#61;Input(shape&#61;(32,32,3))
output &#61; alexnet(img_input)
model&#61;Model(img_input,output)
model.summary()

参数量如下&#xff08;还是相当恐怖的&#xff09;&#xff1a;


Total params: 21,622,154
Trainable params: 21,622,154
Non-trainable params: 0


5&#xff09;开始训练

# set optimizer
sgd &#61; optimizers.SGD(lr&#61;.1, momentum&#61;0.9, nesterov&#61;True)
model.compile(loss&#61;&#39;categorical_crossentropy&#39;, optimizer&#61;sgd, metrics&#61;[&#39;accuracy&#39;])# set callback
tb_cb &#61; TensorBoard(log_dir&#61;log_filepath, histogram_freq&#61;0)
change_lr &#61; LearningRateScheduler(scheduler)
cbks &#61; [change_lr,tb_cb]# set data augmentation
datagen &#61; ImageDataGenerator(horizontal_flip&#61;True,width_shift_range&#61;0.125,height_shift_range&#61;0.125,fill_mode&#61;&#39;constant&#39;,cval&#61;0.)
datagen.fit(x_train)# start training
model.fit_generator(datagen.flow(x_train, y_train,batch_size&#61;batch_size),steps_per_epoch&#61;iterations,epochs&#61;epochs,callbacks&#61;cbks,validation_data&#61;(x_test, y_test))
model.save(&#39;alexnet.h5&#39;)

6&#xff09;结果分析
training accuracy 和 training loss
在这里插入图片描述在这里插入图片描述
test accuracy 和 test loss
在这里插入图片描述在这里插入图片描述
loss 和 accuracy 一个样&#xff0c;正宗的耐克标志&#xff01;超级过拟合&#xff0c;fully connection 果然名不虚传


2.2 alexnet_slim

将 AlexNet 中 第一个卷积和第一个 maxpooling 用一个 filters &#61; 96&#xff0c;size &#61; 3&#xff0c;stride &#61; 1 的 convolution 来替代。AlexNet 原有 5 次 downsampling 的过程&#xff0c;这样操作的话&#xff0c;只有后面 2次了&#xff0c;这么做的原因是 imagenet 和 cifar-10 图片的 resolution 的差别&#xff01;

x &#61; Conv2D(96,(3,3),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;uniform&#39;)(img_input)# valid

其它部分代码同 alexnet

参数量如下&#xff08;增加了挺多的&#xff09;&#xff1a;


Total params: 87,650,186
Trainable params: 87,650,186
Non-trainable params: 0



  • alexnet
    Total params: 21,622,154

因为 down sampling 的次数少了3次&#xff0c;最后接 fc 层 的feature map 的 resolution 会大 8×8倍&#xff0c;而且 CNN 的参数量大多都集中在 fc 层的结构&#xff0c;所以参数量变多了可想而知&#xff01; 叫 slim 的原因是缩减了一些 down sampling 层&#xff0c;如果是全卷积网络&#xff0c;参数量会减少或者不变&#xff01;

test accuracy 和 test loss
在这里插入图片描述
在这里插入图片描述
美滋滋&#xff0c;90%&#43;了&#xff0c;可是还是有一定的过拟合现象&#xff01;


2.3 alexnet_slim_regular

alexnet_slim 的基础上&#xff0c;修改网络的初始化策略为 he_normal&#xff0c;增加 l2 regularization&#xff0c;配合 weight decay&#xff0c;修改每个卷积如如下形式&#xff1a;

x &#61; Conv2D(96,(3,3),strides&#61;(1,1),padding&#61;&#39;same&#39;,activation&#61;&#39;relu&#39;,kernel_initializer&#61;&#39;he_normal&#39;,kernel_regularizer&#61;regularizers.l2(weight_decay))(img_input)# valid

其它代码同 alexnet_slim

参数量如下&#xff08;不变&#xff09;&#xff1a;


Total params: 87,650,186
Trainable params: 87,650,186
Non-trainable params: 0



  • alexnet
    Total params: 21,622,154
  • alexnet_slim
    Total params: 87,650,186

结果分析如下
training accuracy 和 training loss
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
test accuracy 和 test loss
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
精度上到了 92%&#xff0c;过拟合现象得到了缓解
在这里插入图片描述


2.4 alexnet_thinner

alexnet_thinner_2alexnet_slim_regular 的基础上&#xff0c;将网络所有的 filters number 改为原来的 1/2&#xff0c;包括 fully connection&#xff0c;
alexnet_thinner_4alexnet_slim_regular 的基础上&#xff0c;将网络所有的 filters number 改为原来的 1/4&#xff0c;包括 fully connection。

其它代码同 alexnet_slim_regular

参数量如下&#xff1a;


  • alexnet
    Total params: 21,622,154

  • alexnet_slim
    Total params: 87,650,186

  • alexnet_slim_regular
    Total params: 87,650,186

  • alexnet_thinner_2
    Total params: 6,074,250

  • alexnet_thinner_4
    Total params: 5,488,106

结果分析如下
train accuracy 和 train loss
在这里插入图片描述
test accuracy 和 test loss
在这里插入图片描述
对比来看&#xff0c;thinner_2 模型比较大&#xff0c;有些过拟合了&#xff0c;thinner_4 模型较小&#xff0c;后面loss 没有上升的迹象&#xff0c;直觉上的感觉是 convolution 和 fc 要相匹配&#xff0c;convolution 过小&#xff0c;fc 过大&#xff0c;则会过拟合&#xff0c;相匹配会好一些&#xff08;可能 hyper parameters 不是最优&#xff0c;所以结论并不靠谱&#xff09;&#xff01;


3 总结

精度最高的是 alexnet_slim_regular

模型大小
在这里插入图片描述

参数量


  • alexnet
    Total params: 21,622,154

  • alexnet_slim
    Total params: 87,650,186

  • alexnet_slim_regular
    Total params: 87,650,186

  • alexnet_thinner_2
    Total params: 6,074,250

  • alexnet_thinner_4
    Total params: 5,488,106


推荐阅读
author-avatar
GuangLi1472_716
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有