本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.卷积神经网络
卷积神经网络的相关介绍请戳👉:【深度学习基础】第二十八课:卷积神经网络基础。
2.使用tensorflow实现CNN
先介绍可能会用到的API。
2.1.tf.nn.conv2d()
tf.nn.conv2d()用于构建网络的卷积层,这里的2d指的是二维卷积核,也是最为常用的。API详细参数见下:
1
2
3
4
5
6
7
8
9
10
def conv2d(
input,
filter=None,
strides=None,
padding=None,
use_cudnn_on_gpu=True,
data_format="NHWC",
dilations=[1, 1, 1, 1],
name=None,
filters=None)
部分常用参数解释:
input:输入[input_batch_size,input_height,input_width,input_channel]。filter:卷积核[filter_height,filter_width,filter_channel,filter_number]。通常情况下,filter_channel=input_channel。stride:步长[stride_batch_size, stride_height, stride_width, stride_channel],分别指在input四个维度上的步长。通常情况下,stride_batch_size = stride_channel =1且stride_height=stride_width。padding提供SAME和VALID两种池化方式。
2.1.1.padding
这里额外多说一点关于padding参数的注意事项。
参数padding除了用字符串SAME或者VALID指明其方式外,还可以用具体的数值设置其具体补充的行数(或列数)。例如在data_format="NHWC"格式下,padding可以通过如下方式赋值:
1
padding =[[0, 0], [pad_top, pad_bottom], [pad_left, pad_right], [0, 0]]
即NHWC的每个维度两边都需要进行padding。而维度N和C,通常不进行padding。
然后我们再来说说SAME和VALID有什么区别。在【深度学习基础】第二十八课:卷积神经网络基础一文中,我们初步了解了这两种方式的作用机制。那么今天我们来进一步分析下,SAME和VALID输出结果的维度该怎么确定。
SAME输出的维度:
VALID输出的维度:
上述式子中,$o$为输出的height(或width),$i$为输入的height(或width),$s$为步长,$k$为卷积核的大小(假设filter_height=filter_width=k)。
例如有一个$2\times 3$的平面,用$2\times 2$并且步长为2的窗口对其进行pooling操作:
- 使用
SAME的padding方式,得到$1\times 2$的平面。 - 使用
VALID的padding方式,得到$1\times 1$的平面。
2.2.tf.nn.max_pool()
tf.nn.max_pool()用来构建网络的池化层(max pooling)。API详细参数见下:
1
2
3
4
5
6
7
8
def max_pool(
value,
ksize,
strides,
padding,
data_format="NHWC",
name=None,
input=None)
其中,参数value是一个四维的输入,ksize为用于池化操作的核的维度,通常为[1,height,width,1]。其他参数和tf.nn.conv2d()中的一样。