本文分为CNN讲解和keras实现CNN(mnist数据集)两部分。
卷积神经网络(Convolutional Neural Networks / CNNs / ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。每个神经元都接收一些输入,并做一些点积计算,输出是每个分类的分数,普通神经网络里的一些计算技巧到这里依旧适用。
具有三维体积的神经元(3D volumes of neurons)
卷积神经网络利用输入是图片的特点,把神经元设计成三个维度 : width, height, depth(注意这个depth不是神经网络的深度,而是用来描述神经元的) 。比如输入的图片大小是 32 × 32 × 3 (rgb),那么输入神经元就也具有 32×32×3 的维度。下面是图解:
总的来说就是卷积层增大图片高度同时改变图片大小,但是在卷积的过程中会丢失一些信息,所以我们引入池化层。
也就是说,在卷积层不改变图片大小,在池化层改变图片大小。
import numpy as np
np.random.seed(1337)
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.optimizers import Adam
(X_train,y_train),(X_test,y_test)=mnist.load_data()
X_train=X_train.reshape(-1,1,28,28)
X_test=X_test.reshape(-1,1,28,28)
y_train=np_utils.to_categorical(y_train)
y_test=np_utils.to_categorical(y_test)
model=Sequential()
#Conv layer 1 output shape(32,28,28)
model.add(Convolution2D(
nb_filter=32,
nb_row=5,
nb_col=5,
border_mode='same', # padding method 如果卷积的方式选择为same,那么卷积操作的输入和输出尺寸会保持一致。如果选择valid,那卷积过后,尺寸会变小。
input_shape=(1, # channels
28,28)
))
model.add(Activation('relu'))
# Pooling layer 1 (max pooling) output shape (32,14,14)
model.add(MaxPooling2D(
pool_size=(2,2),
strides=(2,2), # 跳跃2取样
border_mode='same', # Padding method
))
# Conv layer 2 output shape (64,14,14)
model.add(Convolution2D(64,5,5,border_mode='same'))
model.add(Activation('relu'))
# Pooling layer2 (maxp ooling) output shapr (64,7,7)
model.add(MaxPooling2D(pool_size=(2,2),border_mode='same'))
# Fully connected layer 1 input shape(64,7,7)=(3136),output shape(1024)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
# Fully connected layer 2 to shape (10) for 10 classed
model.add(Dense(10))
model.add(Activation('softmax'))
adam=Adam(lr=1e-4)
model.compile(optimizer=adam,
loss="categorical_crossentropy",
metrics=['accuracy']
)
print("------------------------Training------------------------")
model.fit(X_train,y_train,nb_epoch=1,batch_size=32)
print("\n------------------------Testing------------------------")
loss,accuracy=model.evaluate(X_test,y_test)
print("\ntest loss:",loss)
print("\ntest accuracy",accuracy)
这次我们主要讲CNN(Convolutional Neural Networks)卷积神经网络在 keras 上的代码实现。 用到的数据集还是MNIST。不同的是这次用到的层比较多,导入的模块也相应增加了一些。
from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
首先是数据预处理和model的设置。 然后添加第一个卷积层,滤波器数量为32,大小是5*5,Padding方法是same即不改变数据的长度和宽带。 因为是第一层所以需要说明输入数据的 shape ,激励选择 relu 函数。代码如下
model.add(Convolution2D(
batch_input_shape=(64, 1, 28, 28),
filters=32,
kernel_size=5,
strides=1,
padding=‘same’, # Padding method
data_format=‘channels_first’,
))
model.add(Activation(‘relu’))
第一层 pooling(池化,下采样),分辨率长宽各降低一半,输出数据shape为(32,14,14)
model.add(MaxPooling2D(
pool_size=2,
strides=2,
padding=‘same’, # Padding method
data_format=‘channels_first’,
))
再添加第二卷积层和池化层
model.add(Convolution2D(64, 5, strides=1, padding=‘same’, data_format=‘channels_first’))
model.add(Activation(‘relu’))
model.add(MaxPooling2D(2, 2, ‘same’, data_format=‘channels_first’))
经过以上处理之后数据shape为(64,7,7),需要将数据抹平成一维,再添加全连接层1
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation(‘relu’))
添加全连接层2(即输出层)
model.add(Dense(10))
model.add(Activation(‘softmax’))
设置adam优化方法,loss函数, metrics方法来观察输出结果
model.compile(optimizer=adam,
loss=‘categorical_crossentropy’,
metrics=[‘accuracy’])