卷积神经网络,在深度学习领域中,目前主要由深度卷积神经网络(DNN)和递归神经网络(RNN),在图像识别,语音识别,视频识别领域取得了巨大的成功。与此相对应的,在深度学习领域,最热门的还是AutoEncoder、RBM、DBN等产生式网络结构。

卷积神经网络(CNN),这是深度学习算法应用最成功的领域之一,卷积神经网络包括一维、二维、三维卷积神经网络。一维神经网络主要用于序列类的数据处理,二维卷积神经网络应用于图像类文本的识别,三维卷积神经网络用于医学图像以及视频类数据识别。

典型的CNN有三个部分组成:

卷积层,池化层,全连接层

简单来描述的话:卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层用来输出。

卷积-提取特征

卷积层的提取过程如下,用一个卷积核扫完整张图片:

 这个过程我们可以理解为使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块和此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了六个卷积核,可以理解:我们认为这个图像上有六种底层纹理模式,也就是用六种基础模式就可以描绘出一幅图像,以下就是25种不同卷积核示例。

 总结:卷积层通过卷积核的过滤提取出图片中局部的特征。

池化层(下采样)-数据降维,避免过拟合

池化层简单来说就是采样,他可以大大降低数据的维度,其过程如下:

 上图中,我们可以看到,原始图片是20*20的,我们对其进行下采样,采样窗口为10*10,最终将其下采样为一个2*2的特征图。之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),为了降低数据维度,就进行下采样。

总结:池化层相比卷积层可以更有效降低数据维度,不仅可以减少运算量,还可以有效避免过拟合。

连接层-输出结果

这个部分就是最后一步了,经过卷积层和池化层处理过得数据输入到全连接层,得到最终结果。

典型的CNN并非上面三层结构,而是多层结构,例如LeNet-5的结构就如下图所示:

卷积层-池化层-卷积层-池化层-卷积层-全连接层

实验环境配置:

IDE :Vscode 2019

库:TensorFlow、keras、numpy、pandas、matplotlib

实验过程:

IMDB数据集是Keras内部集成的,初次导入后,就可以直接用了。

此外,还可以选用其他的数据集进行训练,数据集网站地址如下

常用数据集 Datasets - Keras 中文文档

IMDB数据集包含来自于互联网的50000条严重两级分化的评论,该数据被分为用于训练的25000条评论和用于测试的25000条评论,训练集和测试集都包含50%的正面评价和50%的负面评价。该数据集已经经过预处理:评论(单词序列)已经被转换为整数序列,其中每个整数代表字典中的某个单词。

(1)引入实验中所涉及的包

import numpy  # 处理多维数组和矩阵
from tensorflow import keras  # 引入keras模型,可以从中获取已经过预处理的数据
from keras.models import Sequential # 用于建立序列模型
from keras.layers import Dense, Conv1D  # 引入一维卷积和dense层
from keras.layers import Flatten  # 用于卷积层到全连接层的过渡
from keras.layers.convolutional import Convolution1D  
# 导入池化层,主要用于过滤一维输入的相邻元素
from keras.layers.convolutional import MaxPooling1D   
# 导入1D输入的最大池化层
from keras.layers.embeddings import Embedding  # 导入dropout层类
from keras.preprocessing import sequence  # 对文本与序列预处理
import os     # 导入os模块

(2)进行初始设定,选用CPU,并导入IMDB数据集

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"  
# 选择使用cpu或gpu -1为使用cpu
imdb = keras.datasets.imdb  # 导入IMDB数据集
seed = 7   # 设置随机数种子
numpy.random.seed(seed)  # 对数据进行随机采样
# 加载数据集,但只保留出现频次在前5000位的词,其余为零
top_words = 5000

(3)对IMDB数据集中的数据进行提取

sequence.pad_sequences的用法见:python函数——序列预处理pad_sequences()序列填充_Congying-Wang的博客-CSDN博客_pad_sequences

imdb.load_data的用法见 

ntensorflow.keras.datasets 中关于imdb.load_data的使用说明_风华明远的博客-CSDN博客_imdb.load_data

# 划分数据集,训练集:测试集=2;1
test_split = 0.33
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)

# 截长补短让每篇文本长度为500个单词
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)

(4)构建神经网络模型

sequential容器的用法见

hKeras中Sequential模型及方法详细总结_AI算法工程师YC的博客-CSDN博客z

掘金

Conv1D使用方法

神经网络-Conv1D和Conv2D实现 - 知乎

maxPooling1D使用方法

Keras学习笔记(四):MaxPooling1D和GlobalMaxPooling1D的区别_林夕-CSDN博客_maxpooling1d

 Flattern函数用法

keras中Flatten()函数的用法_鸡啄米的时光机的博客-CSDN博客

model = Sequential()
# 加入嵌入层
model.add(Embedding(top_words, 32, input_length=max_words))
# 嵌入层输出维度为5000,输入维度为32,1篇文本由100个词语构成
# 32个卷积核,卷积层输出的维度为6
# 卷积核宽度为3个词语,一般选择2~3个词语
# 卷积运算后仍然保持句子长度不变
# 只保留正值特征
model.add(Conv1D(activation="relu", filters=32, kernel_size=3, padding="same"))
# 池化窗口为2个单词,strides(步长)为2,padding='valid',池化核移动过程与卷积核相同
model.add(MaxPooling1D(pool_size=2))
# 加入平坦层,以使得可以输出到后边输出层
model.add(Flatten())

(5)输出层

Dense用法见

 深度学习Keras框架笔记之激活函数详解 - 圆柱模板 - 博客园

选用目标损失函数见,现模型目标函数为binary_crossentropy

keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy']) - 懵懂的菜鸟 - 博客园

Sequential.evaluate(),用来评估模型准确率,返回一个值或者列表,内容为误差值和评估标准值

keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy']) - 懵懂的菜鸟 - 博客园 keras各个函数的功能见

keras系列︱Sequential与Model模型、keras基本结构功能(一)_素质云笔记/Recorder...-CSDN博客_sequential模型

# 添加激活函数修正线性单元
model.add(Dense(250, activation='relu'))
# 添加sigmoid激活函数
model.add(Dense(1, activation='sigmoid'))
# 设置模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 打印模型摘要
print(model.summary())
# 训练
# 每一批次训练128项数据,执行2个训练周期
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=128, verbose=1)
scores = model.evaluate(X_test, y_test, verbose=0)
# 分类准确度显示评估
print("Accuracy: %.2f%%" % (scores[1] * 100))

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐