通过卷积神经网络训练数据集的时候,卷积层,池化层的shape出错就会crash,下面总结一下:
tf.nn.conv2d原型:
tf.nn.conv2d(
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
输入参数:
input
: 一个四维的Tensor
. 必须是以下类型中的一种: half
, bfloat16
, float32
, float64
. 维度顺序根据data_format的值进行解释,详细信息请参见下文。
filter
: 必须和input有相同的类型
. 一个四维的Tensor,
shape=[filter_height, filter_width, in_channels, out_channels],这里的in_channels就是input中的in_channels,out_channels就是卷积核的个数
strides
: 长度为4的一维tensor,类型是整数,每维的滑动窗口的步幅。维度顺序由data_format的值确定,有关详细信息,请参见下文
padding
: 一个字符串: "SAME", "VALID"
. "SAME"时,输出宽或高 = ceil(输入宽或高/步幅),"VALID"时,输出宽或高 = ceil((输入宽或高-
filter的宽或高+1)/步幅),
ceil() 为向上取整。
use_cudnn_on_gpu
: 一个可选的 bool类型
.默认是True
.
data_format
: 来自“NHWC”,“NCHW”的可选字符串,默认为“NHWC”,指定输入和输出数据的数据格式。使用默认格式“NHWC”,数据按以下顺序存储:[batch, height, width, channels] 或者,格式可以是“NCHW”,数据存储顺序为:[batch, channels, height, width]
返回值:一个和 input有相同类型的Tensor
.
实例讲解:
#输入为100个数据集,28*28像素,3个通道
input = tf.Variable(tf.random_normal([100,28,28,3]))
#卷积核过滤器尺寸为3*3,输入3个通道,输出10个通道,也就是10个卷积核
filter = tf.Variable(tf.random_normal([3,3,3,10]))
output = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='VALID')
output
打印信息
#输出宽或高 = ceil((输入宽或高-filter的宽或高+1)/步幅) = ceil((28-3+1)/2) = 13
#[batch, height, width, channels]
<tf.Tensor 'Conv2D:0' shape=(100, 13, 13, 10) dtype=float32>
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
)
我们这里只对shape进行说明,和tf.nn.conv2d不同的是filters是一个表示卷积核数量的
整数,而tf.nn.conv2d的filter
是我们已知的卷积核
实例讲解:
#输入为100个数据集,28*28像素,3个通道
input = tf.Variable(tf.random_normal([100,28,28,3]))
#卷积核的尺寸为3*3,步幅为2,卷积核个数为32
output = tf.layers.conv2d(input, filters=32, kernel_size=3,
strides=2, padding="SAME",
activation=tf.nn.relu, name="")
output
打印信息:
#输出宽或高 = ceil(输入宽或高/步幅) = ceil(28/2) = 14
#[batch, height, width, channels]
<tf.Tensor 'conv2d_1/Relu:0' shape=(100, 14, 14, 32) dtype=float32>
tf.nn.max_pool原型:
tf.nn.max_pool(
value,
ksize,
strides,
padding,
data_format='NHWC',
name=None
)
参数:
value
: 由data_format指定格式的四维
Tensor
ksize
: 四个整数组成的列表或者元组,指定每个维度滑动窗口的尺寸
strides
: 4个整数的列表或元组,输入张量的每个维度的滑动窗口的步幅
data_format
: 同tf.nn.conv2dA string. 'NHWC', 'NCHW' and 'NCHW_VECT_C' are supported.
返回值:
data_format指定格式的tensor
实例讲解:
#输入为100个数据集,28*28像素,3个通道
input = tf.Variable(tf.random_normal([100,28,28,3]))
#滑动窗口的尺寸为2*2,步幅为2
pool = tf.nn.max_pool(input, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
pool
打印信息:
#输出宽或高 = ceil(输入宽或高/步幅) = ceil(28/2) = 14
#[batch, height, width, channels]
<tf.Tensor 'MaxPool_3:0' shape=(100, 14, 14, 3) dtype=float32>