为什么为卷积神经网络给出张量维度? - TensorFlow

2024-02-28

我在理解使用 TensorFlow 设置卷积神经网络时使用的张量的维度时遇到了一些困难。例如,在this https://www.tensorflow.org/versions/r0.11/tutorials/mnist/pros/index.html#build-a-multilayer-convolutional-network教程中,28x28 MNIST 图像表示如下:

import TensorFlow as tf

x = tf.placeholder(tf.float32, shape=[None, 784])
x_image = tf.reshape(x, [-1,28,28,1])   

假设我有十个训练图像,上面的重塑使我的输入x_image二十八个 28 维列向量的十个子集合的集合。

使用起来似乎更自然

x_image_natural = tf.reshape(x, [-1,28,28])  

相反,它将返回 10 个 28x28 矩阵。

插图:

a = np.array(range(8))
opt1 = a.reshape(-1,2,2,1)
opt2 = a.reshape(-1,2,2)
print opt1
print opt2

# opt1 - column vectors
>>[[[[0]
>>[1]]

>>[[2]
>>[3]]]


>>[[[4]
>>[5]]

>>[[6]
>>[7]]]]

# opt2 - matrices
>>[[[0 1]
>>[2 3]]

>>[[4 5]
>>[6 7]]]

同样,是否有一种直观的方法来理解为什么卷积层具有维度(height_of_patch, width_of_patch, num_input_layers, num_output_layers)?转置似乎更直观,因为它最终是补丁大小矩阵的集合。

* EDIT *

我其实很好奇why张量的维度按原样排序。

对于输入 X,我们为什么不使用

x_image = tf.reshape(x, [-1,i,28,28])

这将创建batch_size,i- 大小的 28x28 矩阵数组(其中i是输入层数)?

同样,为什么权重张量的形状不是这样的(num_output_layers, num_input_layers, input_height, input_width)(这似乎更直观,因为它是“补丁矩阵”的集合。)


一层二维卷积的工作方式是通过在输入上滑动二维窗口/过滤器/补丁来计算“特征图”。放入此 MNIST 数据集的上下文中,输入是灰度图像,因此它们的维度为 [height, width, num_channels] ([28, 28, 1])。假设您决定使用 3x3 窗口/滤波器/补丁,这决定了该卷积层权重的前两个维度(height_of_path=3,width_of_path=3)。这样做在高度和宽度维度上滑动的原因是为了共享神经元并保持统计不变性(无论出现在图片中的哪个位置,鸟仍然是鸟),此外,它还带来了一些降低计算量的好处。每个通道/深度都被认为携带独特的信息(在 RGB 通道的情况下,R=255 和 G=255 表示完全不同的东西),我们不想在不同的深度/通道之间共享神经元。因此,卷积层权重的第三维与输入的深度维度相同(MNIST 情况下第一个卷积层中的 num_input_layers=1)。卷积层权重的最后一个维度是用户可以决定的超参数。这个数字决定了这个卷积层之后会产生多少个特征图。并且该值越大,计算成本就越高。

快速总结。对于任何 2D 卷积层,假设它接收维度为以下的输入 X:

X - [批量大小、输入高度、输入宽度、输入深度]

那么该卷积层的权重 w 的维度为:

w - [过滤器高度、过滤器宽度、输入深度、输出深度]

该卷积层输出 y 的维度为:

y - [批量大小、输出高度、输出宽度、输出深度]

通常,人们会设置filter_height=filter_width,并且经常设置filter_height=3,5,7。output_深度是用户可以决定的超参数。 output_height和output_width是根据input_height、input_weight、filter_height、filter_width、滑动选择和填充选择等确定的。

如需了解更多信息,我鼓励您阅读斯坦福 CS231 关于 ConvNet 的笔记 http://cs231n.github.io/convolutional-networks/#conv,我个人觉得解释得很清楚,很有见地。

编辑:维度的顺序

就维度顺序而言,据我所知,它更多的是一种约定,而不是“正确”或“错误”。对于一个示例输入,我认为按照 [高度、宽度、通道/深度] 的顺序对其尺寸进行排序是很直观的。事实上,您可以简单地将具有此维数顺序的样本矩阵粘贴到import matplotlib.pyplot as plt; plt.imhow(sample_matrix)绘制人眼友好的图像。我认为前三个重量尺寸顺序遵循[高度、宽度、深度]的常规顺序。我推测这种一致性使得执行卷积运算变得容易,因为我读到此步骤的常见实现之一是将 3D 张量展平为 2D 并使用下面的矩阵乘法库。我想您可以将维度的顺序更改为您想要的方式,只要正确完成维度的实际计算即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么为卷积神经网络给出张量维度? - TensorFlow 的相关文章

随机推荐

  • Lucene TermQuery 和 QueryParser

    我有 2 个 lucene 查询 1 Term term new Term Properties LUCENE APPARTMENT ADDRESS address Query termQuery new TermQuery term To
  • Flutter showDialog 未在 PopupMenuItem 点击上显示

    我在用着PopupMenuButton在我的应用程序中 我想要showDialog在点击一个PopupMenuItem My PopupMenuItem PopupMenuItem child Text Show dialog onTap
  • setState 方法导致 Reactjs 函数中的结果无限循环

    该代码显示数组中的用户记录 我还创建了一个updateCount 功能对内容显示的用户进行计数 我可以看到计数结果alerted并在控制台中 现在我想显示计数结果 为此 我初始化setState 内的方法updateCount功能 upda
  • PHP 和 Java 中的 SHA256

    我正在将一些 Java 代码移植到 PHP 代码 在Java中我有一个哈希SHA256代码如下 public static String hashSHA256 String input throws NoSuchAlgorithmExcep
  • 从 Action 指令创建 DynamicMethod

    我正在使用 DynamicMethod 并旨在执行以下操作 我有一个 Action 从中可以使用字节形式获取 IL 代码GetILAsByteArray 从这个字节我想创建一个动态方法并执行 这是我正在尝试做的事情的一个例子 class P
  • 在 Windows 10 上使用 nuwen MinGW 的 C++17 文件系统

    我想尝试 C 17 中的新文件系统库 因此尝试复制来自 cppreference com 的 std filesystem current path 示例 https en cppreference com w cpp filesystem
  • PDO 语句会自动转义吗?

    PHP PDO 语句是自动转义的 还是仅准备好的语句 例如 假设 username and password是用户输入 以下代码是否安全 或者是否容易受到注入 dbh new PDO mysql host localhost dbname
  • 在 std::wstring 中查找方法

    我已声明Wstring如下 wstring strID 当我尝试查找出现的子字符串时 如下所示 int index strID find LABS 我收到如下错误 error C2664 unsigned int std basic str
  • 如何在 python 中使用可变宽度高斯函数执行卷积?

    我需要使用高斯执行卷积 但是高斯的宽度需要改变 我不进行传统的信号处理 而是需要根据设备的分辨率获取完美的概率密度函数 PDF 并 涂抹 它 例如 假设我的 PDF 一开始是尖峰 增量函数 我将其建模为非常窄的高斯 经过我的设备运行后 它将
  • Spring中如何只实现CrudRepository的特定方法?

    我在用着CrudRepositoryspring data jpa 只定义一个实体的接口 然后拥有所有标准的 CRUD 方法 而无需显式提供实现 例如 public interface UserRepo extends CrudReposi
  • 批量插入问题

    我在客户端有一个 CSV 文件 我想开发一个 C 应用程序来将数据批量插入到数据库的表中 以尽量减少日志输出 我对是否在客户端使用 ADO NET 调用数据库服务器中的存储过程感到困惑 什么样的代码需要在客户端开发 什么样的代码需要在服务器
  • 如何在快速路线中调用不同的 REST API?

    我有一个使用多种路由创建的express js REST API 我想创建一个路由来调用另一个 REST API 然后返回结果 理想情况下 它应该类似于以下内容 router post CreateTicket cors corsOptio
  • UIImagePickerController - 相机未准备好

    我正在开发一个录制视频的 iPhone 应用程序 我创建一个 UIImagePickerController 将其限制为视频录制 然后以编程方式要求相机启动VideoCapture 不幸的是 当我运行该应用程序时 我在控制台中看到以下内容
  • 为什么我无法使用 python 建立与rabbitMQ的连接?

    我正在学习如何使用rabbitMQ 我正在 MacBook 上运行rabbit MQ 服务器并尝试与 python 客户端连接 我按照安装说明进行操作here http www rabbitmq com install homebrew h
  • DynamoDB - 新放入的项目未反映在扫描中

    我在 DynamoDB 扫描方面遇到问题 我使用以下命令将新项目添加到表中putItem method AmazonClientManager ddb putItem request 但是 当我尝试使用扫描方法进行扫描时 该项目不会出现在结
  • 如果 xmlcharrefreplace 和 backslashreplace 不起作用,我应该如何解码字节(使用 ASCII)而不丢失任何“垃圾”字节?

    我有一个网络资源 它返回给我的数据 根据规范 应该是 ASCII 编码的字符串 但在极少数情况下 我会收到垃圾数据 例如返回一种资源b xd3PS 90AC 而另一个资源 对于相同的键返回b PS 90AC 第一个值包含非 ASCII 字符
  • 将迭代器传递给 any 来执行以提高速度,为什么?

    问题总结如下 是的 我知道some这些答案 我可以向其他人挥手致意 但我真的很想在这里了解实质内容 这到底是个好主意吗 这个是not below 我想知道地图是否真的增加了速度提升 为什么 为什么要将迭代器传递给any http docs
  • 如何使用按钮打开新窗口[重复]

    这个问题在这里已经有答案了 如何打开一个新窗口 允许我从以下代码中选择时间 我尝试使用 connect 函数连接到 windows2 但似乎出现错误 我想通过一个保管箱选择时间 我可以在上午 10 点 上午 11 点等之前选择时间 有谁知道
  • 对大型数据集执行 PCA

    在 CountVectorizer 变为 40 845 X 218 904 一元组 之后 我遇到了一个只有 2 个类和我的训练数据集矩阵大小的文档分类问题 在考虑卦的情况下 它可以达到 40845 X 3 931 789 有没有一种方法可以
  • 为什么为卷积神经网络给出张量维度? - TensorFlow

    我在理解使用 TensorFlow 设置卷积神经网络时使用的张量的维度时遇到了一些困难 例如 在this https www tensorflow org versions r0 11 tutorials mnist pros index