深度学习之卷积神经网络
目的:提取出图像中的关键信息(轮廓),再建立mlp模型进行训练
图像卷积运算(convolution)
对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵
作用:将图片与轮廓滤波器进行卷积运算,可快速定位固定轮廓特征的位置
A与B的卷积通常表示为:A*B或convolution(A,B)
常用轮廓过滤器
RGB图像的卷积:对RGB三个通道分别求卷积再相加
卷积运算导致的两个问题:
图像被压缩,造成信息丢失
边缘信息使用少,容易被忽略
解决方式:
图像填充(padding)
通过在图像各边增加像素,使其在进行卷积运算后维持原图大小
通过padding增加像素的数量,由过滤器尺寸与stride决定
池化实现维度缩减
池化:按照一个固定规则对图像矩阵进行处理,将其转化为更低维度的矩阵,目的是为了保留核心信息的情况下实现维度缩减,有最大池化法,平均池化法
卷积神经网络cnn
把卷积、池化、mlp先后连接在一起,组成卷积神经网络,其中常用的还有Relu激活函数
卷积神经网络两大特点
- 参数共享(parameter sharing):同一个特征过滤器可用于整张图片
- 稀疏连接(sparsity of connections):生成的特征图片每个节点只与原图片中特定节点连接
使用
参考经典的CNN结构搭建新模型
使用经典的CNN模型结构对图像预处理,再建立MLP模型(加载经典的cnn模型,剥除其FC层,对图像进行预处理,把预处理完成的数据作为输入,分类结果为输出,建立一个mlp模型,进行模型训练)
经典的CNN模型:
-
LeNet-5 http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
-
AlexNet 学术界开始相信深度学习技术,再计算机视觉应用中可以得到很不错的结果
-
VGG -16 https://arxiv.org/pdf/1409.1556.pdf
LeNet-5特点: -
随着网络越深,图像的高度和宽度在缩小,通道数在增加
-
卷积与池化先后成对使用
AlexNet特点: -
使用与识别较为复杂的彩色图,可识别1000种类别
-
结构比LeNet更为复杂,使用Relu作为激活函数
VGG - 16特点: -
所有卷积层fliter宽和高都是3,步长为1,padding都使用same convolution;
-
所有池化层的filter宽和高都是2,步长都是2;
-
相比alexnet, 有更多的filter用于提取轮廓信息,具有更高精准性
源代码讲解
# 图片加载
# https://keras.io/preprocessing/image/
from keras.preprocessing.image import ImageDataGenerator
# 图像增强/预处理配置(数值归一化、缩放、旋转、平移等)
train_datagen = ImageDataGenerator(rescale = 1./255)
#加载图像
training_set = train_datagen.flow_from_directory('./train',target_size = (50,50),batch_size = 32,class_mode = 'binary')
# 建立cnn模型:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
model = Sequential()
# 卷积层
model.add(conv2D(32, (3, 3), input_shape = (50,50,3), activation = 'relu'))
# 池化层
model.add(MaxPooling2D(pool_size =(2,2)))
# 第二个卷积层、池化层
model.add(Conv2D(32, (3, 3), activation ='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
# Flattening层
model.add(Flatten())
# 全连接层
model.add(Dense(units = 128, activation ='relu'))
model.add(Dense(units = 1, activation = 'sigmoid'))
# 配置模型
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# 查看模型结构
model.summary()
# 训练模型
model.fit_generator(training_set, epochs =25)
# 计算预测准确率
model.evaluate_generator(training_set)
# 基于VGG16的加载方式
# 图片加载
from keras.preprocessing.image import img_to_array, load_img
img_path = '1.jpg'
img = load_img(img_path, target_size=(224,224))
img = img_to_array(img)
#图片预处理
from keras.applications.vgg16 import preprocess_input
x = np.expand_dims(img,axis=0)
#把图片矩阵转化为可用于VGG16输入的矩阵
x = preprocess_input(x)
#载入VGG16结构(去除全连接层)
from keras.applications.vgg16 import VGG16
model_vgg = VGG16(weights='imagenet', include_top =False)
#特征提取
feature = model_vgg.predict(x)