@

CNN相关函数的用法及使用

  1. conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format=“NHWC”, name=None)

input:输入卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解);

filter:卷积核,要求也是一个张量,shape为[ filter_height, filter_weight, in_channel, out_channels],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量;

Stride:卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1;

Padding:string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑输出矩阵的大小:

宽度:
W = (输入图像宽度– filter宽度 + 全0填充的宽度) / 移动步幅 +1
高度:
H = (输入图像高度– filter高度 + 全0填充的宽度) / 移动步幅 +1

  1. Max_pool(value,ksize, strides,padding,name=None),最大值池化操作

说明:池化层不会改变三维矩阵的深度,但是可以缩小矩阵的大小。通过池化层,可以进一步的缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的。使用池化层既可以加快计算速度也可以防止过拟合。卷积层和池化层中的filter区别是卷积层的filter横跨整个深度而池化层的filter只影响一个深度上的节点。池化层的filter除了在长和宽两个维度移动外还需要在深度这个维度移动。

Value: 需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch,height, width, channels]这样的shape

Ksize: 池化窗口的大小,取一个四维向量,一般是[1,
height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

Strides: 和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1,stride,stride, 1]

Padding: 和卷积类似,可以取’VALID’ 或者’SAME’, "SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑;

  1. CNN网络中的dropout:
    dropout是在深度学习的训练过程中对于神经网络单元按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。可以防止过拟合提高效果。
    经过验证,dropout等于0.5时效果最好,是因为0.5的时候dropout随机生成的网络结构最多。dropout也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)。
    数据量小的时候,dropout效果不好,数据量大了,dropout效果好,使用dropout的缺点是训练时间是没有dropout网络的2-3倍。

这只是自己在使用时遇到的一些函数,后续还有RNN函数的总结,但是RNN真的是好难理解啊。。。