资源:
3D卷积神经网络相关博客:http://blog.csdn.net/lengxiaomo123/article/details/68926778
keras文档关于3D卷积层的介绍:http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/#conv3d
3D卷积层可以理解为对有一系列时序性的图片进行卷积的操作,也即2D是在平面上卷积,3D层添加了时序作为另一维度实现了空间上的卷积,从而能够对具有时序性的一组图片进行卷积操作,网络结构例子如下图:
官方文档介绍conv3D层输入如下:
可以看出一般的conv2D的输入是长*宽*通道数,而这里的输入变成了序列长度*长*宽*通道数(这个顺序的话跟keras的后端有关,Theno作为后端通道数是放在最前的,Tensorflow作为后端通道数是放在最后的)。
网络搭建:(源代码来源于github:)
这里采用的也是序贯模型,只搭建了一层conv3D,然后进行最大池化,Dropout、平展、全连接、输出。模型搭建比较简单,需要注意的地方是第一层的输入部分,要让input_shape=()的参数顺序和自己所使用的后端匹配,这里我是将图片都转为灰度并且使用tensorflow为后端,所以最后的一个参数是1,前面三个依次是序列长度*长*宽。最后模型编译的loss采用categorcial_crossentropy,优化器使用RMSprop(图片上写错了),评估指标使用mse和accuracy。
数据处理:
根据之前的介绍我们是要将一组具有时序性的图片作为网络的输入的,也就是序列*图片长*图片宽*通道数(3或者1),数据部分有三个类,每类准备了10个视频。
这里使用VideoCapture类来进行处理视频,并将每一个视频按秒截取图片,所截取的图片不保存直接转为矩阵放入X_tr里,最开始我们设置了图片的大小16*16以及序列长度5
也就是每个视频我们提取五张连续的图片放在X_tr里。
网络参数的设置:
设置网络的超参数以及标签的设置(共30个视频,每10个视频为1类)。标签设置完毕后需使用np_utils.to_categorical将其转为one-hot形式,最后分割训练集和验证集并设置训练轮数即可。
网络结构:
训练结果:
这里的训练结果并不是很理想,最好的val准确率也只有0.667,可能与图片大小,网络结构等有很大关系吧,待后期再修正了...