- 卷积神经网络
在图像识别中,像素个数过多。
减少训练参数数量的办法:提取出图像中的关键信息(轮廓),再建立mlp模型进行训练 - 图像卷积运算(convolution)
对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵。
作用: 快速定位图像中某些边缘特征
A与B的卷积表示为:A*B或convolution(A,B)
以下是卷积运算中寻找竖向轮廓跟横向轮廓
RGB图像的卷积:对R\G\B三个通道分别求卷积再相加
nxn的像素矩阵与f x f 的过滤矩阵得到的结果是(n-f+1)x(n-f+1)
-
池化层实现维度缩减
池化:按照一个固定规则对图像矩阵进行处理,将其转换为更低维度的矩阵(即保留核心信息的情况下,实现维度缩减)1.最大法池化(Max-pooling):
2.平均法池化(Avg-pooling):
- 卷积神经网络
把卷积、池化、mlp先后连接在一起,组成卷积神经网络
卷积神经网络的两大特点:
1、参数共享(parameter sharing):同一个特征过滤器可用于整张图片
2、稀疏连接(sparsity of connections):生成的特征图每个节点只与原图片中特定节点连接
卷积运算导致的两个问题:1.图像被压缩,造成信息丢失;2.边缘信息使用少,容易被忽略
图像填充(padding):通过在图像各边增加像素,使其在进行卷积运算后维持原图大小(在图形矩阵与过滤器矩阵相乘的过程中,矩阵边缘的数值被使用的次数要少于中间的数值)
通过padding增加像素的数量,由过滤器尺寸与stride(步长)决定
VGG-16:
- 经典的CNN模型用于新场景:
1.使用经典的CNN模型结构对图像进行预处理,再建立MLP模型
2.参考经典的CNN结构搭建新模型
e.g.
此处去除了经典模型的全连接层,改变模型的输出类型
- 实战一:建立CNN实现猫狗识别(核心代码)
#图片加载
from keras.preprocessing.image import ImageDataGenerator
#图像增强/预处理配置(数值归一化、缩放、旋转、平移等)
train_datagen = ImageDataGenerator(rescale=1./255) //rgb的最大值为255
#加载图像:
training_set = train_datagen.flow_from_directory('./Dataset/training_set',target_size=(50,50),batch_size=32,class_mode='binary')
//target_size:图像自动转换的尺寸;batch_size=32:每次训练选择的图片数量;class_mode='binary':使用的是二分类
'''
训练与预测:
'''
#配置模型
model.complie(optimizer='adam',loss = 'binary_crossentropy',metrics=['accuracy'])
#查看模型结构
model.summary()
#训练模型
model.fit_generator(training_set,epochs=25)
#计算预测准确率
model.evaluate_generator(training_set)
- 实战二:基于VGG16、结合mlp实现猫狗识别:(核心代码)
使用VGG16的结构提取图像特征,再根据特征建立mlp模型,实现猫狗图像识别、训练/测试数据:dataset\data_vgg:
对数据进行分离、计算测试数据预测准确率
从网站下载猫/狗图片,对其进行预测
备注:mlp模型只有一个隐藏层(10个神经元)
图片加载:
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.application.vgg16 import preprocessing_input
x = np.expand_dims(img,axis=0)
#把图片矩阵转化为可用于VGG16输入的矩阵
x = preprocess_input(x)
#载入VGG16结构(去除全连接层)
from keras.application.vgg16 import VGG16
model_vgg = VGG16(weights='imagenet',include_top=False)
#特征提取
features = model_vgg.predict(X)
建立mlp模型:
#建立一个Sequential顺序模型并添加各层
from keras.models import Sequential
model = Sequential()
from keras.layers import Dense
model.add(Dense(units=10,acitvation='relu',input_dim=25088))
model.add(Dense(units=1,activation='sigmoid'))
model.summary()
#通过.compile()配置模型求解过程参数
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
#训练模型
model.fit(X_train,y_train,epochs=50)