卷积操作API
- 普通卷积
tf.nn.convlution(input, filter, padding, strides=None, dilation=None, name=None, data_format=None)
- 二维卷积
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
# input:[batch, in_height, in_width, in_channels]
# filter:[filter_height,filter_wideth,in_channels,out_channels]
# strides:[1,stride,stride,1]
# padding: 'SAME' or 'VALID' 'VALID'表示0填充。注意:'SAME'并不是表示输入输出尺寸大小一样,只是考虑边界,如果不够用0填充
- 单独对每个通道做卷积
tf.nn.depthwise_conv2d(input,filter,strides,padding,name=None)
- 单独对每个通道做完卷积后再用pointwise filter组合起来
tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter, strides,padding,name=None)
- 扩张卷积
tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
- 逆卷积
tf.nn.conv2d_transpose(value, filter, output_shape, strides, padding=SAME, data_format=NHWC, name=None)
- 一维卷积
tf.nn.conv1d(value, filters, stride, padding, use_cudnn_on_gpu=None, name=None)
- 三维卷积
tf.nn.conv3d(input, filter, strides, padding, name=None)
严格的来说,叫做cross-correlation运算,(卷积的话核要旋转180°)
conv2d
输入数据体尺寸:
W
1
×
H
1
×
D
1
W_1\times H_1\times D_1
W1×H1×D1
滤波器尺寸:
F
×
F
×
D
1
×
D
2
F\times F\times D_1\times D_2
F×F×D1×D2 有
D
2
D_2
D2个滤波器
步长为
S
S
S,填充为
P
P
P
则输出的的数据体尺寸:
W
2
×
H
2
×
D
2
W_2\times H_2\times D_2
W2×H2×D2
其中:
W
2
=
(
W
1
−
F
+
2
P
)
/
S
+
1
W_2=(W_1-F+2P)/S+1
W2=(W1−F+2P)/S+1
H
2
=
(
H
1
−
F
+
2
P
)
/
S
+
1
H_2=(H_1-F+2P)/S+1
H2=(H1−F+2P)/S+1
如果为零填充,即padding='VALID'
,则输出尺寸比输入尺寸小了
F
−
1
F-1
F−1圈
池化操作API
池化层也叫汇聚层,能够有效地减少网络中的参数,也能有效地控制过拟合。
- 平均池化
tf.nn.avg_pool(value, ksize, strides, padding, data_format=NHWC, name=None)
- 最大池化
tf.nn.max_pool(value, ksize, strides, padding, data_format=NHWC, name=None)
# valua: [batch, in_height, in_width, in_channels] feature map
# ksize: 池化窗口的大小 [1,height, width, 1]
# strides:[1,stride,stride,1]
# padding: 'SAME' or 'VALID' 一般都是'VALID'
# data_format: 'NHWC' or 'NCHW'(caffe), 必须和conv2d中一致
- 找每个最大值处的索引
tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax=None, name=None)
- 等等
计算
输入数据体尺寸:
W
1
×
H
1
×
D
1
W_1\times H_1\times D_1
W1×H1×D1
滤波器尺寸:
F
×
F
×
D
1
×
D
2
F\times F\times D_1\times D_2
F×F×D1×D2 有
D
2
D_2
D2个滤波器
步长为
S
S
S,很少有填充
则输出的的数据体尺寸:
W
2
×
H
2
×
D
2
W_2\times H_2\times D_2
W2×H2×D2
其中:
W
2
=
(
W
1
−
F
)
/
S
+
1
W_2=(W_1-F)/S+1
W2=(W1−F)/S+1
H
2
=
(
H
1
−
F
)
/
S
+
1
H_2=(H_1-F)/S+1
H2=(H1−F)/S+1
D
2
=
D
1
D_2=D_1
D2=D1
没有引入参数
池化层通常只有两种形式:
- 重叠池化(overlapping pooling): F=3, S=2
- 最常用的:F=2,S=2
再大的话,就会对网络有破坏性
实践证明,一般最大池化比平均池化要好
卷积核个数
下面在一个只包含一个卷积层和一个全连接层的网络上,改变卷积核的个数,看看网络性能的变化:
训练集上的损失:
验证集上的损失:
池化
conv+relu+(maxpool or avgpool)+linear_fc