tf.nn.max_pool,tf.nn.conv2d,tf.layers.conv2d输入输出shape总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/junjun150013652/article/details/81282967

通过卷积神经网络训练数据集的时候,卷积层,池化层的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. 必须是以下类型中的一种: halfbfloat16float32float64. 维度顺序根据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>

猜你喜欢

转载自blog.csdn.net/junjun150013652/article/details/81282967