CNN神经网络之卷积操作
2019-07-19 17:36
1676 查看
在看这两个函数之前,我们需要先了解一维卷积(conv1d)和二维卷积(conv2d),二维卷积是将一个特征图在width和height两个方向进行滑动窗口操作,对应位置进行相乘求和;而一维卷积则只是在width或者height方向上进行滑动窗口并相乘求和。
一维卷积:tf.layers.conv1d()
tf.layers.conv1d( inputs, filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=1, activation=None, use_bias=True, kernel_initializer=None, bias_initializer=tf.zeros_initializer(), kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None, reuse=None )
参数:[1]
- inputs:张量数据输入,一般是[batch, width, length]
- filters:整数,输出空间的维度,可以理解为卷积核(滤波器)的个数
kernel_size
:单个整数或元组/列表,指定1D(一维,一行或者一列)卷积窗口的长度。- strides:单个整数或元组/列表,指定卷积的步长,默认为1
- padding:"SAME" or "VALID" (不区分大小写)是否用0填充, [li] SAME用0填充;
- VALID不使用0填充,舍去不匹配的多余项。
-
[li]
channels_last:对应于形状的输入(batch, length, channels)
返回值:
一维卷积后的张量
例子
import tensorflow as tf x = tf.get_variable(name="x", shape=[32, 512, 1024], initializer=tf.zeros_initializer) x = tf.layers.conv1d( x, filters=1, # 输出的第三个通道是1 kernel_size=512, # 不用管它是多大,都不影响输出的shape strides=1, padding='same', data_format='channels_last', dilation_rate=1, use_bias=True, bias_initializer=tf.zeros_initializer()) print(x) # Tensor("conv1d/BiasAdd:0", shape=(32, 512, 1), dtype=float32)
解析:
- 输入数据的维度为[batch, data_length, data_width]=[32, 512, 1024],一般输入数据input第一维为batch_size,此处为32,意味着有32个样本,第二维度和第三维度分别表示输入的长和宽(512,1024)
- 一维卷积核是二维的,也有长和宽,长为卷积核的数量kernel_size=512,因为卷积核的数量只有一个,所以宽为输入数据的宽度data_width=1024,所以一维卷积核的shape为[512,1024]
- filteres是卷积核的个数,即输出数据的第三维度。filteres=1,第三维度为1
- 所以卷积后的输出数据大小为[32, 512, 1]
二维卷积:tf.layers.conv2d()
tf.layers.conv2d( inputs, filters, kernel_size, strides=(1, 1), padding='valid', data_format='channels_last', dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer=None, bias_initializer=tf.zeros_initializer(), kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, trainable=True, name=None, reuse=None )
参数:[4]
inputs
:张量输入。一般是[batch, width, length]filters
:整数,输出空间的维度,可以理解为卷积核(滤波器)的个数kernel_size
:2个整数或元组/列表,指定2D卷积窗口的高度和宽度。可以是单个整数,以指定所有空间维度的相同值。strides
:2个整数或元组/列表,指定卷积沿高度和宽度方向的步幅。可以是单个整数,以指定所有空间维度的相同值。- padding:"SAME" or "VALID" (不区分大小写)是否用0填充, [li] SAME用0填充;
- VALID不使用0填充,舍去不匹配的多余项。
data_format:字符串,"
channels_last"(默认)或"
channels_first"。输入中维度的排序。
-
[li]
channels_last:对应于具有形状的输入,
(batch, height, width, channels)
channels_first:对应于具有形状的输入
(batch, channels, height, width)
activation:激活函数
use_bias:Boolean, 该层是否使用偏差项
kernel_initializer:卷积核的初始化
bias_initializer: 偏置向量的初始化。如果为None,将使用默认初始值设定项
kernel_regularizer:卷积核的正则化项
bias_regularizer: 偏置矢量的正则化项
activity_regularizer:输出的正则化函数
trainable:Boolean,如果
True,将变量添加到图collection中
name:图层的name
reuse:Boolean,是否使用相同名称重用前一层的权重
返回:
二维卷积后的张量
例子:
import tensorflow as tf x = tf.get_variable(name="x", shape=[1, 3, 3, 5], initializer=tf.zeros_initializer) x = tf.layers.conv2d( x, filters=1, # 结果的第三个通道是1 kernel_size=[1, 1], # 不用管它是多大,都不影响输出的shape strides=[1, 1], padding='same', data_format='channels_last', use_bias=True, bias_initializer=tf.zeros_initializer()) print(x) # shape=(1, 3, 3, 1)
解析:
- input输入是1张 3*3 大小的图片,图像通道数是5,输入shape=(batch, data_length, data_width, data_channel)
- kernel_size卷积核shape是 1*1,数量filters是1strides步长是[1,1],第一维和第二维分别为长度方向和宽度方向的步长 = 1。
- 最后输出的shape为[1,3,3,1] 的张量,即得到一个3*3的feature map(batch,长,宽,输出通道数)
- 长和宽只和strides有关,最后一个维度 = filters。
卷积层中的输出大小计算
设输入图片大小W,Filter大小F,步长为S,padding为P,输出图片的大小为N:
$$N=\frac{W-F+2P}{S}+1$$
向下取整后再加1。
在Tensoflow中,Padding有2个选型,'SAME'和'VALID' ,下面举例说明差别:
如果 Padding='SAME',输出尺寸为: W / S(向上取整)
import tensorflow as tf input_image = tf.get_variable(shape=[64, 32, 32, 3], dtype=tf.float32, name="input", initializer=tf.zeros_initializer) conv0 = tf.layers.conv2d(input_image, 64, kernel_size=[3, 3], strides=[2, 2], padding='same') # 32/2=16 conv1 = tf.layers.conv2d(input_image, 64, kernel_size=[5, 5], strides=[2, 2], padding='same') # kernel_szie不影响输出尺寸 print(conv0) # shape=(64, 16, 16, 64) print(conv1) # shape=(64, 16, 16, 64)
如果 Padding='VALID',输出尺寸为:(W - F + 1) / S
import tensorflow as tf input_image = tf.get_variable(shape=[64, 32, 32, 3], dtype=tf.float32, name="input", initializer=tf.zeros_initializer) conv0 = tf.layers.conv2d(input_image, 64, kernel_size=[3, 3], strides=[2, 2], padding='valid') # (32-3+1)/2=15 conv1 = tf.layers.conv2d(input_image, 64, kernel_size=[5, 5], strides=[2, 2], padding='valid') # (32-5+1)/2=14 print(conv0) # shape=(64, 15, 15, 64) print(conv1) # shape=(64, 14, 14, 64)
参考文献:
[1] tensorflow官方API tf.layers.conv1d
[2] tf.layers.conv1d函数解析(一维卷积)
[3] tf.layer.conv1d、conv2d、conv3d
[4] tensorflow官方API tf.layers.conv2d
相关文章推荐
- 深度学习与自然语言处理之四:卷积神经网络模型(CNN)
- 深度学习与自然语言处理之四:卷积神经网络模型(CNN)
- 吴恩达深度学习课程笔记之卷积神经网络基本操作详解
- 利用keras搭建神经卷积网络(CNN)
- CNN学习笔记(一)卷积神经网络基础知识
- 卷积神经网络模型(CNN)
- CNN 理解神经网络中卷积(大小,通道数,深度)
- 使用神经网络-垃圾邮件检测-LSTM或者CNN(一维卷积)效果都不错【代码有问题,pass】
- CNN学习笔记(二)卷积神经网络经典结构
- 深度学习与自然语言处理之四:卷积神经网络模型(CNN)
- cnn神经网络卷积层可视化
- tensorflow-简单CNN(卷积深度神经网络结构)
- 深度学习与自然语言处理之四:卷积神经网络模型(CNN)
- 【论文学习】神经光流网络——用卷积网络实现光流预测(FlowNet: Learning Optical Flow with Convolutional Networks)
- 详解神经网络算法所需最基础数据结构Tensor及其相关操作
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
- 深度学习算法之卷积神经网络简介
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
- 典型卷积神经网络结构总结
- 深度卷积网络CNN与图像语义分割