Tensorflow卷积网络——维度(形状)是如何计算的?

Posted

技术标签:

【中文标题】Tensorflow卷积网络——维度(形状)是如何计算的?【英文标题】:Tensorflow convolutional network - how the dimension (shape) is calculated? 【发布时间】:2017-03-14 04:28:33 【问题描述】:

我不确定 tensorflow 中的卷积中性网络是如何计算这个tutorial 中的维度的。

    图像有 28*28 像素 (x_image = tf.reshape(x, [-1,28,28,1])) 补丁大小为 5x5 (W_conv1 = weight_variable([5, 5, 1, 32]) 第一个卷积层由:(h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)) 完成 第一层的形状是:h_pool1.get_shape()TensorShape([Dimension(10), Dimension(14), Dimension(14), Dimension(32)])

Q1:为什么第一个维度是10?

Q2:为什么 5x5 的贴片尺寸会缩小到 14x14?如果我有一个 28x28 的图像,并且我对所有像素应用 5x5 补丁,我希望超过 14x14。

Q3-1x_image 的代码中做了什么?

【问题讨论】:

【参考方案1】:

形状是(batch_size、height、width、channel)。

Q1. 10 是您的批量大小。我猜你有这样的一行:

x = tf.placeholder(tf.float32, shape=[10, 784])

虽然在教程中的行是:

x = tf.placeholder(tf.float32, shape=[None, 784])

这样,您将拥有批量大小“Dimension(None)”而不是“Dimension(10)”。

第二季度。 Layer1 包括一个卷积层和一个最大池化层。带有"SAME" padding 的卷积层将输出相同大小的东西。尺寸减小来自带有“SAME”填充的 2x2 最大池,它输出 (h/2, w/2)。

def conv2d(x, W):
   return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
   return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                         strides=[1, 2, 2, 1], padding='SAME')

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)

第三季度。 tf.reshape() with a single dimension "-1" 保留程序自动计算的尺寸,以便总尺寸保持不变。

【讨论】:

以上是关于Tensorflow卷积网络——维度(形状)是如何计算的?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow框架学习 —— CNN卷积神经网络的实现

Tensorflow系列4:卷积神经网络--解决参数过多问题

利用Tensorflow实现卷积神经网络模型

使用自定义维度输入 tensorflow 或 keras 神经网络

预期输入有 4 个维度,但得到的数组具有形状

深度学习--TensorFlow(项目)识别自己的手写数字(基于CNN卷积神经网络)