卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”
理解“卷积”参考博客《最容易理解的对卷积(convolution)的解释》
在神经网络模型中常见的二维卷积操作如下:
1x1+0x0+0x1+1x0+1x1+0x0+1x1+1x0+1x1 = 4
故神经网络中卷积相当于将滤子中的元素与原始输入对应位置的元素进行元素相乘再加总的操作。而一个滤子可以通过某种特定的数字排列,从而突出某种特征模式,滤出特定的特征,凸显出图片中某些特征的输出。
如何在keras中使用自己定制的滤子呢?
可以可以通过定制kernel, 输入给定的矩阵实现
def my_init(shape,dtype=None):
new_mat = np.zeros((shape[0],shape[1],3,3))
for i in range(shape[0]):
for j in range(shape[1]):
new_mat[:,:,i,j] = filter_mat
return np.array(new_mat,dtype=dtype)
model = Sequential()
model.add(Covn2(depth,
kernel_size=kernel_size,
input_size=input_size,
padding='same',
activation='linear',
data_format='channels_last',
kernel_initializer=my_init,
name='Conv'))
model.add(Dense(1,activation='linear'))
model.compile(loss='mse',optimizer='sgd')
model.summary()
inX = model.input
outputs = [layes.output for layer in model.layers if layer.name='Conv']
functions = [K.function([inX],[out]) for out in outputs]
layer_outs = [func([img_data.reshape(1,raw,col,depth)]) for func in functions]
activationLayer = layer_outs[0][0]
具体可参考Keras中文文档《编写你自己的 Keras 层》
Flatten / GlobalMaxPooling
函数。实际中把一句话可以看作是以一个单词索引下表表示的列表,因为索引没有重要的意义,因此当把每个单词都映射到致密空间后(即通过嵌入层生成词向量),我们就可以使用卷积网络了。
二维卷积可以在更多的单词的嵌入层维度上进行卷积操作。比如在相邻的两个词一段的局部词向量之间进行卷积,但卷积结果的一个多维的数据,因此需要用reshape
调整维度后,再进行后续的池化等操作。
二维卷积网络的主要差异在于:
注意:
Conv1D:输入输出都是3D
Conv2D: 输入输出都是4D
输入: (样本, 行, 列, 频道)
输出: (样本, 新行数, 新列数,滤子数)
后续持续更新……
原创不易,如果觉得不错,点个赞吧!
学习参考:
1.卷积神经网络-百度百科
2.微专业《深度学习工程师(实战)》