您的位置:首页 > 其它

Keras学习之三:用CNN实现cifar10图像分类模型

2017-07-29 21:32 621 查看

Keras学习之三:用CNN实现cifar10图像分类模型

1 卷积神经网络简介

卷积神经网络和全连接神经网络一样,都是由多个神经网络层连接而成。不同的是CNN一般是由多个卷积层,池化层交替连接起来,用于提取输入数据的高层特征,并缩小数据的维度。最后对提取出的特征进行神经网络分类形成最终的输出。更详细的卷积神经网络相关知识可参见第4节提供的链接。

2 Keras对CNN的支持

keras.layers包中实现了与CNN相关的层模型,分别实现在convolutional和pooling模块中。

2.1 convolutional模块

convolutional模块中实现了卷积层的层模型,用于数据的特征提取。

层名作用原型
Conv1D1维卷积层Conv1D(filters, kernel_size, strides=1, padding=’valid’)
Conv2D2维卷积层Conv2D(filters, kernel_size, strides=(1, 1), padding=’valid’,dilation_rate=(1, 1))
UpSampling1D1维上采样,将数据重复指定的次数UpSampling2D(size=2)
UpSampling2D2维上采样,将数据在2个维度上重复指定的次数UpSampling2D(size=(2, 2))
ZeroPadding2D边界填充0ZeroPadding2D(padding=(1, 1))
2D参数说明:

参数说明
filters卷积核的数目,也是处理后输出的深度
kernel_size过滤器的窗口大小
strides过滤器卷积的步长
padding补0策略,valid/same
activation激活函数
dilation_rate指定dilated convolution中的膨胀比例

2.2 pooling模块

pooling模块中实现池化层的的最大池化与平均池化的层模型,用于数据维度的缩减。

层名作用原型
MaxPooling1D对1维输入进行最大值池化过滤MaxPooling1D(pool_size=2, strides=None, padding=’valid’)
AveragePooling1D对1维输入进行平均池化过滤AveragePooling1D(pool_size=2, strides=None, padding=’valid’)
MaxPooling2D对2维输入进行最大值池化过滤MaxPooling2D(pool_size=(2, 2), strides=None, padding=’valid’, data_format=None)
AveragePooling2D对3维输入进行平均池化过滤AveragePooling2D(pool_size=(2, 2), strides=None, padding=’valid’, data_format=None)
GlobalMaxPooling1D对1维输入进行全局最大值池化过滤GlobalMaxPooling1D()
GlobalAveragePooling1D对1维输入进行全局平均值池化过滤GlobalAveragePooling1D()
GlobalMaxPooling2D对2维输入进行全局最大值池化过滤GlobalMaxPooling2D()
GlobalAveragePooling2D对2维输入进行全局平均值池化过滤GlobalAveragePooling2D()
2D参数说明

参数说明
pool_size过滤器的大小,通常取(2,2)或(3,3)
strides过滤器的移动步长,取2使得输出shape缩小一半
paddingvalid为1填充,same为0填充
data_format字符串,channels_first或channels_last之一

cifar10分类代码

下面的代码实现了一个下面结构的CNN模型,其结构为:卷积层->池化层->卷积层->池化层->全连结层->全连结层->Softmax层。

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

num_classes = 10
model_name = 'cifar10.h5'

# The data, shuffled and split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

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

# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()

model.add(Conv2D(32, (3, 3), padding='same', input_shape=x_train.shape[1:]))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())

model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(num_classes))
model.add(Activation('softmax'))

model.summary()

# initiate RMSprop optimizer
opt = keras.optimizers.rmsprop(lr=0.001, decay=1e-6)

# train the model using RMSprop
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

hist = model.fit(x_train, y_train, epochs=40, shuffle=True)
model.save(model_name)

# evaluate
loss, accuracy = model.evaluate(x_test, y_test)
print loss, accuracy


4 CNN学习资料

深入浅出Tensorflow之四:卷积神经网络

CNN浅析和历年ImageNet冠军模型解析

深度学习利器:TensorFlow与深度卷积神经网络
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: