深度卷积神经网络DCNN简介

1. 背景

        卷积神经网络CNN(Convolutional Neural Network,又称ConvNet)保留了空间信息,因此可以更好地用于图像分类。

        卷积操作基于仔细甄选的局部感受野,在多个特征平面共享权值;之后全连接层基于传统的多层感知机,使用softmax作为输出层。

        卷积网络的创新:保留空间信息、加入卷积、池化和特征平面

 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. 应用

一维卷积主要用于声音和文本数据在时间维度上的处理;

二维卷积(高*宽)主要用于图像数据的处理;其输出的二维数组可以看作输入在空间维度上某一级的表征,也叫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图像数据集

详细内容参考:

LeNet网络简介

3.3 VGG16网络与迁移学习

详细内容参考:

VGG网络与中间层特征提取

猜你喜欢

转载自blog.csdn.net/MusicDancing/article/details/130173874
今日推荐