machine-learning - 神经网络的 4d 输入张量与 1d 输入张量(又名向量)

标签 machine-learning pytorch

在阅读有关机器学习的内容时,我不断看到对“输入向量”或“特征向量”的引用,这是一个保存神经网络输入的一维张量。所以for example a 28x28 grayscale image would be a 784 dimensional vector .

然后我还不断看到对图像的引用是 4 维张量,其尺寸为批处理数、颜色 channel 、高度和宽度。例如,“Francois Chollet 的《使用 Python 进行深度学习》”中是这样描述的。

我想知道,为什么以不同的方式描述它?什么时候会使用其中一个而不是另一个?

最佳答案

有两个主要考虑因素。

首先是由于批处理。由于我们通常希望基于多个训练示例(而不仅仅是一个)的梯度计算来执行每个优化步骤,因此一次对所有训练示例运行计算会很有帮助。因此,许多库中的标准方法是第一维度是批量维度,并且所有操作都独立地应用于沿第一维度的每个子张量。因此,实际代码中的大多数张量至少是二维的:[batch, any_other_dimensions...] 。然而,从神经网络的角度来看,批处理是一个实现细节,因此为了清楚起见,通常会跳过它。您的链接讨论了 784 维向量,在实践中几乎毫无疑问是分批处理的,因此批量大小为 16 的示例张量的大小为 [batch, features] = [16, 784] 。总而言之,我们将第一个维度解释为批处理,然后是 any_other_dimensions...在上面的例子中恰好是一个 features尺寸为784。

然后是 4 维张量,它是在使用卷积神经网络时出现的,而不是完全连接的张量。全连接网络使用全矩阵,这意味着前一层的每个神经元都会对下一层的每个神经元做出贡献。卷积神经网络可以看作是使用特殊结构的稀疏矩阵,其中前一层的每个神经元仅影响下一层的一些神经元,即其位置的某个固定距离内的神经元。因此,卷积强加了一种空间结构,该结构需要反射(reflect)在中间张量中。而不是[batch, features] ,因此我们需要[batch, x, y]反射(reflect)数据的空间结构。最后,在日常实践中,卷积神经网络混合了一些全连接网络:它们具有空间局部化的多个“特征”的概念,从而产生了所谓的“特征图”,并且张量也随之增加至 4d:[batch, feature, x, y] 。每个值tensor_new[b, f, x, x]根据之前的所有值 tensor_previous[b', f', x', x'] 计算得出,受以下约束:

  1. b = b' :我们不混合批处理元素
  2. x'至多距离x有一段距离y' 也类似:我们只使用空间邻域中的值
  3. 全部 f'使用 s:这是“完全连接”的部分。

卷积神经网络比全连接网络更适合视觉任务,而全连接网络对于足够大的图像来说是不可行的(想象一下为 (1024 * 1024) ^ 2 图像存储一个大小为 1024 x 1024px 的全连接矩阵)。 CNN 中的 4d 张量特定于 2d 视觉,您可以在 1d 信号处理中遇到 3d 张量(例如声音):[batch, feature, time] , 3d 体积处理中的 5d [batch, feature, x, y, z]以及其他类型网络中完全不同的布局,既不是全连接也不是卷积。

总结:如果有人告诉您他们正在使用一维向量,那么这是一种简化:几乎可以肯定使用至少两个向量进行批处理。然后,在 2d 计算机视觉的背景下,卷积网络是标准,并且它们带有 4d 张量。在其他场景中,您甚至可能会看到不同的布局和维度。谷歌关键词更多阅读:fully connected neural networks , convolutional neural networks , minibatchingstochastic gradient descend (这两者密切相关)。

关于machine-learning - 神经网络的 4d 输入张量与 1d 输入张量(又名向量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55547943/

相关文章:

python - 期望 FloatTensors,但在类似 MNIST 的任务中得到了 LongTensors

python - 在多个 GPU 上训练单个 pytorch 模型并修复某些层?

python - 为什么检查点中保存的参数与融合模型中的参数不同?

tensorflow - Tensorflow 的 K-Means - 图断开错误

java - 如何在 weka 中表示用于分类的文本?

python - 在 scikit 中绘制 ROC 曲线仅产生 3 分

python - 如何在较低维空间中绘制分类区域?

c# - 使用反向传播训练 ff nn

python - 无法在 Google Colab 中安装 dgl-cu<任何版本>

python - 如何在特定轴上连接张量列表?