卷积原理
卷积神经网络是受生物学上感受野的机制而提出。感受野(Receptive Field)
主要是指听觉、视觉等神经系统中一些神经元的特性,即神经元只接受其所支
配的刺激区域内的信号。在视觉神经系统中,视觉皮层中的神经细胞的输出依
赖于视网膜上的光感受器。视网膜上的光感受器受刺激兴奋时,将神经冲动信
号传到视觉皮层,但不是所有视觉皮层中的神经元都会接受这些信号。一个神
经元的感受野是指视网膜上的特定区域,只有这个区域内的刺激才能够激活该
神经元。
目前的卷积神经网络一般是由卷积层、汇聚层和全连接层交叉堆叠而成的
前馈神经网络,使用反向传播算法进行训练。卷积神经网络有三个结构上的特性
局部连接,权重共享以及汇聚这些特性使得卷积神经网络具有一定程度上
的平移、缩放和旋转不变性。和前馈神经网络相比,卷积神经网络的参数更少。
**卷积过程参考:https://zhuanlan.zhihu.com/p/49184702
基本概念:
卷积核(convolutional kernel):可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸(一般是奇数x奇数)。
卷积核的个数就对应输出的通道数(channels),这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数(一般理解为,卷积核的权值共享只在每个单独通道上有效,至于通道与通道间的对应的卷积核是独立不共享的,所以这里是192x128)。
** 池化(pooling):卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是global)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。
简单的说:
池化:把很多数据用最大值或者平均值代替。目的是降低数据量。
卷积:把数据通过一个卷积核变化成特征,便于后面的分离。计算方式与信号系统中的相同。
卷积
一维卷积
一维卷积就是在单个维度进行卷积操作,具体的如果输入是(7,7,4)(长,宽,通道),如果 kernel_size=4那么卷积核大小维474,卷积核与数据按位相加,并且只在axis=0维度进行,那么输出为41,如果fillter=N,那么输出就为(41*N)
自然语言处理中,我们假设一个序列是600个单词,每个单词的词向量是300维,那么一个序列输入到网络中就是(600,300),当我使用Conv1D进行卷积的时候,实际上就完成了直接在序列上的卷积,卷积的时候实际是以(3,300)进行卷积,又因为每一行都是一个词向量,因此使用Conv1D(kernel_size=3)也就相当于使用神经网络进行了n_gram=3的特征提取了。这也是为什么使用卷积神经网络处理文本会非常快速有效的内涵。
二维卷积
在两个维度进行卷积操作,常用于图像处理https://www.cnblogs.com/hejunlin1992/p/7624807.html
卷积核的步长
就是每卷积一次在不同方向走的步数
padding
padding的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0,‘SAME’ 为补零,‘VALID’ 则不补,其原因是因为在这些操作过程中过滤器可能不能将某个方向上的数据刚好处理完,如下所示:
padding = “SAME”输入和输出大小关系如下:
输出大小等于输入大小除以步长向上取整,s是步长大小;
padding = “VALID”输入和输出大小关系如下:
池化
Pooling 对于输入的 Feature Map,选择某种方式对其进行压缩。如下图,表示的就是对 Feature Map 2 \times 2 邻域内的值,选择最大值输出到下一层,这叫做 Max Pooling。于是一个 2N \times 2N 的 Feature Map 被压缩到了 N \times N
Pooling 的意义,主要有两点:其中一个显而易见,就是减少参数。通过对 Feature Map 降维,有效减少后续层需要的参数另一个则是 Translation Invariance。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就使网络的鲁棒性增强了,有一定抗扰动的作用
参考:https://www.zhihu.com/search?type=content&q=cnn 池化
textcnn
原理介绍:https://www.cnblogs.com/bymo/p/9675654.html
其实我认为就相当于多窗口的n-gram提取特征,这是1维卷积可以达到的效果。
代码实践
from keras import Input, Model
from keras.layers import Embedding, Conv1D, MaxPool1D, concatenate, Flatten, Dense
class Textcnn():
def __init__(self,max_sequence_length,max_token_num,embedding_dim,output_dim,embedding_matrix=None):
self.max_sequence_length=max_sequence_length #输入序列的长度,一句话的长度
self.max_token_num=max_token_num #词汇取值的个数
self.embedding_dim=embedding_dim #词向量的维度
self.output_dim=output_dim #y输出的维度
self.embedding_matrix=embedding_matrix #embedding 矩阵
self.model=self.bulid_model()
def bulid_model(self):
input=Input(shape=(self.max_sequence_length,))
if self.embedding_matrix is None:
emb=Embedding(input_dim=self.max_token_num,output_dim=self.embedding_dim,
input_length=self.max_sequence_length)(input)
else:
emb=Embedding(input_dim=self.max_token_num,output_dim=self.embedding_dim,
input_length=self.max_sequence_length,weights=[self.embedding_matrix],trainable=True)(input)
pool_out=[]
kernel_sizes=[2,3,4]
for kernel_size in kernel_sizes:
c=Conv1D(filters=2,kernel_size=kernel_size,strides=1)(emb)
p=MaxPool1D(pool_size=int(c.shape[1]))(c)
pool_out.append(p)
pool_out=concatenate([p for p in pool_out])
flatten=Flatten()(pool_out)
y=Dense(self.output_dim,activation='softmax')(flatten)
model = Model([input], outputs=[y])
model.summary()
return model
def train(self,train_x,train_y,batch_size=64,n_epochs=5,save_path='textcnn.h5'):
self.model.fit(train_x,train_y,batch_size=batch_size,epochs=n_epochs,validation_split=0.2)
self.model.save(save_path)
def predict(self,test_x,model_path='textcnn.h5'):
model=self.model
model.load_weights(model_path)
preds=model.predict(test_x)
return preds
textcnn=Textcnn(100,5000,200,2,None)