本文主要是介绍Keras 入门课4 -- 使用ResNet识别cifar10数据集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Keras入门课4:使用ResNet识别cifar10数据集
本系列课程代码,欢迎star:
https://github.com/tsycnh/Keras-Tutorials
前面几节课都是用一些简单的网络来做图像识别,这节课我们要使用经典的ResNet网络对cifar10进行分类。
ResNet是何凯明大神提出的残差网络,具体论文见此
ResNet v1
Deep Residual Learning for Image Recognition
https://arxiv.org/pdf/1512.03385.pdf
ResNet v2
Identity Mappings in Deep Residual Networks
https://arxiv.org/pdf/1603.05027.pdf
这一节课,我们只动手实现v1的一个精简版本(因为数据集cifar10的数据比较小)
import keras
from keras.layers import Dense, Conv2D, BatchNormalization, Activation
from keras.layers import AveragePooling2D, Input, Flatten
from keras.optimizers import Adam
from keras.regularizers import l2
from keras import backend as K
from keras.models import Model
from keras.datasets import cifar10
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras.callbacks import ReduceLROnPlateau
import numpy as np
import os
Using TensorFlow backend.
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 64s 0us/step
x_train = x_train/255
x_test = x_test/255
y_train = keras.utils.to_categorical(y_train,10)
y_test = keras.utils.to_categorical(y_test,10)
↓构建模型基本模块,ResNet Block
这里没有用Sequential模型,而是用了另外一种构建模型的方法,即函数式模型(Functional)
Sequential模型有一个缺陷,即网络只能一层一层的堆叠起来,无法处理分支网络的情况。比如ResNet或GoogleNet中的Inception模块。使用Functional模型,构建起模型来十分自由,可以组合成各种各样的网络,可以说Sequential模型是Functional模型的一个子集。
使用函数式模型很简单,直接在网络层模块后写一个括号,参数就是当前层的输入值,返回值就是当前层的输出值,比如:net = Conv2D(…)(inputs)
↓首先构建一个基本的block模块,就是上图的weight layer,这个模块包含了一个卷积层,一个BN层,一个激活层。可以看到上图下面那个layer没有激活层,所以函数内做了一个判断
BN层的作用是对输出参数做归一化,可以有效使网络更易训练。一般来说,加了BN层的网络,可以不必再用Dropout层。
同时这一次我们在卷积层中加入了L2正则化,目的是提升模型的泛化能力。
#ResNet Block
def resnet_block(inputs,num_filters=16,kernel_size=3,strides=
这篇关于Keras 入门课4 -- 使用ResNet识别cifar10数据集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!