keras学习笔记(1)CNN网络

cifar10_cnn.py解析

数据载入

数据的载入可以使用cifar10.load_data()这个函数完成,第一次运行时会自动下载cifar10数据,并返回训练集(5W)和测试集(1W)

from __future__ import print_function
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils

batch_size = 32
nb_classes = 10
nb_epoch = 200
data_augmentation = True

img_rows, img_cols = 32, 32
img_channels = 3

(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

上诉代码中的np_utils.to_categorical(y_train, nb_classes)可以将类别转化为one-hot编码,这里的nb_classes为10。用astype()函数可以将数据转化为float32类型。X_train /= 255将训练数据归一化到0~1(也可以做一下去均值)。

网络模型构建

这里选用最简单的Sequential模型,也可以选用Model范型来构造更为复杂的网络。

model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
  • 卷积层1:32个3×3的卷积核,由于输入层为卷积层,所以要提供卷积层的输入[3,32,32](当卷积层作为中间层时,Convolution2D可以推断出输入的shape),不需要提供batch_size,border_mode='same'表示卷积操作不改变图像大小(周围像素用0填充)
  • 激活层2:激活函数为relu,可以通过model.add(Convolution2D(64,3,3, border_mode='same',Activation('relu'))合并到卷积层1中
  • 池化层3,池化大小是2x2,方式为最大值池化。也就是对输入特征的每个2x2大小的窗,选取其中最大的一个值作为输出。池化的目的是降低信息冗余。
  • drop层4:用于随机断开一些连接

你可能感兴趣的:(机器学习)