Time:2019-06-12
conv2d()用于实现卷积函数的计算,四个参数需要指定,input,filter,strides and padding。
官网给的定义
input:输出的参数,是一个4维tensor。shape是[batch, in_height, in_width, in_channels],其中batch表示处理的批数,比如一次处理50批数据,in_height和in_weight分别是张量的高度和宽度,in_channelss是通道数量(比如有3个通道,分别对应R,G,B)
filter:卷积核,4维张量。shape是[filter_height, filter_width, in_channels, out_channels]。filter_height和filter_width分别对应卷积神经元的高度和宽度,in_channels代表图像通道数(这里和input的in_channels是相等的)。out_channels代表卷积核的数目(比如用了3次卷积核计算,则有三个out_channels)
strides: 卷积时的步长,是一个长度为4的一维张量。官网给的解释是默认为“NHWC”,即shape是[batch, height, width, channels], 分别代表各个方向的卷积步长。一般batch和channel赋值1,即strides=[1, height, width,1 ]。(个人认为因为是按批处理,以及按照通道挨个处理,所以是1,height和width随意,一般情况下纵向和横向的步长一致)
padding:代表是否外圈补0。padding赋值一个字符串,“SAME”或“VALID”, “SAME” 代表补0。补0规则是(亲测): 假设filter的宽度是F, input的宽度是W, 如果F-1是偶数, 则上下左右各补(F-1)/2个0, 如果是奇数,则上和左补(F-1)/2个0, 下和右补(F-1)/2+1个0, 如下图:
补零规则
对于tf.nn.conv2d(), 无论filter的size是多大,只要步长为1,最终特征图的size和input的size相同,如果步长为n,补0后input的宽度为W, 则特征图宽度= (W-n)/n+1
测试:
假设有两批数据,大小是3*3,通道数为2。做4次卷积,每个卷积核的大小是3*3,通道数是2。
测试代码
input:
输入张量
第一批数据的有两个通道的矩阵,实际计算格式如下图:
第一批数据
filter1
卷积核,每一列数据代表一个卷积核
result is
每列数据代表一个输出
列入第一批数据与第一个卷积核计算得到一个输出,数据格式需要转换一下
计算的时候四舍五入,最终output和result不完全一样,但误差很小









网友评论