1. 背景
卷积神经网络CNN(Convolutional Neural Network,又称ConvNet)保留了空间信息,因此可以更好地用于图像分类。
卷积操作基于仔细甄选的局部感受野,在多个特征平面共享权值;之后全连接层基于传统的多层感知机,使用softmax作为输出层。
卷积网络的创新:保留空间信息、加入卷积、池化和特征平面。
CNN的共同之处是: 先以由卷积层构成的模块充分抽取空间特征,再以由全连接层构成的模块来输出分类结果。
残差网络
残差块通过跨层的数据通道从而能够训练出有效的深度NN;
2. 网络组成
2.1 局部感受野
卷积:把相邻输入神经元的子矩阵与下一层的单个隐藏神经元连接,这个隐藏的单个神经元就代表一个局部感受野。
卷积层可通过重复使用卷积核有效地表征局部空间。在DL中,核数组都是学习出来的。可以设计卷积核来检测图像中的边缘。卷积层块的基本单位是卷积层后接最大池化层: 卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。
CNN有多个叠加在一起的滤波器,用来独立识别图像不同位置的特定视觉特征,这些特征在最初的网络层中非常简单,并随着网络层次的加深变得越来越复杂。
(1)padding='same': 表示保留边界处的卷积结果,输入边界填充为0,其输出与输入大小相同;
(2)padding='vaild': 表示只对输入和滤波器完全叠加的部分做卷积计算,其输出小于输入。
2.2 共享权重和偏差
pass
2.3 池化
所有的池化操作都是对一个给定区域进行汇总运算。
汇总特征平面的输出(把这些子矩阵聚合成单个的输出值),进而描述相关联的物理区域的意义。
池化层的一个主要作用是缓解卷积层对位置的过度敏感性。
2.3.1 最大池化
pass
2.3.2 平均池化
pass
3. 应用
一维卷积主要用于声音和文本数据在时间维度上的处理;
1X1卷积层被当作保持高和宽维度形状不变的全连接层使用,常被用来调整网络层之间的通道数,并控制模型复杂度。
1X1卷积(的主要计算发生在通道维上)失去了卷积层可以识别高和宽维度上相邻元素构成的模式的功能(检测边缘)。
二维卷积(高*宽)主要用于图像数据的处理;其输出的二维数组可以看作输入在空间维度上某一级的表征,也叫feature map。
三维卷积(高*宽*时间)主要用于视频数据的处理;
3.1 LeNet网络预测minist数据集
特点:让较低的网络层交替进行卷积和最大池化运算,对简单几何变换和扭转具有很好的鲁棒性。
代码实现:
1. 模型定义
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.layers import Convolution2D
from keras.layers.core import Activation, Flatten, Dense
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import Adam
import numpy as np
import matplotlib.pyplot as plt
class LeNet:
@staticmethod
def build(input_shape, classes):
model = Sequential()
model.add(Convolution2D(20, kernel_size=5, padding='same', input_shape=input_shape))
# model.add(Conv2D(20, kernel_size=5, padding='same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(500))
model.add(Activation('relu'))
model.add(Dense(classes))
model.add(Activation('softmax'))
return model
2. 模型训练及评估
def model_train(X_train, y_train):
OPTIMIZER = Adam()
model = LeNet.build(input_shape=INPUT_SHAPE, classes=NB_CLASSES)
model.compile(loss='categorical_crossentropy', optimizer=OPTIMIZER, metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=NB_EPOCH, verbose=1, validation_split=VALIDATION_SPLIT)
# plot_picture(history)
return model
def model_evaluate(model, X_test, y_test):
score = model.evaluate(X_test, y_test, verbose=1)
print('Test score: ', score[0])
print('Test acc: ', score[1])
3. 数据加载及预处理
def load_and_proc_data():
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
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)
return X_train, X_test, y_train, y_test
4. 主函数
NB_EPOCH = 20
BATCH_SIZE = 128
VALIDATION_SPLIT = 0.2
IMG_ROWS, IMG_COLS = 28, 28
INPUT_SHAPE = (IMG_ROWS, IMG_COLS, 1) # 单通道
NB_CLASSES = 10
if __name__ == '__main__':
X_train, X_test, y_train, y_test = load_and_proc_data()
model = model_train(X_train, y_train)
model_evaluate(model, X_test, y_test)
3.2 LeNet网络预测CIFAR-10图像数据集
详细内容参考:
3.3 VGG16网络与迁移学习
详细内容参考: